From: Andreas Hansson Date: Fri, 24 Feb 2012 16:45:30 +0000 (-0500) Subject: MEM: Make port proxies use references rather than pointers X-Git-Tag: stable_2012_06_28~221 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9e3c8de30bafe33f35e4b9e82fb49418941f8cb7;p=gem5.git MEM: Make port proxies use references rather than pointers This patch is adding a clearer design intent to all objects that would not be complete without a port proxy by making the proxies members rathen than dynamically allocated. In essence, if NULL would not be a valid value for the proxy, then we avoid using a pointer to make this clear. The same approach is used for the methods using these proxies, such as loadSections, that now use references rather than pointers to better reflect the fact that NULL would not be an acceptable value (in fact the code would break and that is how this patch started out). Overall the concept of "using a reference to express unconditional composition where a NULL pointer is never valid" could be done on a much broader scale throughout the code base, but for now it is only done in the locations affected by the proxies. --- diff --git a/src/arch/alpha/freebsd/system.cc b/src/arch/alpha/freebsd/system.cc index 81aea8696..303d5f762 100644 --- a/src/arch/alpha/freebsd/system.cc +++ b/src/arch/alpha/freebsd/system.cc @@ -76,8 +76,8 @@ FreebsdAlphaSystem::doCalibrateClocks(ThreadContext *tc) ppc_vaddr = (Addr)tc->readIntReg(17); timer_vaddr = (Addr)tc->readIntReg(18); - virtProxy->write(ppc_vaddr, (uint32_t)SimClock::Frequency); - virtProxy->write(timer_vaddr, (uint32_t)TIMER_FREQUENCY); + virtProxy.write(ppc_vaddr, (uint32_t)SimClock::Frequency); + virtProxy.write(timer_vaddr, (uint32_t)TIMER_FREQUENCY); } void diff --git a/src/arch/alpha/linux/system.cc b/src/arch/alpha/linux/system.cc index 6f3cf6b32..e42553b63 100644 --- a/src/arch/alpha/linux/system.cc +++ b/src/arch/alpha/linux/system.cc @@ -88,9 +88,9 @@ LinuxAlphaSystem::initState() * Since we aren't using a bootloader, we have to copy the * kernel arguments directly into the kernel's memory. */ - virtProxy->writeBlob(CommandLine(), - (uint8_t*)params()->boot_osflags.c_str(), - params()->boot_osflags.length()+1); + virtProxy.writeBlob(CommandLine(), + (uint8_t*)params()->boot_osflags.c_str(), + params()->boot_osflags.length()+1); /** * find the address of the est_cycle_freq variable and insert it @@ -98,8 +98,8 @@ LinuxAlphaSystem::initState() * calculated it by using the PIT, RTC, etc. */ if (kernelSymtab->findAddress("est_cycle_freq", addr)) - virtProxy->write(addr, (uint64_t)(SimClock::Frequency / - params()->boot_cpu_frequency)); + virtProxy.write(addr, (uint64_t)(SimClock::Frequency / + params()->boot_cpu_frequency)); /** @@ -109,7 +109,7 @@ LinuxAlphaSystem::initState() * 255 ASNs. */ if (kernelSymtab->findAddress("dp264_mv", addr)) - virtProxy->write(addr + 0x18, LittleEndianGuest::htog((uint32_t)127)); + virtProxy.write(addr + 0x18, LittleEndianGuest::htog((uint32_t)127)); else panic("could not find dp264_mv\n"); @@ -176,10 +176,8 @@ LinuxAlphaSystem::setDelayLoop(ThreadContext *tc) if (kernelSymtab->findAddress("loops_per_jiffy", addr)) { Tick cpuFreq = tc->getCpuPtr()->frequency(); assert(intrFreq); - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); - vp->writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988)); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + vp.writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988)); } } diff --git a/src/arch/alpha/linux/threadinfo.hh b/src/arch/alpha/linux/threadinfo.hh index 262da9007..94e362fe7 100644 --- a/src/arch/alpha/linux/threadinfo.hh +++ b/src/arch/alpha/linux/threadinfo.hh @@ -78,8 +78,8 @@ class ThreadInfo if (!addr) addr = tc->readMiscRegNoEffect(AlphaISA::IPR_PALtemp23); - PortProxy* p = tc->getPhysProxy(); - p->readBlob(addr, (uint8_t *)&sp, sizeof(Addr)); + PortProxy &p = tc->getPhysProxy(); + p.readBlob(addr, (uint8_t *)&sp, sizeof(Addr)); return sp & ~ULL(0x3fff); } diff --git a/src/arch/alpha/process.cc b/src/arch/alpha/process.cc index 4a3079264..07208fb29 100644 --- a/src/arch/alpha/process.cc +++ b/src/arch/alpha/process.cc @@ -144,16 +144,16 @@ AlphaLiveProcess::argsInit(int intSize, int pageSize) else panic("Unknown int size"); - initVirtMem->writeBlob(stack_min, (uint8_t*)&argc, intSize); + initVirtMem.writeBlob(stack_min, (uint8_t*)&argc, intSize); copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem); copyStringArray(envp, envp_array_base, env_data_base, initVirtMem); //Copy the aux stuff for (vector::size_type x = 0; x < auxv.size(); x++) { - initVirtMem->writeBlob(auxv_array_base + x * 2 * intSize, + initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize, (uint8_t*)&(auxv[x].a_type), intSize); - initVirtMem->writeBlob(auxv_array_base + (x * 2 + 1) * intSize, + initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize, (uint8_t*)&(auxv[x].a_val), intSize); } diff --git a/src/arch/alpha/stacktrace.cc b/src/arch/alpha/stacktrace.cc index e83827630..7c23489a3 100644 --- a/src/arch/alpha/stacktrace.cc +++ b/src/arch/alpha/stacktrace.cc @@ -48,28 +48,28 @@ ProcessInfo::ProcessInfo(ThreadContext *_tc) : tc(_tc) { Addr addr = 0; - FSTranslatingPortProxy* vp = tc->getVirtProxy(); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab; if (!symtab->findAddress("thread_info_size", addr)) panic("thread info not compiled into kernel\n"); - thread_info_size = vp->readGtoH(addr); + thread_info_size = vp.readGtoH(addr); if (!symtab->findAddress("task_struct_size", addr)) panic("thread info not compiled into kernel\n"); - task_struct_size = vp->readGtoH(addr); + task_struct_size = vp.readGtoH(addr); if (!symtab->findAddress("thread_info_task", addr)) panic("thread info not compiled into kernel\n"); - task_off = vp->readGtoH(addr); + task_off = vp.readGtoH(addr); if (!symtab->findAddress("task_struct_pid", addr)) panic("thread info not compiled into kernel\n"); - pid_off = vp->readGtoH(addr); + pid_off = vp.readGtoH(addr); if (!symtab->findAddress("task_struct_comm", addr)) panic("thread info not compiled into kernel\n"); - name_off = vp->readGtoH(addr); + name_off = vp.readGtoH(addr); } Addr @@ -81,10 +81,8 @@ ProcessInfo::task(Addr ksp) const Addr tsk; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); - tsk = vp->readGtoH(base + task_off); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + tsk = vp.readGtoH(base + task_off); return tsk; } @@ -98,10 +96,8 @@ ProcessInfo::pid(Addr ksp) const uint16_t pd; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); - pd = vp->readGtoH(task + pid_off); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + pd = vp.readGtoH(task + pid_off); return pd; } diff --git a/src/arch/alpha/system.cc b/src/arch/alpha/system.cc index 656ab4d6f..8d6629169 100644 --- a/src/arch/alpha/system.cc +++ b/src/arch/alpha/system.cc @@ -119,8 +119,8 @@ AlphaSystem::initState() * others do.) */ if (consoleSymtab->findAddress("env_booted_osflags", addr)) { - virtProxy->writeBlob(addr, (uint8_t*)params()->boot_osflags.c_str(), - strlen(params()->boot_osflags.c_str())); + virtProxy.writeBlob(addr, (uint8_t*)params()->boot_osflags.c_str(), + strlen(params()->boot_osflags.c_str())); } /** @@ -130,9 +130,9 @@ AlphaSystem::initState() if (consoleSymtab->findAddress("m5_rpb", addr)) { uint64_t data; data = htog(params()->system_type); - virtProxy->write(addr+0x50, data); + virtProxy.write(addr+0x50, data); data = htog(params()->system_rev); - virtProxy->write(addr+0x58, data); + virtProxy.write(addr+0x58, data); } else panic("could not find hwrpb\n"); } @@ -178,8 +178,8 @@ AlphaSystem::fixFuncEventAddr(Addr addr) // lda gp,Y(gp): opcode 8, Ra = 29, rb = 29 const uint32_t gp_lda_pattern = (8 << 26) | (29 << 21) | (29 << 16); - uint32_t i1 = virtProxy->read(addr); - uint32_t i2 = virtProxy->read(addr + sizeof(MachInst)); + uint32_t i1 = virtProxy.read(addr); + uint32_t i2 = virtProxy.read(addr + sizeof(MachInst)); if ((i1 & inst_mask) == gp_ldah_pattern && (i2 & inst_mask) == gp_lda_pattern) { @@ -196,7 +196,7 @@ AlphaSystem::setAlphaAccess(Addr access) { Addr addr = 0; if (consoleSymtab->findAddress("m5AlphaAccess", addr)) { - virtProxy->write(addr, htog(Phys2K0Seg(access))); + virtProxy.write(addr, htog(Phys2K0Seg(access))); } else { panic("could not find m5AlphaAccess\n"); } diff --git a/src/arch/alpha/tru64/system.cc b/src/arch/alpha/tru64/system.cc index 13cc93247..cb4b8dd56 100644 --- a/src/arch/alpha/tru64/system.cc +++ b/src/arch/alpha/tru64/system.cc @@ -47,7 +47,7 @@ Tru64AlphaSystem::Tru64AlphaSystem(Tru64AlphaSystem::Params *p) { Addr addr = 0; if (kernelSymtab->findAddress("enable_async_printf", addr)) { - virtProxy->write(addr, (uint32_t)0); + virtProxy.write(addr, (uint32_t)0); } #ifdef DEBUG diff --git a/src/arch/alpha/utility.cc b/src/arch/alpha/utility.cc index 1bac650a0..32fc0b141 100644 --- a/src/arch/alpha/utility.cc +++ b/src/arch/alpha/utility.cc @@ -52,9 +52,10 @@ getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp) return tc->readIntReg(16 + number); } else { Addr sp = tc->readIntReg(StackPointerReg); - FSTranslatingPortProxy* vp = tc->getVirtProxy(); - uint64_t arg = vp->read(sp + - (number-NumArgumentRegs) * sizeof(uint64_t)); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + uint64_t arg = vp.read(sp + + (number-NumArgumentRegs) * + sizeof(uint64_t)); return arg; } } diff --git a/src/arch/alpha/vtophys.cc b/src/arch/alpha/vtophys.cc index 453c48444..8ca23fce2 100644 --- a/src/arch/alpha/vtophys.cc +++ b/src/arch/alpha/vtophys.cc @@ -45,24 +45,24 @@ using namespace std; namespace AlphaISA { PageTableEntry -kernel_pte_lookup(PortProxy* mem, Addr ptbr, VAddr vaddr) +kernel_pte_lookup(PortProxy &mem, Addr ptbr, VAddr vaddr) { Addr level1_pte = ptbr + vaddr.level1(); - PageTableEntry level1 = mem->read(level1_pte); + PageTableEntry level1 = mem.read(level1_pte); if (!level1.valid()) { DPRINTF(VtoPhys, "level 1 PTE not valid, va = %#\n", vaddr); return 0; } Addr level2_pte = level1.paddr() + vaddr.level2(); - PageTableEntry level2 = mem->read(level2_pte); + PageTableEntry level2 = mem.read(level2_pte); if (!level2.valid()) { DPRINTF(VtoPhys, "level 2 PTE not valid, va = %#x\n", vaddr); return 0; } Addr level3_pte = level2.paddr() + vaddr.level3(); - PageTableEntry level3 = mem->read(level3_pte); + PageTableEntry level3 = mem.read(level3_pte); if (!level3.valid()) { DPRINTF(VtoPhys, "level 3 PTE not valid, va = %#x\n", vaddr); return 0; diff --git a/src/arch/alpha/vtophys.hh b/src/arch/alpha/vtophys.hh index 1695676cb..8613e8e77 100644 --- a/src/arch/alpha/vtophys.hh +++ b/src/arch/alpha/vtophys.hh @@ -41,7 +41,7 @@ class PortProxy; namespace AlphaISA { -PageTableEntry kernel_pte_lookup(PortProxy* mem, Addr ptbr, +PageTableEntry kernel_pte_lookup(PortProxy &mem, Addr ptbr, VAddr vaddr); Addr vtophys(Addr vaddr); diff --git a/src/arch/arm/linux/process.cc b/src/arch/arm/linux/process.cc index 1074b0362..fcf00c84e 100644 --- a/src/arch/arm/linux/process.cc +++ b/src/arch/arm/linux/process.cc @@ -452,7 +452,7 @@ setTLSFunc(SyscallDesc *desc, int callnum, LiveProcess *process, int index = 0; uint32_t tlsPtr = process->getSyscallArg(tc, index); - tc->getMemProxy()->writeBlob(ArmLinuxProcess::commPage + 0x0ff0, + tc->getMemProxy().writeBlob(ArmLinuxProcess::commPage + 0x0ff0, (uint8_t *)&tlsPtr, sizeof(tlsPtr)); tc->setMiscReg(MISCREG_TPIDRURO,tlsPtr); return 0; @@ -512,7 +512,7 @@ ArmLinuxProcess::initState() // Fill this page with swi -1 so we'll no if we land in it somewhere. for (Addr addr = 0; addr < PageBytes; addr += sizeof(swiNeg1)) { - tc->getMemProxy()->writeBlob(commPage + addr, + tc->getMemProxy().writeBlob(commPage + addr, swiNeg1, sizeof(swiNeg1)); } @@ -521,7 +521,7 @@ ArmLinuxProcess::initState() 0x5f, 0xf0, 0x7f, 0xf5, // dmb 0x0e, 0xf0, 0xa0, 0xe1 // return }; - tc->getMemProxy()->writeBlob(commPage + 0x0fa0, memory_barrier, + tc->getMemProxy().writeBlob(commPage + 0x0fa0, memory_barrier, sizeof(memory_barrier)); uint8_t cmpxchg[] = @@ -535,7 +535,7 @@ ArmLinuxProcess::initState() 0x5f, 0xf0, 0x7f, 0xf5, // dmb 0x0e, 0xf0, 0xa0, 0xe1 // return }; - tc->getMemProxy()->writeBlob(commPage + 0x0fc0, cmpxchg, sizeof(cmpxchg)); + tc->getMemProxy().writeBlob(commPage + 0x0fc0, cmpxchg, sizeof(cmpxchg)); uint8_t get_tls[] = { @@ -543,7 +543,7 @@ ArmLinuxProcess::initState() 0x70, 0x0f, 0x1d, 0xee, // mrc p15, 0, r0, c13, c0, 3 0x0e, 0xf0, 0xa0, 0xe1 // return }; - tc->getMemProxy()->writeBlob(commPage + 0x0fe0, get_tls, sizeof(get_tls)); + tc->getMemProxy().writeBlob(commPage + 0x0fe0, get_tls, sizeof(get_tls)); } ArmISA::IntReg diff --git a/src/arch/arm/linux/system.cc b/src/arch/arm/linux/system.cc index a764edaca..a2d0c156c 100644 --- a/src/arch/arm/linux/system.cc +++ b/src/arch/arm/linux/system.cc @@ -114,7 +114,7 @@ LinuxArmSystem::initState() DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2); DDUMP(Loader, boot_data, size << 2); - physProxy->writeBlob(ParamsList, boot_data, size << 2); + physProxy.writeBlob(ParamsList, boot_data, size << 2); #ifndef NDEBUG kernelPanicEvent = addKernelFuncEvent("panic"); diff --git a/src/arch/arm/process.cc b/src/arch/arm/process.cc index c149f5409..37999c905 100644 --- a/src/arch/arm/process.cc +++ b/src/arch/arm/process.cc @@ -284,17 +284,17 @@ ArmLiveProcess::argsInit(int intSize, int pageSize) //Write out the sentry void * uint32_t sentry_NULL = 0; - initVirtMem->writeBlob(sentry_base, + initVirtMem.writeBlob(sentry_base, (uint8_t*)&sentry_NULL, sentry_size); //Fix up the aux vectors which point to other data for (int i = auxv.size() - 1; i >= 0; i--) { if (auxv[i].a_type == M5_AT_PLATFORM) { auxv[i].a_val = platform_base; - initVirtMem->writeString(platform_base, platform.c_str()); + initVirtMem.writeString(platform_base, platform.c_str()); } else if (auxv[i].a_type == M5_AT_EXECFN) { auxv[i].a_val = aux_data_base; - initVirtMem->writeString(aux_data_base, filename.c_str()); + initVirtMem.writeString(aux_data_base, filename.c_str()); } else if (auxv[i].a_type == M5_AT_RANDOM) { auxv[i].a_val = aux_random_base; // Just leave the value 0, we don't want randomness @@ -304,20 +304,20 @@ ArmLiveProcess::argsInit(int intSize, int pageSize) //Copy the aux stuff for(int x = 0; x < auxv.size(); x++) { - initVirtMem->writeBlob(auxv_array_base + x * 2 * intSize, + initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize, (uint8_t*)&(auxv[x].a_type), intSize); - initVirtMem->writeBlob(auxv_array_base + (x * 2 + 1) * intSize, + initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize, (uint8_t*)&(auxv[x].a_val), intSize); } //Write out the terminating zeroed auxilliary vector const uint64_t zero = 0; - initVirtMem->writeBlob(auxv_array_base + 2 * intSize * auxv.size(), + initVirtMem.writeBlob(auxv_array_base + 2 * intSize * auxv.size(), (uint8_t*)&zero, 2 * intSize); copyStringArray(envp, envp_array_base, env_data_base, initVirtMem); copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem); - initVirtMem->writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); + initVirtMem.writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); ThreadContext *tc = system->getThreadContext(contextIds[0]); //Set the stack pointer register diff --git a/src/arch/arm/stacktrace.cc b/src/arch/arm/stacktrace.cc index 69d0f354c..99ebcd7c5 100644 --- a/src/arch/arm/stacktrace.cc +++ b/src/arch/arm/stacktrace.cc @@ -48,29 +48,27 @@ namespace ArmISA { Addr addr = 0; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr)) panic("thread info not compiled into kernel\n"); - thread_info_size = vp->readGtoH(addr); + thread_info_size = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr)) panic("thread info not compiled into kernel\n"); - task_struct_size = vp->readGtoH(addr); + task_struct_size = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr)) panic("thread info not compiled into kernel\n"); - task_off = vp->readGtoH(addr); + task_off = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr)) panic("thread info not compiled into kernel\n"); - pid_off = vp->readGtoH(addr); + pid_off = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr)) panic("thread info not compiled into kernel\n"); - name_off = vp->readGtoH(addr); + name_off = vp.readGtoH(addr); } Addr diff --git a/src/arch/arm/system.cc b/src/arch/arm/system.cc index ca5bfc471..c26be6026 100644 --- a/src/arch/arm/system.cc +++ b/src/arch/arm/system.cc @@ -85,7 +85,7 @@ ArmSystem::initState() { 0x07, 0xf0, 0xa0, 0xe1 // branch to r7 }; - physProxy->writeBlob(0x0, jump_to_bl, sizeof(jump_to_bl)); + physProxy.writeBlob(0x0, jump_to_bl, sizeof(jump_to_bl)); inform("Using bootloader at address %#x\n", bootldr->entryPoint()); } diff --git a/src/arch/arm/utility.cc b/src/arch/arm/utility.cc index 0527e135f..0a1cefce7 100644 --- a/src/arch/arm/utility.cc +++ b/src/arch/arm/utility.cc @@ -91,18 +91,18 @@ getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp) } } else { Addr sp = tc->readIntReg(StackPointerReg); - FSTranslatingPortProxy* vp = tc->getVirtProxy(); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); uint64_t arg; if (size == sizeof(uint64_t)) { // If the argument is even it must be aligned if ((number % 2) != 0) number++; - arg = vp->read(sp + + arg = vp.read(sp + (number-NumArgumentRegs) * sizeof(uint32_t)); // since two 32 bit args == 1 64 bit arg, increment number number++; } else { - arg = vp->read(sp + + arg = vp.read(sp + (number-NumArgumentRegs) * sizeof(uint32_t)); } return arg; diff --git a/src/arch/arm/vtophys.cc b/src/arch/arm/vtophys.cc index 45e6f1849..7c26962cb 100644 --- a/src/arch/arm/vtophys.cc +++ b/src/arch/arm/vtophys.cc @@ -101,11 +101,11 @@ ArmISA::vtophys(ThreadContext *tc, Addr addr) N = 0; } - PortProxy* port = tc->getPhysProxy(); + PortProxy &port = tc->getPhysProxy(); Addr l1desc_addr = mbits(ttbr, 31, 14-N) | (bits(addr,31-N,20) << 2); TableWalker::L1Descriptor l1desc; - l1desc.data = port->read(l1desc_addr); + l1desc.data = port.read(l1desc_addr); if (l1desc.type() == TableWalker::L1Descriptor::Ignore || l1desc.type() == TableWalker::L1Descriptor::Reserved) { warn("Unable to translate virtual address: %#x\n", addr); @@ -117,7 +117,7 @@ ArmISA::vtophys(ThreadContext *tc, Addr addr) // Didn't find it at the first level, try againt Addr l2desc_addr = l1desc.l2Addr() | (bits(addr, 19, 12) << 2); TableWalker::L2Descriptor l2desc; - l2desc.data = port->read(l2desc_addr); + l2desc.data = port.read(l2desc_addr); if (l2desc.invalid()) { warn("Unable to translate virtual address: %#x\n", addr); diff --git a/src/arch/mips/linux/threadinfo.hh b/src/arch/mips/linux/threadinfo.hh index 40dd435d6..5788b3b43 100644 --- a/src/arch/mips/linux/threadinfo.hh +++ b/src/arch/mips/linux/threadinfo.hh @@ -79,8 +79,8 @@ class ThreadInfo if (!addr) addr = tc->readMiscRegNoEffect(0/*MipsISA::IPR_PALtemp23*/); - PortProxy* p = tc->getPhysProxy(); - p->readBlob(addr, (uint8_t *)&sp, sizeof(Addr)); + PortProxy &p = tc->getPhysProxy(); + p.readBlob(addr, (uint8_t *)&sp, sizeof(Addr)); return sp & ~ULL(0x3fff); } diff --git a/src/arch/mips/process.cc b/src/arch/mips/process.cc index 5643ff18a..4ed9a7b39 100644 --- a/src/arch/mips/process.cc +++ b/src/arch/mips/process.cc @@ -150,7 +150,7 @@ MipsLiveProcess::argsInit(int pageSize) argc = htog((IntType)argc); - initVirtMem->writeBlob(stack_min, (uint8_t*)&argc, intSize); + initVirtMem.writeBlob(stack_min, (uint8_t*)&argc, intSize); copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem); @@ -158,9 +158,9 @@ MipsLiveProcess::argsInit(int pageSize) // Copy the aux vector for (typename vector::size_type x = 0; x < auxv.size(); x++) { - initVirtMem->writeBlob(auxv_array_base + x * 2 * intSize, + initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize, (uint8_t*)&(auxv[x].a_type), intSize); - initVirtMem->writeBlob(auxv_array_base + (x * 2 + 1) * intSize, + initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize, (uint8_t*)&(auxv[x].a_val), intSize); } @@ -168,7 +168,7 @@ MipsLiveProcess::argsInit(int pageSize) for (unsigned i = 0; i < 2; i++) { const IntType zero = 0; const Addr addr = auxv_array_base + 2 * intSize * (auxv.size() + i); - initVirtMem->writeBlob(addr, (uint8_t*)&zero, intSize); + initVirtMem.writeBlob(addr, (uint8_t*)&zero, intSize); } ThreadContext *tc = system->getThreadContext(contextIds[0]); diff --git a/src/arch/mips/stacktrace.cc b/src/arch/mips/stacktrace.cc index d4548b4bb..bb761a243 100644 --- a/src/arch/mips/stacktrace.cc +++ b/src/arch/mips/stacktrace.cc @@ -55,10 +55,8 @@ ProcessInfo::task(Addr ksp) const Addr tsk; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); - tsk = vp->readGtoH(base + task_off); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + tsk = vp.readGtoH(base + task_off); return tsk; } @@ -72,10 +70,8 @@ ProcessInfo::pid(Addr ksp) const uint16_t pd; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); - pd = vp->readGtoH(task + pid_off); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + pd = vp.readGtoH(task + pid_off); return pd; } diff --git a/src/arch/power/process.cc b/src/arch/power/process.cc index 4a5c06673..3c5d1e8b4 100644 --- a/src/arch/power/process.cc +++ b/src/arch/power/process.cc @@ -218,37 +218,37 @@ PowerLiveProcess::argsInit(int intSize, int pageSize) //Write out the sentry void * uint32_t sentry_NULL = 0; - initVirtMem->writeBlob(sentry_base, + initVirtMem.writeBlob(sentry_base, (uint8_t*)&sentry_NULL, sentry_size); //Fix up the aux vectors which point to other data for (int i = auxv.size() - 1; i >= 0; i--) { if (auxv[i].a_type == M5_AT_PLATFORM) { auxv[i].a_val = platform_base; - initVirtMem->writeString(platform_base, platform.c_str()); + initVirtMem.writeString(platform_base, platform.c_str()); } else if (auxv[i].a_type == M5_AT_EXECFN) { auxv[i].a_val = aux_data_base; - initVirtMem->writeString(aux_data_base, filename.c_str()); + initVirtMem.writeString(aux_data_base, filename.c_str()); } } //Copy the aux stuff for (int x = 0; x < auxv.size(); x++) { - initVirtMem->writeBlob(auxv_array_base + x * 2 * intSize, + initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize, (uint8_t*)&(auxv[x].a_type), intSize); - initVirtMem->writeBlob(auxv_array_base + (x * 2 + 1) * intSize, + initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize, (uint8_t*)&(auxv[x].a_val), intSize); } //Write out the terminating zeroed auxilliary vector const uint64_t zero = 0; - initVirtMem->writeBlob(auxv_array_base + 2 * intSize * auxv.size(), + initVirtMem.writeBlob(auxv_array_base + 2 * intSize * auxv.size(), (uint8_t*)&zero, 2 * intSize); copyStringArray(envp, envp_array_base, env_data_base, initVirtMem); copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem); - initVirtMem->writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); + initVirtMem.writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); ThreadContext *tc = system->getThreadContext(contextIds[0]); diff --git a/src/arch/sparc/process.cc b/src/arch/sparc/process.cc index 769f15497..9377fe7d0 100644 --- a/src/arch/sparc/process.cc +++ b/src/arch/sparc/process.cc @@ -359,31 +359,31 @@ SparcLiveProcess::argsInit(int pageSize) // Write out the sentry void * uint64_t sentry_NULL = 0; - initVirtMem->writeBlob(sentry_base, + initVirtMem.writeBlob(sentry_base, (uint8_t*)&sentry_NULL, sentry_size); // Write the file name - initVirtMem->writeString(file_name_base, filename.c_str()); + initVirtMem.writeString(file_name_base, filename.c_str()); // Copy the aux stuff for (int x = 0; x < auxv.size(); x++) { - initVirtMem->writeBlob(auxv_array_base + x * 2 * intSize, + initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize, (uint8_t*)&(auxv[x].a_type), intSize); - initVirtMem->writeBlob(auxv_array_base + (x * 2 + 1) * intSize, + initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize, (uint8_t*)&(auxv[x].a_val), intSize); } // Write out the terminating zeroed auxilliary vector const IntType zero = 0; - initVirtMem->writeBlob(auxv_array_base + intSize * 2 * auxv.size(), + initVirtMem.writeBlob(auxv_array_base + intSize * 2 * auxv.size(), (uint8_t*)&zero, intSize); - initVirtMem->writeBlob(auxv_array_base + intSize * (2 * auxv.size() + 1), + initVirtMem.writeBlob(auxv_array_base + intSize * (2 * auxv.size() + 1), (uint8_t*)&zero, intSize); copyStringArray(envp, envp_array_base, env_data_base, initVirtMem); copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem); - initVirtMem->writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); + initVirtMem.writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); // Set up space for the trap handlers into the processes address space. // Since the stack grows down and there is reserved address space abov @@ -416,9 +416,9 @@ Sparc64LiveProcess::argsInit(int intSize, int pageSize) SparcLiveProcess::argsInit(pageSize); // Stuff the trap handlers into the process address space - initVirtMem->writeBlob(fillStart, + initVirtMem.writeBlob(fillStart, (uint8_t*)fillHandler64, sizeof(MachInst) * numFillInsts); - initVirtMem->writeBlob(spillStart, + initVirtMem.writeBlob(spillStart, (uint8_t*)spillHandler64, sizeof(MachInst) * numSpillInsts); } @@ -428,9 +428,9 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize) SparcLiveProcess::argsInit(pageSize); // Stuff the trap handlers into the process address space - initVirtMem->writeBlob(fillStart, + initVirtMem.writeBlob(fillStart, (uint8_t*)fillHandler32, sizeof(MachInst) * numFillInsts); - initVirtMem->writeBlob(spillStart, + initVirtMem.writeBlob(spillStart, (uint8_t*)spillHandler32, sizeof(MachInst) * numSpillInsts); } @@ -452,7 +452,7 @@ void Sparc32LiveProcess::flushWindows(ThreadContext *tc) for (int index = 16; index < 32; index++) { uint32_t regVal = tc->readIntReg(index); regVal = htog(regVal); - if (!tc->getMemProxy()->tryWriteBlob( + if (!tc->getMemProxy().tryWriteBlob( sp + (index - 16) * 4, (uint8_t *)®Val, 4)) { warn("Failed to save register to the stack when " "flushing windows.\n"); @@ -487,7 +487,7 @@ Sparc64LiveProcess::flushWindows(ThreadContext *tc) for (int index = 16; index < 32; index++) { IntReg regVal = tc->readIntReg(index); regVal = htog(regVal); - if (!tc->getMemProxy()->tryWriteBlob( + if (!tc->getMemProxy().tryWriteBlob( sp + 2047 + (index - 16) * 8, (uint8_t *)®Val, 8)) { warn("Failed to save register to the stack when " "flushing windows.\n"); diff --git a/src/arch/sparc/utility.cc b/src/arch/sparc/utility.cc index 272df690c..b9a07b57b 100644 --- a/src/arch/sparc/utility.cc +++ b/src/arch/sparc/utility.cc @@ -56,8 +56,8 @@ getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp) return tc->readIntReg(8 + number); } else { Addr sp = tc->readIntReg(StackPointerReg); - FSTranslatingPortProxy* vp = tc->getVirtProxy(); - uint64_t arg = vp->read(sp + 92 + + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + uint64_t arg = vp.read(sp + 92 + (number-NumArgumentRegs) * sizeof(uint64_t)); return arg; } diff --git a/src/arch/sparc/vtophys.cc b/src/arch/sparc/vtophys.cc index 7e3c5fe01..e3d4f5066 100644 --- a/src/arch/sparc/vtophys.cc +++ b/src/arch/sparc/vtophys.cc @@ -81,7 +81,7 @@ vtophys(ThreadContext *tc, Addr addr) int pri_context = bits(tlbdata,47,32); // int sec_context = bits(tlbdata,63,48); - PortProxy* mem = tc->getPhysProxy(); + PortProxy &mem = tc->getPhysProxy(); TLB* itb = tc->getITBPtr(); TLB* dtb = tc->getDTBPtr(); TlbEntry* tbe; @@ -110,9 +110,9 @@ vtophys(ThreadContext *tc, Addr addr) dtb->GetTsbPtr(tc, addr, ctx_zero ? 0 : pri_context, tsbs); va_tag = bits(addr, 63, 22); for (int x = 0; x < 4; x++) { - ttetag = betoh(mem->read(tsbs[x])); + ttetag = betoh(mem.read(tsbs[x])); if (ttetag.valid() && ttetag.va() == va_tag) { - uint64_t entry = mem->read(tsbs[x]) + sizeof(uint64_t); + uint64_t entry = mem.read(tsbs[x]) + sizeof(uint64_t); // I think it's sun4v at least! pte.populate(betoh(entry), PageTableEntry::sun4v); DPRINTF(VtoPhys, "Virtual(%#x)->Physical(%#x) found in TTE\n", diff --git a/src/arch/x86/bios/e820.cc b/src/arch/x86/bios/e820.cc index 7564fcec7..c966916f5 100644 --- a/src/arch/x86/bios/e820.cc +++ b/src/arch/x86/bios/e820.cc @@ -39,21 +39,21 @@ #include "arch/x86/bios/e820.hh" #include "arch/x86/isa_traits.hh" -#include "mem/port.hh" +#include "mem/port_proxy.hh" #include "sim/byteswap.hh" using namespace std; using namespace X86ISA; template -void writeVal(T val, Port * port, Addr &addr) +void writeVal(T val, PortProxy& proxy, Addr &addr) { T guestVal = htog(val); - port->writeBlob(addr, (uint8_t *)&guestVal, sizeof(T)); + proxy.writeBlob(addr, (uint8_t *)&guestVal, sizeof(T)); addr += sizeof(T); } -void X86ISA::E820Table::writeTo(Port * port, Addr countAddr, Addr addr) +void X86ISA::E820Table::writeTo(PortProxy& proxy, Addr countAddr, Addr addr) { uint8_t e820Nr = entries.size(); @@ -63,12 +63,12 @@ void X86ISA::E820Table::writeTo(Port * port, Addr countAddr, Addr addr) uint8_t guestE820Nr = htog(e820Nr); - port->writeBlob(countAddr, (uint8_t *)&guestE820Nr, sizeof(guestE820Nr)); + proxy.writeBlob(countAddr, (uint8_t *)&guestE820Nr, sizeof(guestE820Nr)); for (int i = 0; i < e820Nr; i++) { - writeVal(entries[i]->addr, port, addr); - writeVal(entries[i]->size, port, addr); - writeVal(entries[i]->type, port, addr); + writeVal(entries[i]->addr, proxy, addr); + writeVal(entries[i]->size, proxy, addr); + writeVal(entries[i]->type, proxy, addr); } } diff --git a/src/arch/x86/bios/e820.hh b/src/arch/x86/bios/e820.hh index cb8d5946c..b61708050 100644 --- a/src/arch/x86/bios/e820.hh +++ b/src/arch/x86/bios/e820.hh @@ -47,7 +47,7 @@ #include "params/X86E820Table.hh" #include "sim/sim_object.hh" -class Port; +class PortProxy; namespace X86ISA { @@ -75,7 +75,7 @@ namespace X86ISA E820Table(Params *p) : SimObject(p), entries(p->entries) {} - void writeTo(Port * port, Addr countAddr, Addr addr); + void writeTo(PortProxy& proxy, Addr countAddr, Addr addr); }; }; diff --git a/src/arch/x86/bios/intelmp.cc b/src/arch/x86/bios/intelmp.cc index 4c9c61adb..645c51b36 100644 --- a/src/arch/x86/bios/intelmp.cc +++ b/src/arch/x86/bios/intelmp.cc @@ -70,10 +70,10 @@ const char X86ISA::IntelMP::FloatingPointer::signature[] = "_MP_"; template uint8_t -writeOutField(PortProxy* proxy, Addr addr, T val) +writeOutField(PortProxy& proxy, Addr addr, T val) { uint64_t guestVal = X86ISA::htog(val); - proxy->writeBlob(addr, (uint8_t *)(&guestVal), sizeof(T)); + proxy.writeBlob(addr, (uint8_t *)(&guestVal), sizeof(T)); uint8_t checkSum = 0; while(guestVal) { @@ -84,7 +84,7 @@ writeOutField(PortProxy* proxy, Addr addr, T val) } uint8_t -writeOutString(PortProxy* proxy, Addr addr, string str, int length) +writeOutString(PortProxy& proxy, Addr addr, string str, int length) { char cleanedString[length + 1]; cleanedString[length] = 0; @@ -97,7 +97,7 @@ writeOutString(PortProxy* proxy, Addr addr, string str, int length) memcpy(cleanedString, str.c_str(), str.length()); memset(cleanedString + str.length(), 0, length - str.length()); } - proxy->writeBlob(addr, (uint8_t *)(&cleanedString), length); + proxy.writeBlob(addr, (uint8_t *)(&cleanedString), length); uint8_t checkSum = 0; for (int i = 0; i < length; i++) @@ -107,7 +107,7 @@ writeOutString(PortProxy* proxy, Addr addr, string str, int length) } Addr -X86ISA::IntelMP::FloatingPointer::writeOut(PortProxy* proxy, Addr addr) +X86ISA::IntelMP::FloatingPointer::writeOut(PortProxy& proxy, Addr addr) { // Make sure that either a config table is present or a default // configuration was found but not both. @@ -120,7 +120,7 @@ X86ISA::IntelMP::FloatingPointer::writeOut(PortProxy* proxy, Addr addr) uint8_t checkSum = 0; - proxy->writeBlob(addr, (uint8_t *)signature, 4); + proxy.writeBlob(addr, (uint8_t *)signature, 4); for (int i = 0; i < 4; i++) checkSum += signature[i]; @@ -128,20 +128,20 @@ X86ISA::IntelMP::FloatingPointer::writeOut(PortProxy* proxy, Addr addr) // The length of the structure in paragraphs, aka 16 byte chunks. uint8_t length = 1; - proxy->writeBlob(addr + 8, &length, 1); + proxy.writeBlob(addr + 8, &length, 1); checkSum += length; - proxy->writeBlob(addr + 9, &specRev, 1); + proxy.writeBlob(addr + 9, &specRev, 1); checkSum += specRev; - proxy->writeBlob(addr + 11, &defaultConfig, 1); + proxy.writeBlob(addr + 11, &defaultConfig, 1); checkSum += defaultConfig; uint32_t features2_5 = imcrPresent ? (1 << 7) : 0; checkSum += writeOutField(proxy, addr + 12, features2_5); checkSum = -checkSum; - proxy->writeBlob(addr + 10, &checkSum, 1); + proxy.writeBlob(addr + 10, &checkSum, 1); return 16; } @@ -158,10 +158,10 @@ X86IntelMPFloatingPointerParams::create() } Addr -X86ISA::IntelMP::BaseConfigEntry::writeOut(PortProxy* proxy, +X86ISA::IntelMP::BaseConfigEntry::writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum) { - proxy->writeBlob(addr, &type, 1); + proxy.writeBlob(addr, &type, 1); checkSum += type; return 1; } @@ -171,12 +171,12 @@ X86ISA::IntelMP::BaseConfigEntry::BaseConfigEntry(Params * p, uint8_t _type) : {} Addr -X86ISA::IntelMP::ExtConfigEntry::writeOut(PortProxy* proxy, +X86ISA::IntelMP::ExtConfigEntry::writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum) { - proxy->writeBlob(addr, &type, 1); + proxy.writeBlob(addr, &type, 1); checkSum += type; - proxy->writeBlob(addr + 1, &length, 1); + proxy.writeBlob(addr + 1, &length, 1); checkSum += length; return 1; } @@ -189,17 +189,17 @@ X86ISA::IntelMP::ExtConfigEntry::ExtConfigEntry(Params * p, const char X86ISA::IntelMP::ConfigTable::signature[] = "PCMP"; Addr -X86ISA::IntelMP::ConfigTable::writeOut(PortProxy* proxy, Addr addr) +X86ISA::IntelMP::ConfigTable::writeOut(PortProxy& proxy, Addr addr) { uint8_t checkSum = 0; - proxy->writeBlob(addr, (uint8_t *)signature, 4); + proxy.writeBlob(addr, (uint8_t *)signature, 4); for (int i = 0; i < 4; i++) checkSum += signature[i]; // Base table length goes here but will be calculated later. - proxy->writeBlob(addr + 6, (uint8_t *)(&specRev), 1); + proxy.writeBlob(addr + 6, (uint8_t *)(&specRev), 1); checkSum += specRev; // The checksum goes here but is still being calculated. @@ -213,7 +213,7 @@ X86ISA::IntelMP::ConfigTable::writeOut(PortProxy* proxy, Addr addr) checkSum += writeOutField(proxy, addr + 36, localApic); uint8_t reserved = 0; - proxy->writeBlob(addr + 43, &reserved, 1); + proxy.writeBlob(addr + 43, &reserved, 1); checkSum += reserved; vector::iterator baseEnt; @@ -261,7 +261,7 @@ X86IntelMPConfigTableParams::create() Addr X86ISA::IntelMP::Processor::writeOut( - PortProxy* proxy, Addr addr, uint8_t &checkSum) + PortProxy& proxy, Addr addr, uint8_t &checkSum) { BaseConfigEntry::writeOut(proxy, addr, checkSum); checkSum += writeOutField(proxy, addr + 1, localApicID); @@ -271,8 +271,8 @@ X86ISA::IntelMP::Processor::writeOut( checkSum += writeOutField(proxy, addr + 8, featureFlags); uint32_t reserved = 0; - proxy->writeBlob(addr + 12, (uint8_t *)(&reserved), 4); - proxy->writeBlob(addr + 16, (uint8_t *)(&reserved), 4); + proxy.writeBlob(addr + 12, (uint8_t *)(&reserved), 4); + proxy.writeBlob(addr + 16, (uint8_t *)(&reserved), 4); return 20; } @@ -298,7 +298,7 @@ X86IntelMPProcessorParams::create() Addr X86ISA::IntelMP::Bus::writeOut( - PortProxy* proxy, Addr addr, uint8_t &checkSum) + PortProxy& proxy, Addr addr, uint8_t &checkSum) { BaseConfigEntry::writeOut(proxy, addr, checkSum); checkSum += writeOutField(proxy, addr + 1, busID); @@ -318,7 +318,7 @@ X86IntelMPBusParams::create() Addr X86ISA::IntelMP::IOAPIC::writeOut( - PortProxy* proxy, Addr addr, uint8_t &checkSum) + PortProxy& proxy, Addr addr, uint8_t &checkSum) { BaseConfigEntry::writeOut(proxy, addr, checkSum); checkSum += writeOutField(proxy, addr + 1, id); @@ -343,7 +343,7 @@ X86IntelMPIOAPICParams::create() Addr X86ISA::IntelMP::IntAssignment::writeOut( - PortProxy* proxy, Addr addr, uint8_t &checkSum) + PortProxy& proxy, Addr addr, uint8_t &checkSum) { BaseConfigEntry::writeOut(proxy, addr, checkSum); checkSum += writeOutField(proxy, addr + 1, interruptType); @@ -381,7 +381,7 @@ X86IntelMPLocalIntAssignmentParams::create() Addr X86ISA::IntelMP::AddrSpaceMapping::writeOut( - PortProxy* proxy, Addr addr, uint8_t &checkSum) + PortProxy& proxy, Addr addr, uint8_t &checkSum) { ExtConfigEntry::writeOut(proxy, addr, checkSum); checkSum += writeOutField(proxy, addr + 2, busID); @@ -405,7 +405,7 @@ X86IntelMPAddrSpaceMappingParams::create() Addr X86ISA::IntelMP::BusHierarchy::writeOut( - PortProxy* proxy, Addr addr, uint8_t &checkSum) + PortProxy& proxy, Addr addr, uint8_t &checkSum) { ExtConfigEntry::writeOut(proxy, addr, checkSum); checkSum += writeOutField(proxy, addr + 2, busID); @@ -413,7 +413,7 @@ X86ISA::IntelMP::BusHierarchy::writeOut( checkSum += writeOutField(proxy, addr + 4, parentBus); uint32_t reserved = 0; - proxy->writeBlob(addr + 5, (uint8_t *)(&reserved), 3); + proxy.writeBlob(addr + 5, (uint8_t *)(&reserved), 3); return length; } @@ -434,7 +434,7 @@ X86IntelMPBusHierarchyParams::create() Addr X86ISA::IntelMP::CompatAddrSpaceMod::writeOut( - PortProxy* proxy, Addr addr, uint8_t &checkSum) + PortProxy& proxy, Addr addr, uint8_t &checkSum) { ExtConfigEntry::writeOut(proxy, addr, checkSum); checkSum += writeOutField(proxy, addr + 2, busID); diff --git a/src/arch/x86/bios/intelmp.hh b/src/arch/x86/bios/intelmp.hh index 4b730ad4b..909f8ad79 100644 --- a/src/arch/x86/bios/intelmp.hh +++ b/src/arch/x86/bios/intelmp.hh @@ -93,7 +93,7 @@ class FloatingPointer : public SimObject public: - Addr writeOut(PortProxy* proxy, Addr addr); + Addr writeOut(PortProxy& proxy, Addr addr); Addr getTableAddr() { @@ -117,7 +117,7 @@ class BaseConfigEntry : public SimObject public: - virtual Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + virtual Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); BaseConfigEntry(Params * p, uint8_t _type); }; @@ -132,7 +132,7 @@ class ExtConfigEntry : public SimObject public: - virtual Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + virtual Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); ExtConfigEntry(Params * p, uint8_t _type, uint8_t _length); }; @@ -155,7 +155,7 @@ class ConfigTable : public SimObject std::vector extEntries; public: - Addr writeOut(PortProxy* proxy, Addr addr); + Addr writeOut(PortProxy& proxy, Addr addr); ConfigTable(Params * p); }; @@ -172,7 +172,7 @@ class Processor : public BaseConfigEntry uint32_t featureFlags; public: - Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); Processor(Params * p); }; @@ -186,7 +186,7 @@ class Bus : public BaseConfigEntry std::string busType; public: - Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); Bus(Params * p); }; @@ -202,7 +202,7 @@ class IOAPIC : public BaseConfigEntry uint32_t address; public: - Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); IOAPIC(Params * p); }; @@ -221,7 +221,7 @@ class IntAssignment : public BaseConfigEntry uint8_t destApicIntIn; public: - Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); IntAssignment(X86IntelMPBaseConfigEntryParams * p, Enums::X86IntelMPInterruptType _interruptType, @@ -269,7 +269,7 @@ class AddrSpaceMapping : public ExtConfigEntry uint64_t addrLength; public: - Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); AddrSpaceMapping(Params * p); }; @@ -284,7 +284,7 @@ class BusHierarchy : public ExtConfigEntry uint8_t parentBus; public: - Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); BusHierarchy(Params * p); }; @@ -299,7 +299,7 @@ class CompatAddrSpaceMod : public ExtConfigEntry uint32_t rangeList; public: - Addr writeOut(PortProxy* proxy, Addr addr, uint8_t &checkSum); + Addr writeOut(PortProxy& proxy, Addr addr, uint8_t &checkSum); CompatAddrSpaceMod(Params * p); }; diff --git a/src/arch/x86/bios/smbios.cc b/src/arch/x86/bios/smbios.cc index a85ece1ec..9072664bf 100644 --- a/src/arch/x86/bios/smbios.cc +++ b/src/arch/x86/bios/smbios.cc @@ -74,15 +74,15 @@ composeBitVector(T vec) } uint16_t -X86ISA::SMBios::SMBiosStructure::writeOut(PortProxy* proxy, Addr addr) +X86ISA::SMBios::SMBiosStructure::writeOut(PortProxy& proxy, Addr addr) { - proxy->writeBlob(addr, (uint8_t *)(&type), 1); + proxy.writeBlob(addr, (uint8_t *)(&type), 1); uint8_t length = getLength(); - proxy->writeBlob(addr + 1, (uint8_t *)(&length), 1); + proxy.writeBlob(addr + 1, (uint8_t *)(&length), 1); uint16_t handleGuest = X86ISA::htog(handle); - proxy->writeBlob(addr + 2, (uint8_t *)(&handleGuest), 2); + proxy.writeBlob(addr + 2, (uint8_t *)(&handleGuest), 2); return length + getStringLength(); } @@ -93,7 +93,7 @@ X86ISA::SMBios::SMBiosStructure::SMBiosStructure(Params * p, uint8_t _type) : void X86ISA::SMBios::SMBiosStructure::writeOutStrings( - PortProxy* proxy, Addr addr) + PortProxy& proxy, Addr addr) { std::vector::iterator it; Addr offset = 0; @@ -103,16 +103,16 @@ X86ISA::SMBios::SMBiosStructure::writeOutStrings( // If there are string fields but none of them are used, that's a // special case which is handled by this if. if (strings.size() == 0 && stringFields) { - proxy->writeBlob(addr + offset, (uint8_t *)(&nullTerminator), 1); + proxy.writeBlob(addr + offset, (uint8_t *)(&nullTerminator), 1); offset++; } else { for (it = strings.begin(); it != strings.end(); it++) { - proxy->writeBlob(addr + offset, + proxy.writeBlob(addr + offset, (uint8_t *)it->c_str(), it->length() + 1); offset += it->length() + 1; } } - proxy->writeBlob(addr + offset, (uint8_t *)(&nullTerminator), 1); + proxy.writeBlob(addr + offset, (uint8_t *)(&nullTerminator), 1); } int @@ -172,30 +172,30 @@ X86ISA::SMBios::BiosInformation::BiosInformation(Params * p) : } uint16_t -X86ISA::SMBios::BiosInformation::writeOut(PortProxy* proxy, Addr addr) +X86ISA::SMBios::BiosInformation::writeOut(PortProxy& proxy, Addr addr) { uint8_t size = SMBiosStructure::writeOut(proxy, addr); - proxy->writeBlob(addr + 0x4, (uint8_t *)(&vendor), 1); - proxy->writeBlob(addr + 0x5, (uint8_t *)(&version), 1); + proxy.writeBlob(addr + 0x4, (uint8_t *)(&vendor), 1); + proxy.writeBlob(addr + 0x5, (uint8_t *)(&version), 1); uint16_t startingAddrSegmentGuest = X86ISA::htog(startingAddrSegment); - proxy->writeBlob(addr + 0x6, (uint8_t *)(&startingAddrSegmentGuest), 2); + proxy.writeBlob(addr + 0x6, (uint8_t *)(&startingAddrSegmentGuest), 2); - proxy->writeBlob(addr + 0x8, (uint8_t *)(&releaseDate), 1); - proxy->writeBlob(addr + 0x9, (uint8_t *)(&romSize), 1); + proxy.writeBlob(addr + 0x8, (uint8_t *)(&releaseDate), 1); + proxy.writeBlob(addr + 0x9, (uint8_t *)(&romSize), 1); uint64_t characteristicsGuest = X86ISA::htog(characteristics); - proxy->writeBlob(addr + 0xA, (uint8_t *)(&characteristicsGuest), 8); + proxy.writeBlob(addr + 0xA, (uint8_t *)(&characteristicsGuest), 8); uint16_t characteristicExtBytesGuest = X86ISA::htog(characteristicExtBytes); - proxy->writeBlob(addr + 0x12, (uint8_t *)(&characteristicExtBytesGuest), 2); + proxy.writeBlob(addr + 0x12, (uint8_t *)(&characteristicExtBytesGuest), 2); - proxy->writeBlob(addr + 0x14, (uint8_t *)(&majorVer), 1); - proxy->writeBlob(addr + 0x15, (uint8_t *)(&minorVer), 1); - proxy->writeBlob(addr + 0x16, (uint8_t *)(&embContFirmwareMajor), 1); - proxy->writeBlob(addr + 0x17, (uint8_t *)(&embContFirmwareMinor), 1); + proxy.writeBlob(addr + 0x14, (uint8_t *)(&majorVer), 1); + proxy.writeBlob(addr + 0x15, (uint8_t *)(&minorVer), 1); + proxy.writeBlob(addr + 0x16, (uint8_t *)(&embContFirmwareMajor), 1); + proxy.writeBlob(addr + 0x17, (uint8_t *)(&embContFirmwareMinor), 1); writeOutStrings(proxy, addr + getLength()); @@ -214,7 +214,7 @@ X86ISA::SMBios::SMBiosTable::SMBiosTable(Params * p) : } void -X86ISA::SMBios::SMBiosTable::writeOut(PortProxy* proxy, Addr addr, +X86ISA::SMBios::SMBiosTable::writeOut(PortProxy& proxy, Addr addr, Addr &headerSize, Addr &structSize) { headerSize = 0x1F; @@ -224,26 +224,26 @@ X86ISA::SMBios::SMBiosTable::writeOut(PortProxy* proxy, Addr addr, */ uint8_t mainChecksum = 0; - proxy->writeBlob(addr, (uint8_t *)smbiosHeader.anchorString, 4); + proxy.writeBlob(addr, (uint8_t *)smbiosHeader.anchorString, 4); for (int i = 0; i < 4; i++) mainChecksum += smbiosHeader.anchorString[i]; // The checksum goes here, but we're figuring it out as we go. - proxy->writeBlob(addr + 0x5, + proxy.writeBlob(addr + 0x5, (uint8_t *)(&smbiosHeader.entryPointLength), 1); mainChecksum += smbiosHeader.entryPointLength; - proxy->writeBlob(addr + 0x6, + proxy.writeBlob(addr + 0x6, (uint8_t *)(&smbiosHeader.majorVersion), 1); mainChecksum += smbiosHeader.majorVersion; - proxy->writeBlob(addr + 0x7, + proxy.writeBlob(addr + 0x7, (uint8_t *)(&smbiosHeader.minorVersion), 1); mainChecksum += smbiosHeader.minorVersion; // Maximum structure size goes here, but we'll figure it out later. - proxy->writeBlob(addr + 0xA, + proxy.writeBlob(addr + 0xA, (uint8_t *)(&smbiosHeader.entryPointRevision), 1); mainChecksum += smbiosHeader.entryPointRevision; - proxy->writeBlob(addr + 0xB, + proxy.writeBlob(addr + 0xB, (uint8_t *)(&smbiosHeader.formattedArea), 5); for (int i = 0; i < 5; i++) mainChecksum += smbiosHeader.formattedArea[i]; @@ -253,7 +253,7 @@ X86ISA::SMBios::SMBiosTable::writeOut(PortProxy* proxy, Addr addr, */ uint8_t intChecksum = 0; - proxy->writeBlob(addr + 0x10, + proxy.writeBlob(addr + 0x10, (uint8_t *)smbiosHeader.intermediateHeader.anchorString, 5); for (int i = 0; i < 5; i++) intChecksum += smbiosHeader.intermediateHeader.anchorString[i]; @@ -263,20 +263,20 @@ X86ISA::SMBios::SMBiosTable::writeOut(PortProxy* proxy, Addr addr, uint32_t tableAddrGuest = X86ISA::htog(smbiosHeader.intermediateHeader.tableAddr); - proxy->writeBlob(addr + 0x18, (uint8_t *)(&tableAddrGuest), 4); + proxy.writeBlob(addr + 0x18, (uint8_t *)(&tableAddrGuest), 4); for (int i = 0; i < 4; i++) { intChecksum += tableAddrGuest; tableAddrGuest >>= 8; } uint16_t numStructs = X86ISA::gtoh(structures.size()); - proxy->writeBlob(addr + 0x1C, (uint8_t *)(&numStructs), 2); + proxy.writeBlob(addr + 0x1C, (uint8_t *)(&numStructs), 2); for (int i = 0; i < 2; i++) { intChecksum += numStructs; numStructs >>= 8; } - proxy->writeBlob(addr + 0x1E, + proxy.writeBlob(addr + 0x1E, (uint8_t *)(&smbiosHeader.intermediateHeader.smbiosBCDRevision), 1); intChecksum += smbiosHeader.intermediateHeader.smbiosBCDRevision; @@ -303,7 +303,7 @@ X86ISA::SMBios::SMBiosTable::writeOut(PortProxy* proxy, Addr addr, */ maxSize = X86ISA::htog(maxSize); - proxy->writeBlob(addr + 0x8, (uint8_t *)(&maxSize), 2); + proxy.writeBlob(addr + 0x8, (uint8_t *)(&maxSize), 2); for (int i = 0; i < 2; i++) { mainChecksum += maxSize; maxSize >>= 8; @@ -311,7 +311,7 @@ X86ISA::SMBios::SMBiosTable::writeOut(PortProxy* proxy, Addr addr, // Set the checksum mainChecksum = -mainChecksum; - proxy->writeBlob(addr + 0x4, (uint8_t *)(&mainChecksum), 1); + proxy.writeBlob(addr + 0x4, (uint8_t *)(&mainChecksum), 1); /* * Intermediate header @@ -319,14 +319,14 @@ X86ISA::SMBios::SMBiosTable::writeOut(PortProxy* proxy, Addr addr, uint16_t tableSize = offset; tableSize = X86ISA::htog(tableSize); - proxy->writeBlob(addr + 0x16, (uint8_t *)(&tableSize), 2); + proxy.writeBlob(addr + 0x16, (uint8_t *)(&tableSize), 2); for (int i = 0; i < 2; i++) { intChecksum += tableSize; tableSize >>= 8; } intChecksum = -intChecksum; - proxy->writeBlob(addr + 0x15, (uint8_t *)(&intChecksum), 1); + proxy.writeBlob(addr + 0x15, (uint8_t *)(&intChecksum), 1); } X86ISA::SMBios::BiosInformation * diff --git a/src/arch/x86/bios/smbios.hh b/src/arch/x86/bios/smbios.hh index 805b03fbb..4b0a61190 100644 --- a/src/arch/x86/bios/smbios.hh +++ b/src/arch/x86/bios/smbios.hh @@ -89,7 +89,7 @@ class SMBiosStructure : public SimObject return 4; } - virtual uint16_t writeOut(PortProxy* proxy, Addr addr); + virtual uint16_t writeOut(PortProxy& proxy, Addr addr); protected: bool stringFields; @@ -98,7 +98,7 @@ class SMBiosStructure : public SimObject std::vector strings; - void writeOutStrings(PortProxy* proxy, Addr addr); + void writeOutStrings(PortProxy& proxy, Addr addr); int getStringLength(); @@ -145,7 +145,7 @@ class BiosInformation : public SMBiosStructure BiosInformation(Params * p); uint8_t getLength() { return 0x18; } - uint16_t writeOut(PortProxy* proxy, Addr addr); + uint16_t writeOut(PortProxy& proxy, Addr addr); }; class SMBiosTable : public SimObject @@ -223,7 +223,7 @@ class SMBiosTable : public SimObject smbiosHeader.intermediateHeader.tableAddr = addr; } - void writeOut(PortProxy* proxy, Addr addr, + void writeOut(PortProxy& proxy, Addr addr, Addr &headerSize, Addr &structSize); }; diff --git a/src/arch/x86/linux/syscalls.cc b/src/arch/x86/linux/syscalls.cc index c6faf391b..b016a380a 100644 --- a/src/arch/x86/linux/syscalls.cc +++ b/src/arch/x86/linux/syscalls.cc @@ -81,7 +81,7 @@ archPrctlFunc(SyscallDesc *desc, int callnum, LiveProcess *process, int code = process->getSyscallArg(tc, index); uint64_t addr = process->getSyscallArg(tc, index); uint64_t fsBase, gsBase; - SETranslatingPortProxy* p = tc->getMemProxy(); + SETranslatingPortProxy &p = tc->getMemProxy(); switch(code) { //Each of these valid options should actually check addr. @@ -91,7 +91,7 @@ archPrctlFunc(SyscallDesc *desc, int callnum, LiveProcess *process, return 0; case GetFS: fsBase = tc->readMiscRegNoEffect(MISCREG_FS_BASE); - p->write(addr, fsBase); + p.write(addr, fsBase); return 0; case SetGS: tc->setMiscRegNoEffect(MISCREG_GS_BASE, addr); @@ -99,7 +99,7 @@ archPrctlFunc(SyscallDesc *desc, int callnum, LiveProcess *process, return 0; case GetGS: gsBase = tc->readMiscRegNoEffect(MISCREG_GS_BASE); - p->write(addr, gsBase); + p.write(addr, gsBase); return 0; default: return -EINVAL; diff --git a/src/arch/x86/linux/system.cc b/src/arch/x86/linux/system.cc index a933868d1..f473af40e 100644 --- a/src/arch/x86/linux/system.cc +++ b/src/arch/x86/linux/system.cc @@ -67,9 +67,6 @@ LinuxX86System::initState() // The location of the real mode data structure. const Addr realModeData = 0x90200; - // A port proxy to write to memory. - PortProxy* physProxy = threadContexts[0]->getPhysProxy(); - /* * Deal with the command line stuff. */ @@ -82,15 +79,15 @@ LinuxX86System::initState() if (commandLine.length() + 1 > realModeData - commandLineBuff) panic("Command line \"%s\" is longer than %d characters.\n", commandLine, realModeData - commandLineBuff - 1); - physProxy->writeBlob(commandLineBuff, - (uint8_t *)commandLine.c_str(), commandLine.length() + 1); + physProxy.writeBlob(commandLineBuff, (uint8_t *)commandLine.c_str(), + commandLine.length() + 1); // Generate a pointer of the right size and endianness to put into // commandLinePointer. uint32_t guestCommandLineBuff = X86ISA::htog((uint32_t)commandLineBuff); - physProxy->writeBlob(commandLinePointer, - (uint8_t *)&guestCommandLineBuff, sizeof(guestCommandLineBuff)); + physProxy.writeBlob(commandLinePointer, (uint8_t *)&guestCommandLineBuff, + sizeof(guestCommandLineBuff)); /* * Screen Info. @@ -127,7 +124,7 @@ LinuxX86System::initState() // A pointer to the buffer for E820 entries. const Addr e820MapPointer = realModeData + 0x2d0; - e820Table->writeTo(getSystemPort(), e820MapNrPointer, e820MapPointer); + e820Table->writeTo(physProxy, e820MapNrPointer, e820MapPointer); /* * Pass the location of the real mode data structure to the kernel diff --git a/src/arch/x86/process.cc b/src/arch/x86/process.cc index 32fc8ca70..088a0661c 100644 --- a/src/arch/x86/process.cc +++ b/src/arch/x86/process.cc @@ -172,7 +172,7 @@ X86_64LiveProcess::initState() 0x0f,0x05, // syscall 0xc3 // retq }; - initVirtMem->writeBlob(vsyscallPage.base + vsyscallPage.vtimeOffset, + initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vtimeOffset, vtimeBlob, sizeof(vtimeBlob)); uint8_t vgettimeofdayBlob[] = { @@ -180,7 +180,7 @@ X86_64LiveProcess::initState() 0x0f,0x05, // syscall 0xc3 // retq }; - initVirtMem->writeBlob(vsyscallPage.base + vsyscallPage.vgettimeofdayOffset, + initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vgettimeofdayOffset, vgettimeofdayBlob, sizeof(vgettimeofdayBlob)); for (int i = 0; i < contextIds.size(); i++) { @@ -269,7 +269,7 @@ I386LiveProcess::initState() assert(_gdtSize % sizeof(zero) == 0); for (Addr gdtCurrent = _gdtStart; gdtCurrent < _gdtStart + _gdtSize; gdtCurrent += sizeof(zero)) { - initVirtMem->write(gdtCurrent, zero); + initVirtMem.write(gdtCurrent, zero); } // Set up the vsyscall page for this process. @@ -281,7 +281,7 @@ I386LiveProcess::initState() 0x89, 0xe5, // mov %esp, %ebp 0x0f, 0x34 // sysenter }; - initVirtMem->writeBlob(vsyscallPage.base + vsyscallPage.vsyscallOffset, + initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vsyscallOffset, vsyscallBlob, sizeof(vsyscallBlob)); uint8_t vsysexitBlob[] = { @@ -290,7 +290,7 @@ I386LiveProcess::initState() 0x59, // pop %ecx 0xc3 // ret }; - initVirtMem->writeBlob(vsyscallPage.base + vsyscallPage.vsysexitOffset, + initVirtMem.writeBlob(vsyscallPage.base + vsyscallPage.vsysexitOffset, vsysexitBlob, sizeof(vsysexitBlob)); for (int i = 0; i < contextIds.size(); i++) { @@ -608,11 +608,11 @@ X86LiveProcess::argsInit(int pageSize, //Write out the sentry void * IntType sentry_NULL = 0; - initVirtMem->writeBlob(sentry_base, + initVirtMem.writeBlob(sentry_base, (uint8_t*)&sentry_NULL, sentry_size); //Write the file name - initVirtMem->writeString(file_name_base, filename.c_str()); + initVirtMem.writeString(file_name_base, filename.c_str()); //Fix up the aux vectors which point to data assert(auxv[auxv.size() - 3].a_type == M5_AT_RANDOM); @@ -625,22 +625,22 @@ X86LiveProcess::argsInit(int pageSize, //Copy the aux stuff for(int x = 0; x < auxv.size(); x++) { - initVirtMem->writeBlob(auxv_array_base + x * 2 * intSize, + initVirtMem.writeBlob(auxv_array_base + x * 2 * intSize, (uint8_t*)&(auxv[x].a_type), intSize); - initVirtMem->writeBlob(auxv_array_base + (x * 2 + 1) * intSize, + initVirtMem.writeBlob(auxv_array_base + (x * 2 + 1) * intSize, (uint8_t*)&(auxv[x].a_val), intSize); } //Write out the terminating zeroed auxilliary vector const uint64_t zero = 0; - initVirtMem->writeBlob(auxv_array_base + 2 * intSize * auxv.size(), + initVirtMem.writeBlob(auxv_array_base + 2 * intSize * auxv.size(), (uint8_t*)&zero, 2 * intSize); - initVirtMem->writeString(aux_data_base, platform.c_str()); + initVirtMem.writeString(aux_data_base, platform.c_str()); copyStringArray(envp, envp_array_base, env_data_base, initVirtMem); copyStringArray(argv, argv_array_base, arg_data_base, initVirtMem); - initVirtMem->writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); + initVirtMem.writeBlob(argc_base, (uint8_t*)&guestArgc, intSize); ThreadContext *tc = system->getThreadContext(contextIds[0]); //Set the stack pointer register diff --git a/src/arch/x86/stacktrace.cc b/src/arch/x86/stacktrace.cc index e3d30d5cd..636f74123 100644 --- a/src/arch/x86/stacktrace.cc +++ b/src/arch/x86/stacktrace.cc @@ -48,29 +48,27 @@ namespace X86ISA { Addr addr = 0; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr)) panic("thread info not compiled into kernel\n"); - thread_info_size = vp->readGtoH(addr); + thread_info_size = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr)) panic("thread info not compiled into kernel\n"); - task_struct_size = vp->readGtoH(addr); + task_struct_size = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr)) panic("thread info not compiled into kernel\n"); - task_off = vp->readGtoH(addr); + task_off = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr)) panic("thread info not compiled into kernel\n"); - pid_off = vp->readGtoH(addr); + pid_off = vp.readGtoH(addr); if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr)) panic("thread info not compiled into kernel\n"); - name_off = vp->readGtoH(addr); + name_off = vp.readGtoH(addr); } Addr @@ -82,10 +80,8 @@ namespace X86ISA Addr tsk; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); - tsk = vp->readGtoH(base + task_off); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + tsk = vp.readGtoH(base + task_off); return tsk; } @@ -99,10 +95,8 @@ namespace X86ISA uint16_t pd; - FSTranslatingPortProxy* vp; - - vp = tc->getVirtProxy(); - pd = vp->readGtoH(task + pid_off); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); + pd = vp.readGtoH(task + pid_off); return pd; } diff --git a/src/arch/x86/system.cc b/src/arch/x86/system.cc index ca13fd5ce..effe1e994 100644 --- a/src/arch/x86/system.cc +++ b/src/arch/x86/system.cc @@ -138,17 +138,14 @@ X86System::initState() const int PDPTBits = 9; const int PDTBits = 9; - // Get a port proxy to write the page tables and descriptor tables. - PortProxy* physProxy = tc->getPhysProxy(); - /* * Set up the gdt. */ uint8_t numGDTEntries = 0; // Place holder at selector 0 uint64_t nullDescriptor = 0; - physProxy->writeBlob(GDTBase + numGDTEntries * 8, - (uint8_t *)(&nullDescriptor), 8); + physProxy.writeBlob(GDTBase + numGDTEntries * 8, + (uint8_t *)(&nullDescriptor), 8); numGDTEntries++; //64 bit code segment @@ -169,8 +166,8 @@ X86System::initState() //it's beginning in memory and it's actual data, we'll use an //intermediary. uint64_t csDescVal = csDesc; - physProxy->writeBlob(GDTBase + numGDTEntries * 8, - (uint8_t *)(&csDescVal), 8); + physProxy.writeBlob(GDTBase + numGDTEntries * 8, + (uint8_t *)(&csDescVal), 8); numGDTEntries++; @@ -192,8 +189,8 @@ X86System::initState() dsDesc.limitHigh = 0xF; dsDesc.limitLow = 0xFF; uint64_t dsDescVal = dsDesc; - physProxy->writeBlob(GDTBase + numGDTEntries * 8, - (uint8_t *)(&dsDescVal), 8); + physProxy.writeBlob(GDTBase + numGDTEntries * 8, + (uint8_t *)(&dsDescVal), 8); numGDTEntries++; @@ -220,8 +217,8 @@ X86System::initState() tssDesc.limitHigh = 0xF; tssDesc.limitLow = 0xFF; uint64_t tssDescVal = tssDesc; - physProxy->writeBlob(GDTBase + numGDTEntries * 8, - (uint8_t *)(&tssDescVal), 8); + physProxy.writeBlob(GDTBase + numGDTEntries * 8, + (uint8_t *)(&tssDescVal), 8); numGDTEntries++; @@ -250,25 +247,25 @@ X86System::initState() // read/write, user, not present uint64_t pml4e = X86ISA::htog(0x6); for (int offset = 0; offset < (1 << PML4Bits) * 8; offset += 8) { - physProxy->writeBlob(PageMapLevel4 + offset, (uint8_t *)(&pml4e), 8); + physProxy.writeBlob(PageMapLevel4 + offset, (uint8_t *)(&pml4e), 8); } // Point to the only PDPT pml4e = X86ISA::htog(0x7 | PageDirPtrTable); - physProxy->writeBlob(PageMapLevel4, (uint8_t *)(&pml4e), 8); + physProxy.writeBlob(PageMapLevel4, (uint8_t *)(&pml4e), 8); // Page Directory Pointer Table // read/write, user, not present uint64_t pdpe = X86ISA::htog(0x6); for (int offset = 0; offset < (1 << PDPTBits) * 8; offset += 8) { - physProxy->writeBlob(PageDirPtrTable + offset, - (uint8_t *)(&pdpe), 8); + physProxy.writeBlob(PageDirPtrTable + offset, + (uint8_t *)(&pdpe), 8); } // Point to the PDTs for (int table = 0; table < NumPDTs; table++) { pdpe = X86ISA::htog(0x7 | PageDirTable[table]); - physProxy->writeBlob(PageDirPtrTable + table * 8, - (uint8_t *)(&pdpe), 8); + physProxy.writeBlob(PageDirPtrTable + table * 8, + (uint8_t *)(&pdpe), 8); } // Page Directory Tables @@ -279,8 +276,8 @@ X86System::initState() for (int offset = 0; offset < (1 << PDTBits) * 8; offset += 8) { // read/write, user, present, 4MB uint64_t pdte = X86ISA::htog(0x87 | base); - physProxy->writeBlob(PageDirTable[table] + offset, - (uint8_t *)(&pdte), 8); + physProxy.writeBlob(PageDirTable[table] + offset, + (uint8_t *)(&pdte), 8); base += pageSize; } } @@ -342,9 +339,6 @@ void X86System::writeOutSMBiosTable(Addr header, Addr &headerSize, Addr &structSize, Addr table) { - // Get a port proxy to write the table and header to memory. - PortProxy* physProxy = threadContexts[0]->getPhysProxy(); - // If the table location isn't specified, just put it after the header. // The header size as of the 2.5 SMBios specification is 0x1F bytes if (!table) @@ -363,9 +357,6 @@ void X86System::writeOutMPTable(Addr fp, Addr &fpSize, Addr &tableSize, Addr table) { - // Get a port proxy to write the table and header to memory. - PortProxy* physProxy = threadContexts[0]->getPhysProxy(); - // If the table location isn't specified and it exists, just put // it after the floating pointer. The fp size as of the 1.4 Intel MP // specification is 0x10 bytes. diff --git a/src/base/loader/elf_object.cc b/src/base/loader/elf_object.cc index 80800e862..e48678bbb 100644 --- a/src/base/loader/elf_object.cc +++ b/src/base/loader/elf_object.cc @@ -414,7 +414,7 @@ ElfObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask) } bool -ElfObject::loadSections(PortProxy* memProxy, Addr addrMask) +ElfObject::loadSections(PortProxy& memProxy, Addr addrMask) { if (!ObjectFile::loadSections(memProxy, addrMask)) return false; diff --git a/src/base/loader/elf_object.hh b/src/base/loader/elf_object.hh index afb61c21d..350a80db1 100644 --- a/src/base/loader/elf_object.hh +++ b/src/base/loader/elf_object.hh @@ -65,7 +65,7 @@ class ElfObject : public ObjectFile public: virtual ~ElfObject() {} - bool loadSections(PortProxy *memProxy, + bool loadSections(PortProxy& memProxy, Addr addrMask = std::numeric_limits::max()); virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask = std::numeric_limits::max()); diff --git a/src/base/loader/hex_file.cc b/src/base/loader/hex_file.cc index d38c0fb62..bfebc1b44 100755 --- a/src/base/loader/hex_file.cc +++ b/src/base/loader/hex_file.cc @@ -59,7 +59,7 @@ HexFile::~HexFile() } bool -HexFile::loadSections(PortProxy* memProxy) +HexFile::loadSections(PortProxy& memProxy) { char Line[64]; Addr MemAddr; @@ -71,7 +71,7 @@ HexFile::loadSections(PortProxy* memProxy) parseLine(Line, &MemAddr, &Data); if (MemAddr != 0) { // Now, write to memory - memProxy->writeBlob(MemAddr << 2, (uint8_t *)&Data, sizeof(Data)); + memProxy.writeBlob(MemAddr << 2, (uint8_t *)&Data, sizeof(Data)); } } return true; diff --git a/src/base/loader/hex_file.hh b/src/base/loader/hex_file.hh index 514a02a1e..fe34fddf0 100755 --- a/src/base/loader/hex_file.hh +++ b/src/base/loader/hex_file.hh @@ -52,7 +52,7 @@ class HexFile virtual ~HexFile(); void close(); - bool loadSections(PortProxy* memProxy); + bool loadSections(PortProxy& memProxy); }; #endif // __BASE_LOADER_HEX_FILE_HH__ diff --git a/src/base/loader/object_file.cc b/src/base/loader/object_file.cc index eaf0443bf..420611d83 100644 --- a/src/base/loader/object_file.cc +++ b/src/base/loader/object_file.cc @@ -65,16 +65,16 @@ ObjectFile::~ObjectFile() bool -ObjectFile::loadSection(Section *sec, PortProxy* memProxy, Addr addrMask) +ObjectFile::loadSection(Section *sec, PortProxy& memProxy, Addr addrMask) { if (sec->size != 0) { Addr addr = sec->baseAddr & addrMask; if (sec->fileImage) { - memProxy->writeBlob(addr, sec->fileImage, sec->size); + memProxy.writeBlob(addr, sec->fileImage, sec->size); } else { // no image: must be bss - memProxy->memsetBlob(addr, 0, sec->size); + memProxy.memsetBlob(addr, 0, sec->size); } } return true; @@ -82,7 +82,7 @@ ObjectFile::loadSection(Section *sec, PortProxy* memProxy, Addr addrMask) bool -ObjectFile::loadSections(PortProxy* memProxy, Addr addrMask) +ObjectFile::loadSections(PortProxy& memProxy, Addr addrMask) { return (loadSection(&text, memProxy, addrMask) && loadSection(&data, memProxy, addrMask) diff --git a/src/base/loader/object_file.hh b/src/base/loader/object_file.hh index ce58a2c4f..2ec41bf12 100644 --- a/src/base/loader/object_file.hh +++ b/src/base/loader/object_file.hh @@ -83,7 +83,7 @@ class ObjectFile void close(); - virtual bool loadSections(PortProxy *memProxy, Addr addrMask = + virtual bool loadSections(PortProxy& memProxy, Addr addrMask = std::numeric_limits::max()); virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask = std::numeric_limits::max()) = 0; @@ -111,7 +111,7 @@ class ObjectFile Section data; Section bss; - bool loadSection(Section *sec, PortProxy* memProxy, Addr addrMask); + bool loadSection(Section *sec, PortProxy& memProxy, Addr addrMask); void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; } public: diff --git a/src/base/remote_gdb.cc b/src/base/remote_gdb.cc index 7b38753e2..98e943084 100644 --- a/src/base/remote_gdb.cc +++ b/src/base/remote_gdb.cc @@ -461,11 +461,11 @@ BaseRemoteGDB::read(Addr vaddr, size_t size, char *data) DPRINTF(GDBRead, "read: addr=%#x, size=%d", vaddr, size); if (FullSystem) { - FSTranslatingPortProxy *port = context->getVirtProxy(); - port->readBlob(vaddr, (uint8_t*)data, size); + FSTranslatingPortProxy &proxy = context->getVirtProxy(); + proxy.readBlob(vaddr, (uint8_t*)data, size); } else { - SETranslatingPortProxy *port = context->getMemProxy(); - port->readBlob(vaddr, (uint8_t*)data, size); + SETranslatingPortProxy &proxy = context->getMemProxy(); + proxy.readBlob(vaddr, (uint8_t*)data, size); } #if TRACING_ON @@ -504,12 +504,11 @@ BaseRemoteGDB::write(Addr vaddr, size_t size, const char *data) DPRINTFNR("\n"); } if (FullSystem) { - FSTranslatingPortProxy *port = context->getVirtProxy(); - port->writeBlob(vaddr, (uint8_t*)data, size); + FSTranslatingPortProxy &proxy = context->getVirtProxy(); + proxy.writeBlob(vaddr, (uint8_t*)data, size); } else { - SETranslatingPortProxy *port = context->getMemProxy(); - port->writeBlob(vaddr, (uint8_t*)data, size); - delete port; + SETranslatingPortProxy &proxy = context->getMemProxy(); + proxy.writeBlob(vaddr, (uint8_t*)data, size); } return true; diff --git a/src/cpu/checker/thread_context.hh b/src/cpu/checker/thread_context.hh index d21de9f53..0d6fa6e2e 100644 --- a/src/cpu/checker/thread_context.hh +++ b/src/cpu/checker/thread_context.hh @@ -125,9 +125,9 @@ class CheckerThreadContext : public ThreadContext Process *getProcessPtr() { return actualTC->getProcessPtr(); } - PortProxy* getPhysProxy() { return actualTC->getPhysProxy(); } + PortProxy &getPhysProxy() { return actualTC->getPhysProxy(); } - FSTranslatingPortProxy* getVirtProxy() + FSTranslatingPortProxy &getVirtProxy() { return actualTC->getVirtProxy(); } //XXX: How does this work now? @@ -139,7 +139,7 @@ class CheckerThreadContext : public ThreadContext actualTC->connectMemPorts(tc); } - SETranslatingPortProxy* getMemProxy() { return actualTC->getMemProxy(); } + SETranslatingPortProxy &getMemProxy() { return actualTC->getMemProxy(); } /** Executes a syscall in SE mode. */ void syscall(int64_t callnum) diff --git a/src/cpu/inorder/thread_context.cc b/src/cpu/inorder/thread_context.cc index 1a7ac0890..72592c299 100644 --- a/src/cpu/inorder/thread_context.cc +++ b/src/cpu/inorder/thread_context.cc @@ -38,7 +38,7 @@ using namespace TheISA; -FSTranslatingPortProxy* +FSTranslatingPortProxy& InOrderThreadContext::getVirtProxy() { return thread->getVirtProxy(); diff --git a/src/cpu/inorder/thread_context.hh b/src/cpu/inorder/thread_context.hh index 5a9cfce32..0f9b1028e 100644 --- a/src/cpu/inorder/thread_context.hh +++ b/src/cpu/inorder/thread_context.hh @@ -115,9 +115,9 @@ class InOrderThreadContext : public ThreadContext TheISA::Kernel::Statistics *getKernelStats() { return thread->kernelStats; } - PortProxy* getPhysProxy() { return thread->getPhysProxy(); } + PortProxy &getPhysProxy() { return thread->getPhysProxy(); } - FSTranslatingPortProxy* getVirtProxy(); + FSTranslatingPortProxy &getVirtProxy(); void initMemProxies(ThreadContext *tc) { thread->initMemProxies(tc); } @@ -144,7 +144,7 @@ class InOrderThreadContext : public ThreadContext return this->thread->quiesceEvent; } - SETranslatingPortProxy* getMemProxy() { return thread->getMemProxy(); } + SETranslatingPortProxy &getMemProxy() { return thread->getMemProxy(); } /** Returns a pointer to this thread's process. */ Process *getProcessPtr() { return thread->getProcessPtr(); } diff --git a/src/cpu/o3/thread_context.hh b/src/cpu/o3/thread_context.hh index c2096fab2..8c32d1c05 100755 --- a/src/cpu/o3/thread_context.hh +++ b/src/cpu/o3/thread_context.hh @@ -114,14 +114,14 @@ class O3ThreadContext : public ThreadContext /** Returns a pointer to this thread's process. */ virtual Process *getProcessPtr() { return thread->getProcessPtr(); } - virtual PortProxy* getPhysProxy() { return thread->getPhysProxy(); } + virtual PortProxy &getPhysProxy() { return thread->getPhysProxy(); } - virtual FSTranslatingPortProxy* getVirtProxy(); + virtual FSTranslatingPortProxy &getVirtProxy(); virtual void initMemProxies(ThreadContext *tc) { thread->initMemProxies(tc); } - virtual SETranslatingPortProxy* getMemProxy() + virtual SETranslatingPortProxy &getMemProxy() { return thread->getMemProxy(); } /** Returns this thread's status. */ diff --git a/src/cpu/o3/thread_context_impl.hh b/src/cpu/o3/thread_context_impl.hh index 2ea39f3eb..ecc40bd14 100755 --- a/src/cpu/o3/thread_context_impl.hh +++ b/src/cpu/o3/thread_context_impl.hh @@ -50,7 +50,7 @@ #include "debug/O3CPU.hh" template -FSTranslatingPortProxy* +FSTranslatingPortProxy& O3ThreadContext::getVirtProxy() { return thread->getVirtProxy(); diff --git a/src/cpu/ozone/cpu.hh b/src/cpu/ozone/cpu.hh index ff43ad6cb..d2b90bff3 100644 --- a/src/cpu/ozone/cpu.hh +++ b/src/cpu/ozone/cpu.hh @@ -114,12 +114,12 @@ class OzoneCPU : public BaseCPU Process *getProcessPtr() { return thread->getProcessPtr(); } - PortProxy* getPhysProxy() { return thread->getPhysProxy(); } + PortProxy &getPhysProxy() { return thread->getPhysProxy(); } - FSTranslatingPortProxy* getVirtProxy() + FSTranslatingPortProxy &getVirtProxy() { return thread->getVirtProxy(); } - SETranslatingPortProxy* getMemProxy() { return thread->getMemProxy(); } + SETranslatingPortProxy &getMemProxy() { return thread->getMemProxy(); } Status status() const { return thread->status(); } diff --git a/src/cpu/simple_thread.hh b/src/cpu/simple_thread.hh index b6dc8f047..d12ee9a06 100644 --- a/src/cpu/simple_thread.hh +++ b/src/cpu/simple_thread.hh @@ -206,14 +206,6 @@ class SimpleThread : public ThreadState System *getSystemPtr() { return system; } - PortProxy* getPhysProxy() { return physProxy; } - - /** Return a virtual port. This port cannot be cached locally in an object. - * After a CPU switch it may point to the wrong memory object which could - * mean stale data. - */ - FSTranslatingPortProxy* getVirtProxy() { return virtProxy; } - Status status() const { return _status; } void setStatus(Status newStatus) { _status = newStatus; } diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh index 2f2e5b02b..41941b262 100644 --- a/src/cpu/thread_context.hh +++ b/src/cpu/thread_context.hh @@ -143,9 +143,9 @@ class ThreadContext virtual TheISA::Kernel::Statistics *getKernelStats() = 0; - virtual PortProxy* getPhysProxy() = 0; + virtual PortProxy &getPhysProxy() = 0; - virtual FSTranslatingPortProxy* getVirtProxy() = 0; + virtual FSTranslatingPortProxy &getVirtProxy() = 0; /** * Initialise the physical and virtual port proxies and tie them to @@ -155,7 +155,7 @@ class ThreadContext */ virtual void initMemProxies(ThreadContext *tc) = 0; - virtual SETranslatingPortProxy *getMemProxy() = 0; + virtual SETranslatingPortProxy &getMemProxy() = 0; virtual Process *getProcessPtr() = 0; @@ -319,13 +319,13 @@ class ProxyThreadContext : public ThreadContext TheISA::Kernel::Statistics *getKernelStats() { return actualTC->getKernelStats(); } - PortProxy* getPhysProxy() { return actualTC->getPhysProxy(); } + PortProxy &getPhysProxy() { return actualTC->getPhysProxy(); } - FSTranslatingPortProxy* getVirtProxy() { return actualTC->getVirtProxy(); } + FSTranslatingPortProxy &getVirtProxy() { return actualTC->getVirtProxy(); } void initMemProxies(ThreadContext *tc) { actualTC->initMemProxies(tc); } - SETranslatingPortProxy* getMemProxy() { return actualTC->getMemProxy(); } + SETranslatingPortProxy &getMemProxy() { return actualTC->getMemProxy(); } Process *getProcessPtr() { return actualTC->getProcessPtr(); } diff --git a/src/cpu/thread_state.cc b/src/cpu/thread_state.cc index 33c0d719c..3d58b4da4 100644 --- a/src/cpu/thread_state.cc +++ b/src/cpu/thread_state.cc @@ -106,6 +106,9 @@ ThreadState::initMemProxies(ThreadContext *tc) // (i.e. due to restoring from a checkpoint and later switching // in. if (physProxy == NULL) + // this cannot be done in the constructor as the thread state + // itself is created in the base cpu constructor and the + // getPort is a virtual function at the moment physProxy = new PortProxy(baseCpu->getDataPort()); if (virtProxy == NULL) virtProxy = new FSTranslatingPortProxy(tc); @@ -125,16 +128,12 @@ ThreadState::profileSample() profile->sample(profileNode, profilePC); } -SETranslatingPortProxy * +SETranslatingPortProxy & ThreadState::getMemProxy() { - if (proxy != NULL) - return proxy; - - /* Use this port proxy to for syscall emulation writes to memory. */ - proxy = new SETranslatingPortProxy(*process->system->getSystemPort(), - process, - SETranslatingPortProxy::NextPage); - - return proxy; + if (proxy == NULL) + proxy = new SETranslatingPortProxy(baseCpu->getDataPort(), + process, + SETranslatingPortProxy::NextPage); + return *proxy; } diff --git a/src/cpu/thread_state.hh b/src/cpu/thread_state.hh index d1ce83803..153049812 100644 --- a/src/cpu/thread_state.hh +++ b/src/cpu/thread_state.hh @@ -49,9 +49,6 @@ namespace TheISA { }; class Checkpoint; -class PortProxy; -class SETranslatingPort; -class FSTranslatingPort; /** * Struct for holding general thread state that is needed across CPU @@ -102,13 +99,13 @@ struct ThreadState { TheISA::Kernel::Statistics *getKernelStats() { return kernelStats; } - PortProxy* getPhysProxy() { return physProxy; } + PortProxy &getPhysProxy() { return *physProxy; } - FSTranslatingPortProxy* getVirtProxy() { return virtProxy; } + FSTranslatingPortProxy &getVirtProxy() { return *virtProxy; } Process *getProcessPtr() { return process; } - SETranslatingPortProxy* getMemProxy(); + SETranslatingPortProxy &getMemProxy(); /** Reads the number of instructions functionally executed and * committed. @@ -183,8 +180,8 @@ struct ThreadState { /** A translating port proxy, outgoing only, for functional * accesse to virtual addresses. */ - FSTranslatingPortProxy* virtProxy; - SETranslatingPortProxy* proxy; + FSTranslatingPortProxy *virtProxy; + SETranslatingPortProxy *proxy; public: /* diff --git a/src/dev/simple_disk.cc b/src/dev/simple_disk.cc index 9cec638b8..c611ec061 100644 --- a/src/dev/simple_disk.cc +++ b/src/dev/simple_disk.cc @@ -70,7 +70,7 @@ SimpleDisk::read(Addr addr, baddr_t block, int count) const for (int i = 0, j = 0; i < count; i += SectorSize, j++) image->read(data + i, block + j); - system->physProxy->writeBlob(addr, data, count); + system->physProxy.writeBlob(addr, data, count); DPRINTF(SimpleDisk, "read block=%#x len=%d\n", (uint64_t)block, count); DDUMP(SimpleDiskData, data, count); diff --git a/src/kern/tru64/tru64.hh b/src/kern/tru64/tru64.hh index 3b9bbd2bf..5cb1b92ec 100644 --- a/src/kern/tru64/tru64.hh +++ b/src/kern/tru64/tru64.hh @@ -397,7 +397,7 @@ class Tru64 : public OperatingSystem /// memory space. Used by statfs() and fstatfs(). template static void - copyOutStatfsBuf(SETranslatingPortProxy *mem, Addr addr, + copyOutStatfsBuf(SETranslatingPortProxy &mem, Addr addr, global_statfs *host) { using namespace TheISA; @@ -1160,13 +1160,13 @@ class Tru64_F64 : public Tru64 typedef F64_stat tgt_stat; /* - static void copyOutStatBuf(SETranslatingPortProxy *mem, Addr addr, + static void copyOutStatBuf(SETranslatingPortProxy &mem, Addr addr, global_stat *host) { Tru64::copyOutStatBuf(mem, addr, host); }*/ - static void copyOutStatfsBuf(SETranslatingPortProxy *mem, Addr addr, + static void copyOutStatfsBuf(SETranslatingPortProxy &mem, Addr addr, global_statfs *host) { Tru64::copyOutStatfsBuf(mem, addr, host); @@ -1206,13 +1206,13 @@ class Tru64_PreF64 : public Tru64 typedef pre_F64_stat tgt_stat; /* - static void copyOutStatBuf(SETranslatingPortProxy *mem, Addr addr, + static void copyOutStatBuf(SETranslatingPortProxy &mem, Addr addr, global_stat *host) { Tru64::copyOutStatBuf(mem, addr, host); }*/ - static void copyOutStatfsBuf(SETranslatingPortProxy *mem, Addr addr, + static void copyOutStatfsBuf(SETranslatingPortProxy &mem, Addr addr, global_statfs *host) { Tru64::copyOutStatfsBuf(mem, addr, host); diff --git a/src/mem/fs_translating_port_proxy.cc b/src/mem/fs_translating_port_proxy.cc index cbf85d1e4..7a028bdcb 100644 --- a/src/mem/fs_translating_port_proxy.cc +++ b/src/mem/fs_translating_port_proxy.cc @@ -121,29 +121,25 @@ void CopyOut(ThreadContext *tc, void *dest, Addr src, size_t cplen) { uint8_t *dst = (uint8_t *)dest; - FSTranslatingPortProxy* vp = tc->getVirtProxy(); - - vp->readBlob(src, dst, cplen); + tc->getVirtProxy().readBlob(src, dst, cplen); } void CopyIn(ThreadContext *tc, Addr dest, void *source, size_t cplen) { uint8_t *src = (uint8_t *)source; - FSTranslatingPortProxy* vp = tc->getVirtProxy(); - - vp->writeBlob(dest, src, cplen); + tc->getVirtProxy().writeBlob(dest, src, cplen); } void CopyStringOut(ThreadContext *tc, char *dst, Addr vaddr, size_t maxlen) { char *start = dst; - FSTranslatingPortProxy* vp = tc->getVirtProxy(); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); bool foundNull = false; while ((dst - start + 1) < maxlen && !foundNull) { - vp->readBlob(vaddr++, (uint8_t*)dst, 1); + vp.readBlob(vaddr++, (uint8_t*)dst, 1); if (dst == '\0') foundNull = true; dst++; @@ -156,11 +152,11 @@ CopyStringOut(ThreadContext *tc, char *dst, Addr vaddr, size_t maxlen) void CopyStringIn(ThreadContext *tc, char *src, Addr vaddr) { - FSTranslatingPortProxy* vp = tc->getVirtProxy(); + FSTranslatingPortProxy &vp = tc->getVirtProxy(); for (ChunkGenerator gen(vaddr, strlen(src), TheISA::PageBytes); !gen.done(); - gen.next()) + gen.next()) { - vp->writeBlob(gen.addr(), (uint8_t*)src, gen.size()); + vp.writeBlob(gen.addr(), (uint8_t*)src, gen.size()); src += gen.size(); } } diff --git a/src/mem/se_translating_port_proxy.hh b/src/mem/se_translating_port_proxy.hh index 71e8b4f50..105122850 100644 --- a/src/mem/se_translating_port_proxy.hh +++ b/src/mem/se_translating_port_proxy.hh @@ -47,7 +47,8 @@ #include "mem/page_table.hh" #include "mem/port_proxy.hh" -#include "sim/process.hh" + +class Process; /** * @file diff --git a/src/sim/process.cc b/src/sim/process.cc index 8f3b3be79..39b2d0777 100644 --- a/src/sim/process.cc +++ b/src/sim/process.cc @@ -1,4 +1,16 @@ /* + * Copyright (c) 2012 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * * Copyright (c) 2001-2005 The Regents of The University of Michigan * All rights reserved. * @@ -43,7 +55,6 @@ #include "config/the_isa.hh" #include "cpu/thread_context.hh" #include "mem/page_table.hh" -#include "mem/physical.hh" #include "mem/se_translating_port_proxy.hh" #include "params/LiveProcess.hh" #include "params/Process.hh" @@ -91,7 +102,11 @@ template struct AuxVector; Process::Process(ProcessParams * params) : SimObject(params), system(params->system), - max_stack_size(params->max_stack_size) + max_stack_size(params->max_stack_size), + M5_pid(system->allocatePID()), + pTable(new PageTable(name(), M5_pid)), + initVirtMem(system->getSystemPort(), this, + SETranslatingPortProxy::Always) { string in = params->input; string out = params->output; @@ -127,7 +142,6 @@ Process::Process(ProcessParams * params) else stderr_fd = Process::openOutputFile(err); - M5_pid = system->allocatePID(); // initialize first 3 fds (stdin, stdout, stderr) Process::FdMap *fdo = &fd_map[STDIN_FILENO]; fdo->fd = stdin_fd; @@ -159,7 +173,6 @@ Process::Process(ProcessParams * params) mmap_start = mmap_end = 0; nxm_start = nxm_end = 0; - pTable = new PageTable(name(), M5_pid); // other parameters will be initialized when the program is loaded } @@ -233,9 +246,6 @@ Process::initState() // mark this context as active so it will start ticking. tc->activate(0); - - initVirtMem = new SETranslatingPortProxy(*system->getSystemPort(), this, - SETranslatingPortProxy::Always); } // map simulator fd sim_fd to target fd tgt_fd diff --git a/src/sim/process.hh b/src/sim/process.hh index 17b530ab8..a5265f5b0 100644 --- a/src/sim/process.hh +++ b/src/sim/process.hh @@ -39,6 +39,7 @@ #include "base/statistics.hh" #include "base/types.hh" #include "config/the_isa.hh" +#include "mem/se_translating_port_proxy.hh" #include "sim/sim_object.hh" #include "sim/syscallreturn.hh" @@ -48,7 +49,6 @@ struct LiveProcessParams; class SyscallDesc; class System; class ThreadContext; -class SETranslatingPortProxy; template struct AuxVector @@ -121,17 +121,14 @@ class Process : public SimObject virtual void initState(); - protected: - /// Memory object for initialization (image loading) - SETranslatingPortProxy *initVirtMem; - public: - PageTable *pTable; //This id is assigned by m5 and is used to keep process' tlb entries //separated. uint64_t M5_pid; + PageTable* pTable; + class FdMap { public: @@ -152,6 +149,10 @@ class Process : public SimObject void unserialize(Checkpoint *cp, const std::string §ion); }; + protected: + /// Memory proxy for initialization (image loading) + SETranslatingPortProxy initVirtMem; + private: // file descriptor remapping support static const int MAX_FD = 256; // max legal fd value diff --git a/src/sim/process_impl.hh b/src/sim/process_impl.hh index 0fb827498..b1905834b 100644 --- a/src/sim/process_impl.hh +++ b/src/sim/process_impl.hh @@ -43,21 +43,21 @@ template void copyStringArray(std::vector &strings, AddrType array_ptr, AddrType data_ptr, - SETranslatingPortProxy* memProxy) + SETranslatingPortProxy& memProxy) { AddrType data_ptr_swap; for (std::vector::size_type i = 0; i < strings.size(); ++i) { data_ptr_swap = TheISA::htog(data_ptr); - memProxy->writeBlob(array_ptr, (uint8_t*)&data_ptr_swap, + memProxy.writeBlob(array_ptr, (uint8_t*)&data_ptr_swap, sizeof(AddrType)); - memProxy->writeString(data_ptr, strings[i].c_str()); + memProxy.writeString(data_ptr, strings[i].c_str()); array_ptr += sizeof(AddrType); data_ptr += strings[i].size() + 1; } // add NULL terminator data_ptr = 0; - memProxy->writeBlob(array_ptr, (uint8_t*)&data_ptr, sizeof(AddrType)); + memProxy.writeBlob(array_ptr, (uint8_t*)&data_ptr, sizeof(AddrType)); } #endif diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index dc8a9a5c8..9e53645f5 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -171,18 +171,18 @@ brkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) // if the address is already there, zero it out else { uint8_t zero = 0; - SETranslatingPortProxy *tp = tc->getMemProxy(); + SETranslatingPortProxy &tp = tc->getMemProxy(); // split non-page aligned accesses Addr next_page = roundUp(gen.addr(), VMPageSize); uint32_t size_needed = next_page - gen.addr(); - tp->memsetBlob(gen.addr(), zero, size_needed); + tp.memsetBlob(gen.addr(), zero, size_needed); if (gen.addr() + VMPageSize > next_page && next_page < new_brk && p->pTable->translate(next_page)) { size_needed = VMPageSize - size_needed; - tp->memsetBlob(next_page, zero, size_needed); + tp.memsetBlob(next_page, zero, size_needed); } } } @@ -358,7 +358,7 @@ readlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, p->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index))) return (TheISA::IntReg)-EFAULT; // Adjust path for current working directory @@ -382,7 +382,7 @@ unlinkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, p->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index))) return (TheISA::IntReg)-EFAULT; // Adjust path for current working directory @@ -399,7 +399,7 @@ mkdirFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, p->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index))) return (TheISA::IntReg)-EFAULT; // Adjust path for current working directory @@ -417,12 +417,12 @@ renameFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) string old_name; int index = 0; - if (!tc->getMemProxy()->tryReadString(old_name, p->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(old_name, p->getSyscallArg(tc, index))) return -EFAULT; string new_name; - if (!tc->getMemProxy()->tryReadString(new_name, p->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(new_name, p->getSyscallArg(tc, index))) return -EFAULT; // Adjust path for current working directory @@ -439,7 +439,7 @@ truncateFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, p->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index))) return -EFAULT; off_t length = p->getSyscallArg(tc, index); @@ -474,7 +474,7 @@ truncate64Func(SyscallDesc *desc, int num, int index = 0; string path; - if (!tc->getMemProxy()->tryReadString(path, process->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) return -EFAULT; int64_t length = process->getSyscallArg(tc, index, 64); @@ -527,7 +527,7 @@ chownFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, p->getSyscallArg(tc, index))) + if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index))) return -EFAULT; /* XXX endianess */ diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index ad00f6e3d..504add35f 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -121,18 +121,18 @@ class BaseBufferArg { // // copy data into simulator space (read from target memory) // - virtual bool copyIn(SETranslatingPortProxy* memproxy) + virtual bool copyIn(SETranslatingPortProxy &memproxy) { - memproxy->readBlob(addr, bufPtr, size); + memproxy.readBlob(addr, bufPtr, size); return true; // no EFAULT detection for now } // // copy data out of simulator space (write to target memory) // - virtual bool copyOut(SETranslatingPortProxy* memproxy) + virtual bool copyOut(SETranslatingPortProxy &memproxy) { - memproxy->writeBlob(addr, bufPtr, size); + memproxy.writeBlob(addr, bufPtr, size); return true; // no EFAULT detection for now } @@ -464,7 +464,7 @@ convertStat64Buf(target_stat &tgt, host_stat64 *host, bool fakeTTY = false) //Here are a couple convenience functions template static void -copyOutStatBuf(SETranslatingPortProxy* mem, Addr addr, +copyOutStatBuf(SETranslatingPortProxy &mem, Addr addr, hst_stat *host, bool fakeTTY = false) { typedef TypedBufferArg tgt_stat_buf; @@ -475,7 +475,7 @@ copyOutStatBuf(SETranslatingPortProxy* mem, Addr addr, template static void -copyOutStat64Buf(SETranslatingPortProxy* mem, Addr addr, +copyOutStat64Buf(SETranslatingPortProxy &mem, Addr addr, hst_stat64 *host, bool fakeTTY = false) { typedef TypedBufferArg tgt_stat_buf; @@ -530,7 +530,7 @@ openFunc(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) return -EFAULT; @@ -608,7 +608,7 @@ chmodFunc(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) { return -EFAULT; } @@ -714,7 +714,7 @@ statFunc(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) { return -EFAULT; } @@ -744,7 +744,7 @@ stat64Func(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) return -EFAULT; Addr bufPtr = process->getSyscallArg(tc, index); @@ -809,7 +809,7 @@ lstatFunc(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) { return -EFAULT; } @@ -838,7 +838,7 @@ lstat64Func(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) { return -EFAULT; } @@ -899,7 +899,7 @@ statfsFunc(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) { return -EFAULT; } @@ -958,19 +958,19 @@ writevFunc(SyscallDesc *desc, int callnum, LiveProcess *process, return -EBADF; } - SETranslatingPortProxy *p = tc->getMemProxy(); + SETranslatingPortProxy &p = tc->getMemProxy(); uint64_t tiov_base = process->getSyscallArg(tc, index); size_t count = process->getSyscallArg(tc, index); struct iovec hiov[count]; for (size_t i = 0; i < count; ++i) { typename OS::tgt_iovec tiov; - p->readBlob(tiov_base + i*sizeof(typename OS::tgt_iovec), - (uint8_t*)&tiov, sizeof(typename OS::tgt_iovec)); + p.readBlob(tiov_base + i*sizeof(typename OS::tgt_iovec), + (uint8_t*)&tiov, sizeof(typename OS::tgt_iovec)); hiov[i].iov_len = TheISA::gtoh(tiov.iov_len); hiov[i].iov_base = new char [hiov[i].iov_len]; - p->readBlob(TheISA::gtoh(tiov.iov_base), (uint8_t *)hiov[i].iov_base, - hiov[i].iov_len); + p.readBlob(TheISA::gtoh(tiov.iov_base), (uint8_t *)hiov[i].iov_base, + hiov[i].iov_len); } int result = writev(process->sim_fd(fd), hiov, count); @@ -1136,7 +1136,7 @@ utimesFunc(SyscallDesc *desc, int callnum, LiveProcess *process, std::string path; int index = 0; - if (!tc->getMemProxy()->tryReadString(path, + if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index))) { return -EFAULT; } @@ -1255,8 +1255,8 @@ timeFunc(SyscallDesc *desc, int callnum, LiveProcess *process, if(taddr != 0) { typename OS::time_t t = sec; t = TheISA::htog(t); - SETranslatingPortProxy *p = tc->getMemProxy(); - p->writeBlob(taddr, (uint8_t*)&t, (int)sizeof(typename OS::time_t)); + SETranslatingPortProxy &p = tc->getMemProxy(); + p.writeBlob(taddr, (uint8_t*)&t, (int)sizeof(typename OS::time_t)); } return sec; } diff --git a/src/sim/system.cc b/src/sim/system.cc index 1f7527426..36d4447ff 100644 --- a/src/sim/system.cc +++ b/src/sim/system.cc @@ -57,8 +57,6 @@ #include "debug/Loader.hh" #include "debug/WorkItems.hh" #include "kern/kernel_stats.hh" -#include "mem/fs_translating_port_proxy.hh" -#include "mem/mem_object.hh" #include "mem/physical.hh" #include "params/System.hh" #include "sim/byteswap.hh" @@ -79,6 +77,8 @@ System::System(Params *p) _numContexts(0), pagePtr(0), init_param(p->init_param), + physProxy(_systemPort), + virtProxy(_systemPort), loadAddrMask(p->load_addr_mask), nextPID(0), memoryMode(p->mem_mode), @@ -106,12 +106,6 @@ System::System(Params *p) kernelSymtab = new SymbolTable; if (!debugSymbolTable) debugSymbolTable = new SymbolTable; - - /** - * Get a port proxy to memory - */ - physProxy = new PortProxy(*getSystemPort()); - virtProxy = new FSTranslatingPortProxy(*getSystemPort()); } // Get the generic system master IDs diff --git a/src/sim/system.hh b/src/sim/system.hh index 9d11132e5..dd122161d 100644 --- a/src/sim/system.hh +++ b/src/sim/system.hh @@ -56,20 +56,18 @@ #include "cpu/pc_event.hh" #include "enums/MemoryMode.hh" #include "kern/system_events.hh" +#include "mem/fs_translating_port_proxy.hh" #include "mem/mem_object.hh" #include "mem/port.hh" #include "params/System.hh" class BaseCPU; class BaseRemoteGDB; -class FSTranslatingPortProxy; class GDBListener; class ObjectFile; class PhysicalMemory; class Platform; -class PortProxy; class ThreadContext; -class VirtualPort; class System : public MemObject { @@ -117,14 +115,14 @@ class System : public MemObject virtual void init(); /** - * Get a pointer to the system port that can be used by + * Get a reference to the system port that can be used by * non-structural simulation objects like processes or threads, or * external entities like loaders and debuggers, etc, to access * the memory system. * - * @return a pointer to the system port we own + * @return a reference to the system port we own */ - Port* getSystemPort() { return &_systemPort; } + Port& getSystemPort() { return _systemPort; } /** * Additional function to return the Port of a memory object. @@ -181,8 +179,8 @@ class System : public MemObject /** Port to physical memory used for writing object files into ram at * boot.*/ - PortProxy* physProxy; - FSTranslatingPortProxy* virtProxy; + PortProxy physProxy; + FSTranslatingPortProxy virtProxy; /** kernel symbol table */ SymbolTable *kernelSymtab; diff --git a/src/sim/vptr.hh b/src/sim/vptr.hh index eee575b6b..658959a90 100644 --- a/src/sim/vptr.hh +++ b/src/sim/vptr.hh @@ -71,8 +71,8 @@ class VPtr if (!ptr) return; - FSTranslatingPortProxy* proxy = tc->getVirtProxy(); - proxy->readBlob(ptr, buffer, sizeof(T)); + FSTranslatingPortProxy &proxy = tc->getVirtProxy(); + proxy.readBlob(ptr, buffer, sizeof(T)); } bool