Merge with the main repo.
authorGabe Black <gblack@eecs.umich.edu>
Sat, 28 Jan 2012 15:24:01 +0000 (07:24 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Sat, 28 Jan 2012 15:24:01 +0000 (07:24 -0800)
--HG--
rename : src/mem/vport.hh => src/mem/fs_translating_port_proxy.hh
rename : src/mem/translating_port.cc => src/mem/se_translating_port_proxy.cc
rename : src/mem/translating_port.hh => src/mem/se_translating_port_proxy.hh

70 files changed:
1  2 
src/arch/alpha/linux/system.cc
src/arch/alpha/linux/system.hh
src/arch/alpha/remote_gdb.cc
src/arch/alpha/system.cc
src/arch/alpha/system.hh
src/arch/alpha/utility.cc
src/arch/arm/utility.cc
src/arch/mips/linux/system.cc
src/arch/mips/stacktrace.cc
src/arch/mips/system.cc
src/arch/mips/utility.cc
src/arch/mips/vtophys.cc
src/arch/sparc/utility.cc
src/arch/x86/interrupts.cc
src/arch/x86/interrupts.hh
src/base/remote_gdb.cc
src/cpu/BaseCPU.py
src/cpu/base.cc
src/cpu/base.hh
src/cpu/checker/thread_context.hh
src/cpu/inorder/cpu.cc
src/cpu/inorder/cpu.hh
src/cpu/inorder/resources/cache_unit.cc
src/cpu/inorder/resources/cache_unit.hh
src/cpu/inorder/thread_context.cc
src/cpu/inorder/thread_context.hh
src/cpu/o3/O3CPU.py
src/cpu/o3/cpu.cc
src/cpu/o3/cpu.hh
src/cpu/o3/fetch_impl.hh
src/cpu/o3/iew.hh
src/cpu/o3/lsq.hh
src/cpu/o3/thread_context.hh
src/cpu/o3/thread_context_impl.hh
src/cpu/ozone/cpu.hh
src/cpu/ozone/cpu_impl.hh
src/cpu/ozone/front_end_impl.hh
src/cpu/ozone/lw_lsq.hh
src/cpu/simple/atomic.cc
src/cpu/simple/timing.cc
src/cpu/simple_thread.cc
src/cpu/simple_thread.hh
src/cpu/thread_context.hh
src/cpu/thread_state.cc
src/cpu/thread_state.hh
src/dev/Device.py
src/dev/Pci.py
src/dev/arm/RealView.py
src/dev/arm/gic.cc
src/dev/arm/gic.hh
src/dev/io_device.cc
src/dev/io_device.hh
src/dev/pcidev.cc
src/dev/pcidev.hh
src/dev/sparc/iob.cc
src/dev/x86/i82094aa.hh
src/kern/tru64/tru64.hh
src/mem/SConscript
src/mem/cache/base.cc
src/mem/cache/base.hh
src/mem/physical.cc
src/mem/se_translating_port_proxy.cc
src/sim/System.py
src/sim/process.cc
src/sim/process.hh
src/sim/process_impl.hh
src/sim/syscall_emul.hh
src/sim/system.cc
src/sim/system.hh
tests/configs/simple-timing-ruby.py

index e662ef9ce8c5e5b9983a0062d2ed7de1688660de,19a2a6ac3e14cc2bec36a6cf36782ba85361483b..6f3cf6b323f508089d57d724386e62bab47f7d92
@@@ -163,10 -176,10 +175,10 @@@ LinuxAlphaSystem::setDelayLoop(ThreadCo
      Addr addr = 0;
      if (kernelSymtab->findAddress("loops_per_jiffy", addr)) {
          Tick cpuFreq = tc->getCpuPtr()->frequency();
 -        Tick intrFreq = platform->intrFrequency();
 +        assert(intrFreq);
-         VirtualPort *vp;
+         FSTranslatingPortProxy* vp;
  
-         vp = tc->getVirtPort();
+         vp = tc->getVirtProxy();
          vp->writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988));
      }
  }
index 3e4de7b2a2e33e313760269d91897bc246a1d6c7,e2fda39a88d63a61449825d64e661277678fe5b4..5436a27b2d7381098d76e14ce9f5bf817d2da0cc
@@@ -128,7 -128,12 +128,14 @@@ class LinuxAlphaSystem : public AlphaSy
      LinuxAlphaSystem(Params *p);
      ~LinuxAlphaSystem();
  
+     /**
+      * Initialise the system
+      */
+     virtual void initState();
      void setDelayLoop(ThreadContext *tc);
++
++    const Params *params() const { return (const Params *)_params; }
  };
  
  #endif // __ARCH_ALPHA_LINUX_SYSTEM_HH__
index 4b285e7ecf6681f052e26531028b3d992ee934f8,cd9c8910d7a39503c858847313da7d8f6fc7bb9a..aaf9ecb3c11a2d04cade5b593395e22da290d36f
@@@ -156,51 -158,51 +156,51 @@@ RemoteGDB::RemoteGDB(System *_system, T
  bool
  RemoteGDB::acc(Addr va, size_t len)
  {
 -#if !FULL_SYSTEM
 -    panic("acc function needs to be rewritten for SE mode\n");
 -#else
 -    Addr last_va;
 -
 -    va = TruncPage(va);
 -    last_va = RoundPage(va + len);
 -
 -    do  {
 -        if (IsK0Seg(va)) {
 -            if (va < (K0SegBase + pmem->size())) {
 -                DPRINTF(GDBAcc, "acc:   Mapping is valid  K0SEG <= "
 -                        "%#x < K0SEG + size\n", va);
 +    if (FullSystem) {
 +        Addr last_va;
 +
 +        va = TruncPage(va);
 +        last_va = RoundPage(va + len);
 +
 +        do  {
 +            if (IsK0Seg(va)) {
 +                if (va < (K0SegBase + pmem->size())) {
 +                    DPRINTF(GDBAcc, "acc:   Mapping is valid  K0SEG <= "
 +                            "%#x < K0SEG + size\n", va);
 +                    return true;
 +                } else {
 +                    DPRINTF(GDBAcc, "acc:   Mapping invalid %#x "
 +                            "> K0SEG + size\n", va);
 +                    return false;
 +                }
 +            }
 +
 +            /**
 +             * This code says that all accesses to palcode (instruction
 +             * and data) are valid since there isn't a va->pa mapping
 +             * because palcode is accessed physically. At some point this
 +             * should probably be cleaned up but there is no easy way to
 +             * do it.
 +             */
 +
 +            if (PcPAL(va) || va < 0x10000)
                  return true;
 -            } else {
 -                DPRINTF(GDBAcc, "acc:   Mapping invalid %#x > K0SEG + size\n",
 -                        va);
 +
 +            Addr ptbr = context->readMiscRegNoEffect(IPR_PALtemp20);
 +            PageTableEntry pte =
-                 kernel_pte_lookup(context->getPhysPort(), ptbr, va);
++                kernel_pte_lookup(context->getPhysProxy(), ptbr, va);
 +            if (!pte.valid()) {
 +                DPRINTF(GDBAcc, "acc:   %#x pte is invalid\n", va);
                  return false;
              }
 -        }
 -
 -        /**
 -         * This code says that all accesses to palcode (instruction
 -         * and data) are valid since there isn't a va->pa mapping
 -         * because palcode is accessed physically. At some point this
 -         * should probably be cleaned up but there is no easy way to
 -         * do it.
 -         */
 -
 -        if (PcPAL(va) || va < 0x10000)
 -            return true;
 -
 -        Addr ptbr = context->readMiscRegNoEffect(IPR_PALtemp20);
 -        PageTableEntry pte =
 -            kernel_pte_lookup(context->getPhysProxy(), ptbr, va);
 -        if (!pte.valid()) {
 -            DPRINTF(GDBAcc, "acc:   %#x pte is invalid\n", va);
 -            return false;
 -        }
 -        va += PageBytes;
 -    } while (va < last_va);
 +            va += PageBytes;
 +        } while (va < last_va);
  
 -    DPRINTF(GDBAcc, "acc:   %#x mapping is valid\n", va);
 -    return true;
 -#endif
 +        DPRINTF(GDBAcc, "acc:   %#x mapping is valid\n", va);
 +        return true;
 +    } else {
 +        panic("acc function needs to be rewritten for SE mode\n");
 +    }
  }
  
  /*
Simple merge
Simple merge
index 0048e43e92d3e23938e311f87453836f1ddd39f1,4de77ffd4068d798973140b98c4c4f2c469d0503..efafec4bc1b2fdd601f969a8c1bc70f757b6e57f
   */
  
  #include "arch/alpha/utility.hh"
 -
 -#if FULL_SYSTEM
  #include "arch/alpha/vtophys.hh"
- #include "mem/vport.hh"
+ #include "mem/fs_translating_port_proxy.hh"
 -#endif
 +#include "sim/full_system.hh"
  
  namespace AlphaISA {
  
  uint64_t
  getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp)
  {
 -#if FULL_SYSTEM
 -    const int NumArgumentRegs = 6;
 -    if (number < NumArgumentRegs) {
 -        if (fp)
 -            return tc->readFloatRegBits(16 + number);
 -        else
 -            return tc->readIntReg(16 + number);
 +    if (FullSystem) {
 +        const int NumArgumentRegs = 6;
 +        if (number < NumArgumentRegs) {
 +            if (fp)
 +                return tc->readFloatRegBits(16 + number);
 +            else
 +                return tc->readIntReg(16 + number);
 +        } else {
 +            Addr sp = tc->readIntReg(StackPointerReg);
-             VirtualPort *vp = tc->getVirtPort();
++            FSTranslatingPortProxy* vp = tc->getVirtProxy();
 +            uint64_t arg = vp->read<uint64_t>(sp +
 +                               (number-NumArgumentRegs) * sizeof(uint64_t));
 +            return arg;
 +        }
      } else {
 -        Addr sp = tc->readIntReg(StackPointerReg);
 -        FSTranslatingPortProxy* vp = tc->getVirtProxy();
 -        uint64_t arg = vp->read<uint64_t>(sp +
 -                           (number-NumArgumentRegs) * sizeof(uint64_t));
 -        return arg;
 +        panic("getArgument() is Full system only\n");
 +        M5_DUMMY_RETURN;
      }
 -#else
 -    panic("getArgument() is Full system only\n");
 -    M5_DUMMY_RETURN;
 -#endif
  }
  
  void
index 6c2997a2772aa0b444977b713febdc0f581282fe,98195ab04ccdd0efb91f69deaafa20e55d476d98..42b5be18154ed39679226440c5444ec06ce54b31
  
  #include "arch/arm/faults.hh"
  #include "arch/arm/isa_traits.hh"
 +#include "arch/arm/tlb.hh"
  #include "arch/arm/utility.hh"
 -#include "cpu/thread_context.hh"
 -
 -#if FULL_SYSTEM
  #include "arch/arm/vtophys.hh"
- #include "mem/vport.hh"
 +#include "cpu/thread_context.hh"
 -#endif
 -
 -#include "arch/arm/tlb.hh"
+ #include "mem/fs_translating_port_proxy.hh"
 +#include "sim/full_system.hh"
  
  namespace ArmISA {
  
@@@ -63,49 -66,49 +63,49 @@@ initCPU(ThreadContext *tc, int cpuId
  uint64_t
  getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp)
  {
 -#if FULL_SYSTEM
 -    if (size == (uint16_t)(-1))
 -        size = ArmISA::MachineBytes;
 -    if (fp)
 -        panic("getArgument(): Floating point arguments not implemented\n");
 +    if (FullSystem) {
 +        if (size == (uint16_t)(-1))
 +            size = ArmISA::MachineBytes;
 +        if (fp)
 +            panic("getArgument(): Floating point arguments not implemented\n");
  
 -    if (number < NumArgumentRegs) {
 -        // If the argument is 64 bits, it must be in an even regiser number
 -        // Increment the number here if it isn't even
 -        if (size == sizeof(uint64_t)) {
 -            if ((number % 2) != 0)
 -                number++;
 -            // Read the two halves of the data
 -            // number is inc here to get the second half of the 64 bit reg
 -            uint64_t tmp;
 -            tmp = tc->readIntReg(number++);
 -            tmp |= tc->readIntReg(number) << 32;
 -            return tmp;
 +        if (number < NumArgumentRegs) {
 +            // If the argument is 64 bits, it must be in an even regiser
 +            // number. Increment the number here if it isn't even.
 +            if (size == sizeof(uint64_t)) {
 +                if ((number % 2) != 0)
 +                    number++;
 +                // Read the two halves of the data. Number is inc here to
 +                // get the second half of the 64 bit reg.
 +                uint64_t tmp;
 +                tmp = tc->readIntReg(number++);
 +                tmp |= tc->readIntReg(number) << 32;
 +                return tmp;
 +            } else {
 +               return tc->readIntReg(number);
 +            }
          } else {
 -           return tc->readIntReg(number);
 -        }
 -    } else {
 -        Addr sp = tc->readIntReg(StackPointerReg);
 -        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)
 +            Addr sp = tc->readIntReg(StackPointerReg);
-             VirtualPort *vp = tc->getVirtPort();
++            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<uint64_t>(sp +
 +                        (number-NumArgumentRegs) * sizeof(uint32_t));
 +                // since two 32 bit args == 1 64 bit arg, increment number
                  number++;
 -            arg = vp->read<uint64_t>(sp +
 -                    (number-NumArgumentRegs) * sizeof(uint32_t));
 -            // since two 32 bit args == 1 64 bit arg, increment number
 -            number++;
 -        } else {
 -            arg = vp->read<uint32_t>(sp +
 -                           (number-NumArgumentRegs) * sizeof(uint32_t));
 +            } else {
 +                arg = vp->read<uint32_t>(sp +
 +                               (number-NumArgumentRegs) * sizeof(uint32_t));
 +            }
 +            return arg;
          }
 -        return arg;
 +    } else {
 +        panic("getArgument() only implemented for full system mode.\n");
 +        M5_DUMMY_RETURN
      }
 -#else
 -    panic("getArgument() only implemented for FULL_SYSTEM\n");
 -    M5_DUMMY_RETURN
 -#endif
  }
  
  void
index 30e0f95e9f1034496c83c5c70d591559afeb267e,7cfa043e233e5c35efb1fb035b27df41c1fdf840..f97426f8578f7e6bf9c83565e64a12fb65740a67
@@@ -63,91 -62,91 +63,10 @@@ using namespace Linux
  LinuxMipsSystem::LinuxMipsSystem(Params *p)
      : MipsSystem(p)
  {
--    Addr addr = 0;
--
--    /**
--     * The symbol swapper_pg_dir marks the beginning of the kernel and
--     * the location of bootloader passed arguments
--     */
--    if (!kernelSymtab->findAddress("swapper_pg_dir", KernelStart)) {
--        panic("Could not determine start location of kernel");
--    }
--
--    /**
--     * Since we aren't using a bootloader, we have to copy the
--     * kernel arguments directly into the kernel's memory.
--     */
-     virtPort->writeBlob(CommandLine(), (uint8_t*)params()->boot_osflags.c_str(),
 -    virtPort.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
--     * so we don't through the lengthly process of trying to
--     * calculated it by using the PIT, RTC, etc.
--     */
--    if (kernelSymtab->findAddress("est_cycle_freq", addr))
-         virtPort->write(addr, (uint64_t)(SimClock::Frequency /
 -        virtPort.write(addr, (uint64_t)(SimClock::Frequency /
--                    p->boot_cpu_frequency));
--
--    /**
--     * EV5 only supports 127 ASNs so we are going to tell the kernel that the
--     * paritiuclar EV6 we have only supports 127 asns.
--     * @todo At some point we should change ev5.hh and the palcode to support
--     * 255 ASNs.
--     */
--    if (kernelSymtab->findAddress("dp264_mv", addr))
-         virtPort->write(addr + 0x18, LittleEndianGuest::htog((uint32_t)127));
 -        virtPort.write(addr + 0x18, LittleEndianGuest::htog((uint32_t)127));
--    else
--        panic("could not find dp264_mv\n");
--
--#ifndef NDEBUG
--    kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic");
--    if (!kernelPanicEvent)
--        panic("could not find kernel symbol \'panic\'");
--
--#endif
--
--    /**
--     * Any time ide_delay_50ms, calibarte_delay or
--     * determine_cpu_caches is called just skip the
--     * function. Currently determine_cpu_caches only is used put
--     * information in proc, however if that changes in the future we
--     * will have to fill in the cache size variables appropriately.
--     */
--
--    skipIdeDelay50msEvent =
--        addKernelFuncEvent<SkipFuncEvent>("ide_delay_50ms");
--    skipDelayLoopEvent =
--        addKernelFuncEvent<SkipDelayLoopEvent>("calibrate_delay");
--    skipCacheProbeEvent =
--        addKernelFuncEvent<SkipFuncEvent>("determine_cpu_caches");
--    debugPrintkEvent = addKernelFuncEvent<DebugPrintkEvent>("dprintk");
--    idleStartEvent = addKernelFuncEvent<IdleStartEvent>("cpu_idle");
--
--    // Disable for now as it runs into panic() calls in VPTr methods
--    // (see sim/vptr.hh).  Once those bugs are fixed, we can
--    // re-enable, but we should find a better way to turn it on than
--    // using DTRACE(Thread), since looking at a trace flag at tick 0
--    // leads to non-intuitive behavior with --trace-start.
--    if (false && kernelSymtab->findAddress("mips_switch_to", addr)) {
--        printThreadEvent = new PrintThreadInfo(&pcEventQueue, "threadinfo",
--                                               addr + sizeof(MachInst) * 6);
--    } else {
--        printThreadEvent = NULL;
--    }
  }
  
  LinuxMipsSystem::~LinuxMipsSystem()
  {
--#ifndef NDEBUG
--    delete kernelPanicEvent;
--#endif
--    delete skipIdeDelay50msEvent;
--    delete skipDelayLoopEvent;
--    delete skipCacheProbeEvent;
--    delete debugPrintkEvent;
--    delete idleStartEvent;
--    delete printThreadEvent;
  }
  
  
index 50f6e1fb06faef66967e080a88a144ea95fee634,ced60b88ea890a23cb21d856ccd2d2f6ddcf54c7..d4548b4bb81c1e7907e6ed02f10da7437453dee8
@@@ -37,7 -37,6 +37,7 @@@
  #include "base/trace.hh"
  #include "cpu/base.hh"
  #include "cpu/thread_context.hh"
- #include "mem/vport.hh"
++#include "mem/fs_translating_port_proxy.hh"
  #include "sim/system.hh"
  
  using namespace std;
index d367acd6401a034f14f8153625d890c3e68aed2f,c1735b74074e753f8e619f1c0eb5e65e9a660994..f0d4c250eebd94c34070454e455f9ac782988ca2
@@@ -46,67 -45,70 +45,6 @@@ using namespace LittleEndianGuest
  
  MipsSystem::MipsSystem(Params *p) : System(p)
  {
 -
 -#if FULL_SYSTEM
--    if (p->bare_iron == true) {
--        hexFile = new HexFile(params()->hex_file_name);
--        if (!hexFile->loadSections(functionalPort))
--            panic("Could not load hex file\n");
--    }
--
--    Addr addr = 0;
--
--    consoleSymtab = new SymbolTable;
--
--
--    /**
--     * Load the console code into memory
--     */
--    //    Load Console Code
--    console = createObjectFile(params()->console);
--
--    warn("console code is located at: %s\n", params()->console);
--
--    if (console == NULL)
--        fatal("Could not load console file %s", params()->console);
--    //Load program sections into memory
--    console->loadSections(functionalPort, loadAddrMask);
--
--    //load symbols
--    if (!console->loadGlobalSymbols(consoleSymtab))
--        panic("could not load console symbols\n");
--
--    if (!console->loadGlobalSymbols(debugSymbolTable))
--        panic("could not load console symbols\n");
--
--
--#ifndef NDEBUG
--    consolePanicEvent = addConsoleFuncEvent<BreakPCEvent>("panic");
--#endif
--
--    /**
--     * Copy the osflags (kernel arguments) into the consoles
--     * memory. (Presently Linux does not use the console service
--     * routine to get these command line arguments, but Tru64 and
--     * others do.)
--     */
--    if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
--        warn("writing addr starting from %#x", addr);
--        virtPort->writeBlob(addr, (uint8_t*)params()->boot_osflags.c_str(),
--                strlen(params()->boot_osflags.c_str()));
--    }
--
--    /**
--     * Set the hardware reset parameter block system type and revision
--     * information to Tsunami.
--     */
--    if (consoleSymtab->findAddress("m5_rpb", addr)) {
--        uint64_t data;
--        data = htog(params()->system_type);
--        virtPort->write(addr + 0x50, data);
--        data = htog(params()->system_rev);
--        virtPort->write(addr + 0x58, data);
--    } else {
--        panic("could not find hwrpb\n");
--    }
 -#endif
  }
  
  MipsSystem::~MipsSystem()
index 1f3b19c7bbe9c1e68926489dcde2af3be1e7fb2a,fc6e9e2f9250b6ad30584671eb0270a09021958a..65432b4eab1ac331050f09b89cc41661b7aa94a2
  #include <cmath>
  
  #include "arch/mips/isa_traits.hh"
++#include "arch/mips/registers.hh"
  #include "arch/mips/utility.hh"
++#include "arch/mips/vtophys.hh"
  #include "base/bitfield.hh"
  #include "base/misc.hh"
 -#include "config/full_system.hh"
  #include "cpu/static_inst.hh"
  #include "cpu/thread_context.hh"
 -#include "sim/serialize.hh"
 -
 -#if FULL_SYSTEM
 -#include "arch/mips/registers.hh"
 -#include "arch/mips/vtophys.hh"
+ #include "mem/fs_translating_port_proxy.hh"
 -#endif
 +#include "sim/serialize.hh"
  
- #include "arch/mips/registers.hh"
- #include "arch/mips/vtophys.hh"
- #include "mem/vport.hh"
  
  using namespace MipsISA;
  using namespace std;
index c6a317df893162c16ef7b6c2738530be6a14b8cc,08e1a1e1c7fc6445ea925ceb1214bc67017e40f8..60d9bc1baea14188f7c123acb63f346cdad4c9f4
@@@ -37,8 -37,7 +37,7 @@@
  #include "base/chunk_generator.hh"
  #include "base/trace.hh"
  #include "cpu/thread_context.hh"
 -#include "mem/vport.hh"
 +#include "debug/VtoPhys.hh"
- #include "mem/vport.hh"
  
  using namespace std;
  using namespace MipsISA;
index 63b8e7960d499b0771ffe7f6f8c49270070f2aa0,1c9cf552d5d4b5190293f59a77fd5a169ea5f983..74b1b279409db73f2a5b462dff809e0b7ae021e8
  
  #include "arch/sparc/faults.hh"
  #include "arch/sparc/utility.hh"
 -#if FULL_SYSTEM
  #include "arch/sparc/vtophys.hh"
- #include "mem/vport.hh"
+ #include "mem/fs_translating_port_proxy.hh"
 -#endif
  
  namespace SparcISA {
  
  uint64_t
  getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp)
  {
 -#if FULL_SYSTEM
 -    const int NumArgumentRegs = 6;
 -    if (number < NumArgumentRegs) {
 -        return tc->readIntReg(8 + number);
 +    if (FullSystem) {
 +        const int NumArgumentRegs = 6;
 +        if (number < NumArgumentRegs) {
 +            return tc->readIntReg(8 + number);
 +        } else {
 +            Addr sp = tc->readIntReg(StackPointerReg);
-             VirtualPort *vp = tc->getVirtPort();
++            FSTranslatingPortProxy* vp = tc->getVirtProxy();
 +            uint64_t arg = vp->read<uint64_t>(sp + 92 +
 +                                (number-NumArgumentRegs) * sizeof(uint64_t));
 +            return arg;
 +        }
      } else {
 -        Addr sp = tc->readIntReg(StackPointerReg);
 -        FSTranslatingPortProxy* vp = tc->getVirtProxy();
 -        uint64_t arg = vp->read<uint64_t>(sp + 92 +
 -                            (number-NumArgumentRegs) * sizeof(uint64_t));
 -        return arg;
 +        panic("getArgument() only implemented for full system\n");
 +        M5_DUMMY_RETURN
      }
 -#else
 -    panic("getArgument() only implemented for FULL_SYSTEM\n");
 -    M5_DUMMY_RETURN
 -#endif
  }
  
  void
Simple merge
Simple merge
index 021ef3684b44fd5f1fa4900d766199f982a153b2,1d8256b424152761d0c5967fa1c90f5150e5a893..7b38753e246c362646e626212b45d34093d8dda3
  #include "cpu/thread_context.hh"
  #include "debug/GDBAll.hh"
  #include "mem/port.hh"
- #include "mem/translating_port.hh"
- #include "mem/vport.hh"
++#include "mem/fs_translating_port_proxy.hh"
+ #include "mem/se_translating_port_proxy.hh"
 +#include "sim/full_system.hh"
  #include "sim/system.hh"
  
  using namespace std;
@@@ -460,13 -464,12 +460,13 @@@ BaseRemoteGDB::read(Addr vaddr, size_t 
  
      DPRINTF(GDBRead, "read:  addr=%#x, size=%d", vaddr, size);
  
 -#if FULL_SYSTEM
 -    FSTranslatingPortProxy *port = context->getVirtProxy();
 -#else
 -    SETranslatingPortProxy *port = context->getMemProxy();
 -#endif
 -    port->readBlob(vaddr, (uint8_t*)data, size);
 +    if (FullSystem) {
-         VirtualPort *port = context->getVirtPort();
++        FSTranslatingPortProxy *port = context->getVirtProxy();
 +        port->readBlob(vaddr, (uint8_t*)data, size);
 +    } else {
-         TranslatingPort *port = context->getMemPort();
++        SETranslatingPortProxy *port = context->getMemProxy();
 +        port->readBlob(vaddr, (uint8_t*)data, size);
 +    }
  
  #if TRACING_ON
      if (DTRACE(GDBRead)) {
@@@ -503,14 -506,15 +503,14 @@@ BaseRemoteGDB::write(Addr vaddr, size_
          } else
              DPRINTFNR("\n");
      }
 -#if FULL_SYSTEM
 -    FSTranslatingPortProxy *port = context->getVirtProxy();
 -#else
 -    SETranslatingPortProxy *port = context->getMemProxy();
 -#endif
 -    port->writeBlob(vaddr, (uint8_t*)data, size);
 -#if !FULL_SYSTEM
 -    delete port;
 -#endif
 +    if (FullSystem) {
-         VirtualPort *port = context->getVirtPort();
++        FSTranslatingPortProxy *port = context->getVirtProxy();
 +        port->writeBlob(vaddr, (uint8_t*)data, size);
 +    } else {
-         TranslatingPort *port = context->getMemPort();
++        SETranslatingPortProxy *port = context->getMemProxy();
 +        port->writeBlob(vaddr, (uint8_t*)data, size);
 +        delete port;
 +    }
  
      return true;
  }
index 50a8501e2f8f8d58cab119c0c46895d25d66fe08,6800b4c9199def74ef8d67562b62cb6e1c7e62a1..19464acbccb5fbe60f94bcc0765d6f778c9b0373
@@@ -138,12 -152,15 +138,15 @@@ class BaseCPU(MemObject)
  
      tracer = Param.InstTracer(default_tracer, "Instruction tracer")
  
-     _cached_ports = []
+     icache_port = Port("Instruction Port")
+     dcache_port = Port("Data Port")
+     _cached_ports = ['icache_port', 'dcache_port']
 -    if buildEnv['TARGET_ISA'] in ['x86', 'arm'] and buildEnv['FULL_SYSTEM']:
 +    if buildEnv['TARGET_ISA'] in ['x86', 'arm']:
-         _cached_ports = ["itb.walker.port", "dtb.walker.port"]
+         _cached_ports += ["itb.walker.port", "dtb.walker.port"]
  
      _uncached_ports = []
 -    if buildEnv['TARGET_ISA'] == 'x86' and buildEnv['FULL_SYSTEM']:
 +    if buildEnv['TARGET_ISA'] == 'x86':
          _uncached_ports = ["interrupts.pio", "interrupts.int_port"]
  
      def connectCachedPorts(self, bus):
diff --cc src/cpu/base.cc
Simple merge
diff --cc src/cpu/base.hh
Simple merge
index 6c3c50a9c2136879260223f7d982e02c39aa1929,4eb3eabfd1589823381232e72422f5b171c89f6b..178ded80e3906d3aab44df6cbff39bfe025703c6
@@@ -96,14 -97,15 +96,14 @@@ class CheckerThreadContext : public Thr
      TheISA::Kernel::Statistics *getKernelStats()
      { return actualTC->getKernelStats(); }
  
-     TranslatingPort *getMemPort() { return actualTC->getMemPort(); }
 +    Process *getProcessPtr() { return actualTC->getProcessPtr(); }
 +
+     PortProxy* getPhysProxy() { return actualTC->getPhysProxy(); }
  
-     VirtualPort *getVirtPort()
-     { return actualTC->getVirtPort(); }
+     FSTranslatingPortProxy* getVirtProxy()
+     { return actualTC->getVirtProxy(); }
 -#else
 -    SETranslatingPortProxy* getMemProxy() { return actualTC->getMemProxy(); }
  
-     FunctionalPort *getPhysPort() { return actualTC->getPhysPort(); }
 -    Process *getProcessPtr() { return actualTC->getProcessPtr(); }
 -#endif
++    SETranslatingPortProxy* getMemProxy() { return actualTC->getMemProxy(); }
  
      Status status() const { return actualTC->status(); }
  
index 010bdb512c7d83c457234bbfd8608785648a2786,9614a5df2f17082cc5cc02763c9615ba4b2730ac..5a14e92a74ec3b976d7d59f298b4400d63992009
  #include "debug/RefCount.hh"
  #include "debug/SkedCache.hh"
  #include "debug/Quiesce.hh"
- #include "mem/translating_port.hh"
  #include "params/InOrderCPU.hh"
 +#include "sim/full_system.hh"
  #include "sim/process.hh"
  #include "sim/stat_control.hh"
 -
 -#if FULL_SYSTEM
 -#include "cpu/quiesce_event.hh"
  #include "sim/system.hh"
 -#endif
  
  #if THE_ISA == ALPHA_ISA
  #include "arch/alpha/osfpal.hh"
@@@ -754,12 -761,14 +753,14 @@@ InOrderCPU::init(
      for (ThreadID tid = 0; tid < numThreads; ++tid)
          thread[tid]->inSyscall = true;
  
 -#if FULL_SYSTEM
 -    for (ThreadID tid = 0; tid < numThreads; tid++) {
 -        ThreadContext *src_tc = threadContexts[tid];
 -        TheISA::initCPU(src_tc, src_tc->contextId());
 -        // Initialise the ThreadContext's memory proxies
 -        thread[tid]->initMemProxies(thread[tid]->getTC());
 +    if (FullSystem) {
 +        for (ThreadID tid = 0; tid < numThreads; tid++) {
 +            ThreadContext *src_tc = threadContexts[tid];
 +            TheISA::initCPU(src_tc, src_tc->contextId());
++            // Initialise the ThreadContext's memory proxies
++            thread[tid]->initMemProxies(thread[tid]->getTC());
 +        }
      }
 -#endif
  
      // Clear inSyscall.
      for (ThreadID tid = 0; tid < numThreads; ++tid)
@@@ -860,7 -870,7 +861,6 @@@ InOrderCPU::getInterrupts(
      return interrupts->getInterrupt(threadContexts[0]);
  }
  
--
  void
  InOrderCPU::processInterrupts(Fault interrupt)
  {
      trap(interrupt, threadContexts[0]->contextId(), dummyBufferInst);
  }
  
- void
- InOrderCPU::updateMemPorts()
- {
-     // Update all ThreadContext's memory ports (Functional/Virtual
-     // Ports)
-     ThreadID size = thread.size();
-     for (ThreadID i = 0; i < size; ++i)
-         thread[i]->connectMemPorts(thread[i]->getTC());
- }
 -#endif
--
  void
  InOrderCPU::trapContext(Fault fault, ThreadID tid, DynInstPtr inst, int delay)
  {
Simple merge
index 5f141a1b343a4d61922df002267c16584a373e90,82e681f04add19f0eb173df05d8cc256ddc55711..acfcf09392e1d7e9dc08461523e4a9aedf3a479c
  
  using namespace TheISA;
  
- VirtualPort *
- InOrderThreadContext::getVirtPort()
 -#if FULL_SYSTEM
 -
+ FSTranslatingPortProxy*
+ InOrderThreadContext::getVirtProxy()
  {
-     return thread->getVirtPort();
+     return thread->getVirtProxy();
  }
  
 -
  void
  InOrderThreadContext::dumpFuncProfile()
  {
index 84d62137ebbcf7ccc61f084ece03e54ddfbc8dcb,5b67d7e8b221b788c231c3346a0b1e01ee30dc00..7fe0fb5ef117d4551fa3eca676bf1ecd38a2e21f
@@@ -141,15 -146,13 +145,12 @@@ class InOrderThreadContext : public Thr
      {
          return this->thread->quiesceEvent;
      }
 -#else
 +
+     SETranslatingPortProxy* getMemProxy() { return thread->getMemProxy(); }
      /** Returns a pointer to this thread's process. */
      Process *getProcessPtr() { return thread->getProcessPtr(); }
 -#endif
  
-     TranslatingPort *getMemPort() { return thread->getMemPort(); }
-     VirtualPort *getVirtPort();
-     FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
      /** Returns this thread's status. */
      Status status() const { return thread->status(); }
  
Simple merge
index 5d3af6c70268a992207a2a78edf713ed72dc5114,7e0b4cee7bd8c779ccc8ddc45dd9fb9d90b4a77e..ef08c96f436ebb5e6d01551861c6cd6c66f4f7e2
@@@ -215,7 -269,10 +266,8 @@@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUPa
      if (params->checker) {
          BaseCPU *temp_checker = params->checker;
          checker = dynamic_cast<Checker<DynInstPtr> *>(temp_checker);
 -#if FULL_SYSTEM
+         checker->setIcachePort(&icachePort);
          checker->setSystem(params->system);
 -#endif
      } else {
          checker = NULL;
      }
@@@ -600,12 -658,21 +652,21 @@@ FullO3CPU<Impl>::init(
      for (ThreadID tid = 0; tid < numThreads; ++tid)
          thread[tid]->inSyscall = true;
  
 -#if FULL_SYSTEM
 -    for (ThreadID tid = 0; tid < numThreads; tid++) {
 -        ThreadContext *src_tc = threadContexts[tid];
 -        TheISA::initCPU(src_tc, src_tc->contextId());
 -        // Initialise the ThreadContext's memory proxies
 -        thread[tid]->initMemProxies(thread[tid]->getTC());
+     // this CPU could still be unconnected if we are restoring from a
+     // checkpoint and this CPU is to be switched in, thus we can only
+     // do this here if the instruction port is actually connected, if
+     // not we have to do it as part of takeOverFrom
+     if (icachePort.isConnected())
+         fetch.setIcache();
 +    if (FullSystem) {
 +        for (ThreadID tid = 0; tid < numThreads; tid++) {
 +            ThreadContext *src_tc = threadContexts[tid];
 +            TheISA::initCPU(src_tc, src_tc->contextId());
++            // Initialise the ThreadContext's memory proxies
++            thread[tid]->initMemProxies(thread[tid]->getTC());
 +        }
      }
 -#endif
  
      // Clear inSyscall.
      for (int tid = 0; tid < numThreads; ++tid)
@@@ -967,17 -1035,8 +1028,6 @@@ FullO3CPU<Impl>::processInterrupts(Faul
      this->trap(interrupt, 0, NULL);
  }
  
- template <class Impl>
- void
- FullO3CPU<Impl>::updateMemPorts()
- {
-     // Update all ThreadContext's memory ports (Functional/Virtual
-     // Ports)
-     ThreadID size = thread.size();
-     for (ThreadID i = 0; i < size; ++i)
-         thread[i]->connectMemPorts(thread[i]->getTC());
- }
 -#endif
--
  template <class Impl>
  void
  FullO3CPU<Impl>::trap(Fault fault, ThreadID tid, StaticInstPtr inst)
Simple merge
Simple merge
Simple merge
Simple merge
index 815c9cb64757acaf828b28e43a9bae2e5daf0cee,6ac74577078b40aba0f70eaeefd5f5673a54e318..ff6ca00939bbb7a64fbc0d4ab88f06e570138ff9
@@@ -96,18 -97,19 +96,19 @@@ class O3ThreadContext : public ThreadCo
      virtual TheISA::Kernel::Statistics *getKernelStats()
      { return thread->kernelStats; }
  
-     virtual void connectMemPorts(ThreadContext *tc)
-     { thread->connectMemPorts(tc); }
 +    /** Returns a pointer to this thread's process. */
 +    virtual Process *getProcessPtr() { return thread->getProcessPtr(); }
 +
-     virtual TranslatingPort *getMemPort() { return thread->getMemPort(); }
+     virtual PortProxy* getPhysProxy() { return thread->getPhysProxy(); }
+     virtual FSTranslatingPortProxy* getVirtProxy();
  
-     virtual VirtualPort *getVirtPort();
+     virtual void initMemProxies(ThreadContext *tc)
+     { thread->initMemProxies(tc); }
 -#else
 +
-     virtual FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
+     virtual SETranslatingPortProxy* getMemProxy()
+     { return thread->getMemProxy(); }
  
 -    /** Returns a pointer to this thread's process. */
 -    virtual Process *getProcessPtr() { return thread->getProcessPtr(); }
 -#endif
      /** Returns this thread's status. */
      virtual Status status() const { return thread->status(); }
  
index 15fc397dc95e2d15cccfe8ef76ec12aa988cfbff,4c2fee22d57a0fa45ec028fbfaeb4cb42bbdf2a3..5ba4544584b9b942298d0583df9935b20e228f4f
  #include "cpu/quiesce_event.hh"
  #include "debug/O3CPU.hh"
  
 -#if FULL_SYSTEM
  template <class Impl>
VirtualPort *
- O3ThreadContext<Impl>::getVirtPort()
FSTranslatingPortProxy*
+ O3ThreadContext<Impl>::getVirtProxy()
  {
-     return thread->getVirtPort();
+     return thread->getVirtProxy();
  }
  
  template <class Impl>
index 36df58ab5695eb8e549098c52876f3feda8af45f,541fea44cfd5b823768a0bb58e4e1b556f959616..ff43ad6cb1e3eddd8aef9624f223a54b9d053544
@@@ -112,14 -124,15 +112,14 @@@ class OzoneCPU : public BaseCP
          TheISA::Kernel::Statistics *getKernelStats()
          { return thread->getKernelStats(); }
  
-         TranslatingPort *getMemPort() { return thread->getMemPort(); }
 +        Process *getProcessPtr() { return thread->getProcessPtr(); }
 +
+         PortProxy* getPhysProxy() { return thread->getPhysProxy(); }
  
-         VirtualPort *getVirtPort()
-         { return thread->getVirtPort(); }
+         FSTranslatingPortProxy* getVirtProxy()
+         { return thread->getVirtProxy(); }
 -#else
 -        SETranslatingPortProxy* getMemProxy() { return thread->getMemProxy(); }
  
-         FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
 -        Process *getProcessPtr() { return thread->getProcessPtr(); }
 -#endif
++        SETranslatingPortProxy* getMemProxy() { return thread->getMemProxy(); }
  
          Status status() const { return thread->status(); }
  
index e2f5dc10cd257fd2b1d10ead4a41c3ba7ef3041e,273d46bdc8020fe0aa8193e87fa75d551f48fae9..f532078fec3aede0a44a064a2749c27775f7475c
@@@ -186,25 -194,9 +186,7 @@@ OzoneCPU<Impl>::OzoneCPU(Params *p
      frontEnd->renameTable.copyFrom(thread.renameTable);
      backEnd->renameTable.copyFrom(thread.renameTable);
  
-     if (FullSystem) {
-         Port *mem_port;
-         FunctionalPort *phys_port;
-         VirtualPort *virt_port;
-         phys_port = new FunctionalPort(csprintf("%s-%d-funcport",
-                                                 name(), 0));
-         mem_port = system->physmem->getPort("functional");
-         mem_port->setPeer(phys_port);
-         phys_port->setPeer(mem_port);
-         virt_port = new VirtualPort(csprintf("%s-%d-vport",
-                                              name(), 0));
-         mem_port = system->physmem->getPort("functional");
-         mem_port->setPeer(virt_port);
-         virt_port->setPeer(mem_port);
-         thread.setPhysPort(phys_port);
-         thread.setVirtPort(virt_port);
-     }
 -#if FULL_SYSTEM
+     thread.connectMemPorts(tc);
 -#endif
  
      DPRINTF(OzoneCPU, "OzoneCPU: Created Ozone cpu object.\n");
  }
Simple merge
Simple merge
index fed94ffd87f3abb9dce7117ac433a1042dc92d86,425c8b1f1cd20233f4f5ff896c84dde75b1591fd..2c12b244b6453ff6559aadf9d3b23b3426ad0cd9
@@@ -84,18 -83,20 +84,20 @@@ voi
  AtomicSimpleCPU::init()
  {
      BaseCPU::init();
 -#if FULL_SYSTEM
 -    ThreadID size = threadContexts.size();
 -    for (ThreadID i = 0; i < size; ++i) {
 -        ThreadContext *tc = threadContexts[i];
 -
 -        // initialize CPU, including PC
 -        TheISA::initCPU(tc, tc->contextId());
 +    if (FullSystem) {
 +        ThreadID size = threadContexts.size();
 +        for (ThreadID i = 0; i < size; ++i) {
 +            ThreadContext *tc = threadContexts[i];
 +            // initialize CPU, including PC
 +            TheISA::initCPU(tc, tc->contextId());
 +        }
      }
 -#endif
+     // Initialise the ThreadContext's memory proxies
+     tcBase()->initMemProxies(tcBase());
++
      if (hasPhysMemPort) {
-         bool snoop = false;
-         AddrRangeList pmAddrList;
-         physmemPort.getPeerAddressRanges(pmAddrList, snoop);
+         AddrRangeList pmAddrList = physmemPort.getPeer()->getAddrRanges();
          physMemAddr = *pmAddrList.begin();
      }
      // Atomic doesn't do MT right now, so contextId == threadId
index 983672c27b29d941a359e7c1ef15fc7892faa6c9,f8d13efd92c60326cb996ee35ea58b26e0898de1..fd02e830032838dde958d308fecbdaf4ae2f7c41
@@@ -75,27 -74,17 +75,16 @@@ voi
  TimingSimpleCPU::init()
  {
      BaseCPU::init();
 -#if FULL_SYSTEM
 -    for (int i = 0; i < threadContexts.size(); ++i) {
 -        ThreadContext *tc = threadContexts[i];
 -
 -        // initialize CPU, including PC
 -        TheISA::initCPU(tc, _cpuId);
 +    if (FullSystem) {
 +        for (int i = 0; i < threadContexts.size(); ++i) {
 +            ThreadContext *tc = threadContexts[i];
 +            // initialize CPU, including PC
 +            TheISA::initCPU(tc, _cpuId);
 +        }
      }
- }
- Tick
- TimingSimpleCPU::CpuPort::recvAtomic(PacketPtr pkt)
- {
-     panic("TimingSimpleCPU doesn't expect recvAtomic callback!");
-     return curTick();
- }
  
- void
- TimingSimpleCPU::CpuPort::recvFunctional(PacketPtr pkt)
- {
-     //No internal storage to update, jusst return
-     return;
+     // Initialise the ThreadContext's memory proxies
+     tcBase()->initMemProxies(tcBase());
 -#endif
  }
  
  void
index edde884e753fe4363752f67244d470951165d26f,2541bdee1e2831300345917fc531b02fa5503cca..a12ab8e8a09c37d17b71fb14c4d77c324939f950
  #include "base/cprintf.hh"
  #include "base/output.hh"
  #include "base/trace.hh"
 +#include "config/the_isa.hh"
 +#include "cpu/base.hh"
  #include "cpu/profile.hh"
  #include "cpu/quiesce_event.hh"
- #include "mem/translating_port.hh"
- #include "mem/vport.hh"
 +#include "cpu/simple_thread.hh"
 +#include "cpu/thread_context.hh"
 +#include "params/BaseCPU.hh"
+ #include "mem/fs_translating_port_proxy.hh"
++#include "mem/se_translating_port_proxy.hh"
 +#include "sim/full_system.hh"
 +#include "sim/process.hh"
  #include "sim/serialize.hh"
  #include "sim/sim_exit.hh"
 -#else
 -#include "mem/se_translating_port_proxy.hh"
+ #include "sim/process.hh"
  #include "sim/system.hh"
 -#endif
  
  using namespace std;
  
index ffa89a9672c971a281d317f1071b8a003fb6c5f5,ebc23276af3677b0b9099bfd205db1638ec7aa49..f2132dc360e81f477bffc475edde9253dc8a0143
@@@ -57,9 -55,11 +57,8 @@@ class BaseCPU
  
  class FunctionProfile;
  class ProfileNode;
--class FunctionalPort;
  class PhysicalPort;
 +class TranslatingPort;
  
  namespace TheISA {
      namespace Kernel {
@@@ -195,13 -207,15 +194,13 @@@ class SimpleThread : public ThreadStat
  
      System *getSystemPtr() { return system; }
  
-     FunctionalPort *getPhysPort() { return physPort; }
 -#if FULL_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.
       */
-     VirtualPort *getVirtPort() { return virtPort; }
+     FSTranslatingPortProxy* getVirtProxy() { return virtProxy; }
 -#endif
  
      Status status() const { return _status; }
  
index f7879ea608b3c384c2eb082904b1763121fc2a16,d80d26e3d341d8b9d79a5e13ce86fc6fafa25923..261ace7cf950ee4f9d5c0f3e23efff4dd9d2fd9f
@@@ -124,17 -125,25 +124,23 @@@ class ThreadContex
  
      virtual System *getSystemPtr() = 0;
  
 -#if FULL_SYSTEM
      virtual TheISA::Kernel::Statistics *getKernelStats() = 0;
  
-     virtual void connectMemPorts(ThreadContext *tc) = 0;
+     virtual PortProxy* getPhysProxy() = 0;
  
-     virtual Process *getProcessPtr() = 0;
+     virtual FSTranslatingPortProxy* getVirtProxy() = 0;
  
-     virtual TranslatingPort *getMemPort() = 0;
+     /**
+      * Initialise the physical and virtual port proxies and tie them to
+      * the data port of the CPU.
+      *
+      * tc ThreadContext for the virtual-to-physical translation
+      */
+     virtual void initMemProxies(ThreadContext *tc) = 0;
 -#else
 +
-     virtual VirtualPort *getVirtPort() = 0;
+     virtual SETranslatingPortProxy *getMemProxy() = 0;
  
-     virtual FunctionalPort *getPhysPort() = 0;
+     virtual Process *getProcessPtr() = 0;
 -#endif
  
      virtual Status status() const = 0;
  
@@@ -288,15 -303,17 +294,15 @@@ class ProxyThreadContext : public Threa
      TheISA::Kernel::Statistics *getKernelStats()
      { return actualTC->getKernelStats(); }
  
-     void connectMemPorts(ThreadContext *tc) { actualTC->connectMemPorts(tc); }
+     PortProxy* getPhysProxy() { return actualTC->getPhysProxy(); }
  
-     Process *getProcessPtr() { return actualTC->getProcessPtr(); }
+     FSTranslatingPortProxy* getVirtProxy() { return actualTC->getVirtProxy(); }
  
-     TranslatingPort *getMemPort() { return actualTC->getMemPort(); }
+     void initMemProxies(ThreadContext *tc) { actualTC->initMemProxies(tc); }
 -#else
 +
-     VirtualPort *getVirtPort() { return actualTC->getVirtPort(); }
+     SETranslatingPortProxy* getMemProxy() { return actualTC->getMemProxy(); }
  
-     FunctionalPort *getPhysPort() { return actualTC->getPhysPort(); }
+     Process *getProcessPtr() { return actualTC->getProcessPtr(); }
 -#endif
  
      Status status() const { return actualTC->status(); }
  
index ef81271a809e13a24059217f9d352829c49f0e5d,6c9bb99ea33b6e006a39babc2cad44105751aa5f..574be7b6dba73e5221c12061020c2b9e9c2fc135
  #include "base/output.hh"
  #include "cpu/base.hh"
  #include "cpu/profile.hh"
 +#include "cpu/quiesce_event.hh"
  #include "cpu/thread_state.hh"
- #include "mem/translating_port.hh"
- #include "mem/vport.hh"
++#include "mem/fs_translating_port_proxy.hh"
 +#include "mem/port.hh"
+ #include "mem/port_proxy.hh"
+ #include "mem/se_translating_port_proxy.hh"
 +#include "sim/full_system.hh"
  #include "sim/serialize.hh"
+ #include "sim/system.hh"
  
 -#if FULL_SYSTEM
 -#include "arch/kernel_stats.hh"
 -#include "cpu/quiesce_event.hh"
 -#include "mem/fs_translating_port_proxy.hh"
 -#endif
 -
 -#if FULL_SYSTEM
 -ThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid)
 -#else
  ThreadState::ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process)
 -#endif
      : numInst(0), numLoad(0), _status(ThreadContext::Halted),
        baseCpu(cpu), _threadId(_tid), lastActivate(0), lastSuspend(0),
 -#if FULL_SYSTEM
        profile(NULL), profileNode(NULL), profilePC(0), quiesceEvent(NULL),
-       kernelStats(NULL), process(_process), port(NULL), virtPort(NULL),
-       physPort(NULL), funcExeInst(0), storeCondFailures(0)
 -      kernelStats(NULL), physProxy(NULL), virtProxy(NULL),
 -#else
 -      proxy(NULL), process(_process),
 -#endif
 -      funcExeInst(0), storeCondFailures(0)
++      kernelStats(NULL), process(_process), physProxy(NULL), virtProxy(NULL),
++      proxy(NULL), funcExeInst(0), storeCondFailures(0)
  {
  }
  
  ThreadState::~ThreadState()
  {
-     if (port) {
-         delete port->getPeer();
-         delete port;
-     }
 -#if FULL_SYSTEM
 -    if (physProxy != NULL) {
++    if (physProxy != NULL)
+         delete physProxy;
 -    }
 -    if (virtProxy != NULL) {
++    if (virtProxy != NULL)
+         delete virtProxy;
 -    }
 -#else
 -    if (proxy != NULL) {
++    if (proxy != NULL)
+         delete proxy;
 -    }
 -#endif
  }
  
  void
@@@ -82,49 -101,28 +86,27 @@@ ThreadState::unserialize(Checkpoint *cp
      // thread_num and cpu_id are deterministic from the config
      UNSERIALIZE_SCALAR(funcExeInst);
  
 -#if FULL_SYSTEM
 -    Tick quiesceEndTick;
 -    UNSERIALIZE_SCALAR(quiesceEndTick);
 -    if (quiesceEndTick)
 -        baseCpu->schedule(quiesceEvent, quiesceEndTick);
 -    if (kernelStats)
 -        kernelStats->unserialize(cp, section);
 -#endif
 +    if (FullSystem) {
 +        Tick quiesceEndTick;
 +        UNSERIALIZE_SCALAR(quiesceEndTick);
 +        if (quiesceEndTick)
 +            baseCpu->schedule(quiesceEvent, quiesceEndTick);
 +        if (kernelStats)
 +            kernelStats->unserialize(cp, section);
 +    }
  }
  
 -#if FULL_SYSTEM
  void
- ThreadState::connectPhysPort()
- {
-     // @todo: For now this disregards any older port that may have
-     // already existed.  Fix this memory leak once the bus port IDs
-     // for functional ports is resolved.
-     if (physPort)
-         physPort->removeConn();
-     else
-         physPort = new FunctionalPort(csprintf("%s-%d-funcport",
-                                            baseCpu->name(), _threadId));
-     connectToMemFunc(physPort);
- }
- void
- ThreadState::connectVirtPort(ThreadContext *tc)
- {
-     // @todo: For now this disregards any older port that may have
-     // already existed.  Fix this memory leak once the bus port IDs
-     // for functional ports is resolved.
-     if (virtPort)
-         virtPort->removeConn();
-     else
-         virtPort = new VirtualPort(csprintf("%s-%d-vport",
-                                         baseCpu->name(), _threadId), tc);
-     connectToMemFunc(virtPort);
- }
- void
- ThreadState::connectMemPorts(ThreadContext *tc)
+ ThreadState::initMemProxies(ThreadContext *tc)
  {
-     connectPhysPort();
-     connectVirtPort(tc);
+     // Note that this only refers to the port on the CPU side and can
+     // safely be done at init() time even if the CPU is not connected
+     // (i.e. due to restoring from a checkpoint and later switching
+     // in.
+     if (physProxy == NULL)
+         physProxy = new PortProxy(*baseCpu->getPort("dcache_port"));
+     if (virtProxy == NULL)
+         virtProxy = new FSTranslatingPortProxy(tc);
  }
  
  void
@@@ -141,35 -139,18 +123,16 @@@ ThreadState::profileSample(
          profile->sample(profileNode, profilePC);
  }
  
- TranslatingPort *
- ThreadState::getMemPort()
 -#else
+ SETranslatingPortProxy *
+ ThreadState::getMemProxy()
  {
-     if (port != NULL)
-         return port;
-     /* Use this port to for syscall emulation writes to memory. */
-     port = new TranslatingPort(csprintf("%s-%d-funcport", baseCpu->name(),
-                                _threadId), process, TranslatingPort::NextPage);
-     connectToMemFunc(port);
-     return port;
- }
- void
- ThreadState::connectToMemFunc(Port *port)
- {
-     Port *dcache_port, *func_mem_port;
-     dcache_port = baseCpu->getPort("dcache_port");
-     assert(dcache_port != NULL);
-     MemObject *mem_object = dcache_port->getPeer()->getOwner();
-     assert(mem_object != NULL);
+     if (proxy != NULL)
+         return proxy;
  
-     func_mem_port = mem_object->getPort("functional");
-     assert(func_mem_port != NULL);
+     /* Use this port proxy to for syscall emulation writes to memory. */
+     proxy = new SETranslatingPortProxy(*process->system->getSystemPort(),
+                                        process,
+                                        SETranslatingPortProxy::NextPage);
  
-     func_mem_port->setPeer(port);
-     port->setPeer(func_mem_port);
+     return proxy;
  }
 -#endif
index 972ca895d2eac1cba310509b4fb27a91e8d6f9ce,a007567c1d38649b8803ff0fd33e36d1a91bc2f5..30bb64ed7602bd559d788e2fb2ca11b4c94d2efe
@@@ -47,10 -51,12 +47,11 @@@ namespace TheISA 
          class Statistics;
      };
  };
 -#endif
  
  class Checkpoint;
- class Port;
- class TranslatingPort;
+ class PortProxy;
+ class SETranslatingPort;
+ class FSTranslatingPort;
  
  /**
   *  Struct for holding general thread state that is needed across CPU
@@@ -83,11 -93,14 +84,13 @@@ struct ThreadState 
  
      Tick readLastSuspend() { return lastSuspend; }
  
-     void connectPhysPort();
-     void connectVirtPort(ThreadContext *tc);
-     void connectMemPorts(ThreadContext *tc);
 -#if FULL_SYSTEM
+     /**
+      * Initialise the physical and virtual port proxies and tie them to
+      * the data port of the CPU.
+      *
+      * tc ThreadContext for the virtual-to-physical translation
+      */
+     void initMemProxies(ThreadContext *tc);
  
      void dumpFuncProfile();
  
  
      TheISA::Kernel::Statistics *getKernelStats() { return kernelStats; }
  
-     Process *getProcessPtr() { return process; }
-     TranslatingPort *getMemPort();
+     PortProxy* getPhysProxy() { return physProxy; }
  
-     void setMemPort(TranslatingPort *_port) { port = _port; }
+     FSTranslatingPortProxy* getVirtProxy() { return virtProxy; }
 -#else
 +
-     VirtualPort *getVirtPort() { return virtPort; }
-     FunctionalPort *getPhysPort() { return physPort; }
+     Process *getProcessPtr() { return process; }
  
-     void setPhysPort(FunctionalPort *port) { physPort = port; }
+     SETranslatingPortProxy* getMemProxy();
 -#endif
  
      /** Reads the number of instructions functionally executed and
       * committed.
      EndQuiesceEvent *quiesceEvent;
  
      TheISA::Kernel::Statistics *kernelStats;
 +
    protected:
-     TranslatingPort *port;
-     /** A functional port, outgoing only, for functional accesse to virtual
-      * addresses. */
-     VirtualPort *virtPort;
-     /** A functional port outgoing only for functional accesses to physical
 +    Process *process;
 +
+     /** A port proxy outgoing only for functional accesses to physical
       * addresses.*/
-     FunctionalPort *physPort;
+     PortProxy *physProxy;
+     /** A translating port proxy, outgoing only, for functional
+      * accesse to virtual addresses. */
+     FSTranslatingPortProxy* virtProxy;
 -#else
+     SETranslatingPortProxy* proxy;
  
 -    Process *process;
 -#endif
 -
    public:
      /*
       * number of executed instructions, for matching with syscall trace
Simple merge
diff --cc src/dev/Pci.py
index 2f9f93a59735ec5e5c0406f626baef9d5ab51105,9c2f27142ad7769ae50e6fb9f335c0abe1294803..95cb3916fb54ec7cf25cc1e9e47705081f9f0114
@@@ -42,8 -41,7 +42,8 @@@ class PciConfigAll(PioDevice)
  class PciDevice(DmaDevice):
      type = 'PciDevice'
      abstract = True
-     config = Port(Self.pio.peerObj.port, "PCI configuration space port")
 +    platform = Param.Platform(Parent.any, "Platform this device is part of.")
+     config = Port("PCI configuration space port")
      pci_bus = Param.Int("PCI bus")
      pci_dev = Param.Int("PCI device number")
      pci_func = Param.Int("PCI function code")
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 8418a4f51fa03683779e72b98897e825218444a8,dafc8c4a2402d460b774de3de2c61cd872494ac4..09cc93c7760c30d8abf90d9a3be6566ffefec5f0
@@@ -41,14 -40,18 +41,14 @@@ Source('mport.cc'
  Source('packet.cc')
  Source('port.cc')
  Source('tport.cc')
- Source('vport.cc')
 -Source('mport.cc')
++Source('fs_translating_port_proxy.cc')
++Source('se_translating_port_proxy.cc')
  
  if env['TARGET_ISA'] != 'no':
      SimObject('PhysicalMemory.py')
      Source('dram.cc')
 -    Source('physical.cc')
 -
 -if env['FULL_SYSTEM']:
 -    Source('fs_translating_port_proxy.cc')
 -elif env['TARGET_ISA'] != 'no':
      Source('page_table.cc')
 -    Source('se_translating_port_proxy.cc')
 +    Source('physical.cc')
-     Source('translating_port.cc')
  
  DebugFlag('Bus')
  DebugFlag('BusAddrRanges')
Simple merge
Simple merge
Simple merge
index 0000000000000000000000000000000000000000,027930287c27e250aea29cfb4df5f3260f82b97d..0f7ecb491401dceb56ae6835fd91ea3476e2b31d
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,211 +1,212 @@@
 -    Addr paddr;
+ /*
+  * Copyright (c) 2011 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.
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions are
+  * met: redistributions of source code must retain the above copyright
+  * notice, this list of conditions and the following disclaimer;
+  * redistributions in binary form must reproduce the above copyright
+  * notice, this list of conditions and the following disclaimer in the
+  * documentation and/or other materials provided with the distribution;
+  * neither the name of the copyright holders nor the names of its
+  * contributors may be used to endorse or promote products derived from
+  * this software without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  * Authors: Ron Dreslinski
+  *          Steve Reinhardt
+  *          Andreas Hansson
+  */
+ #include <string>
++#include "arch/isa_traits.hh"
+ #include "base/chunk_generator.hh"
+ #include "config/the_isa.hh"
+ #include "mem/page_table.hh"
+ #include "mem/se_translating_port_proxy.hh"
+ #include "sim/process.hh"
+ using namespace TheISA;
+ SETranslatingPortProxy::SETranslatingPortProxy(Port& port, Process *p,
+                                            AllocType alloc)
+     : PortProxy(port), pTable(p->pTable), process(p),
+       allocating(alloc)
+ { }
+ SETranslatingPortProxy::~SETranslatingPortProxy()
+ { }
+ bool
+ SETranslatingPortProxy::tryReadBlob(Addr addr, uint8_t *p, int size)
+ {
 -
 -    Addr paddr;
+     int prevSize = 0;
+     for (ChunkGenerator gen(addr, size, VMPageSize); !gen.done(); gen.next()) {
++        Addr paddr;
+         if (!pTable->translate(gen.addr(),paddr))
+             return false;
+         PortProxy::readBlob(paddr, p + prevSize, gen.size());
+         prevSize += gen.size();
+     }
+     return true;
+ }
+ void
+ SETranslatingPortProxy::readBlob(Addr addr, uint8_t *p, int size)
+ {
+     if (!tryReadBlob(addr, p, size))
+         fatal("readBlob(0x%x, ...) failed", addr);
+ }
+ bool
+ SETranslatingPortProxy::tryWriteBlob(Addr addr, uint8_t *p, int size)
+ {
 -    Addr paddr;
 -
+     int prevSize = 0;
+     for (ChunkGenerator gen(addr, size, VMPageSize); !gen.done(); gen.next()) {
++        Addr paddr;
+         if (!pTable->translate(gen.addr(), paddr)) {
+             if (allocating == Always) {
+                 process->allocateMem(roundDown(gen.addr(), VMPageSize),
+                                      VMPageSize);
+             } else if (allocating == NextPage) {
+                 // check if we've accessed the next page on the stack
+                 if (!process->fixupStackFault(gen.addr()))
+                     panic("Page table fault when accessing virtual address %#x "
+                             "during functional write\n", gen.addr());
+             } else {
+                 return false;
+             }
+             pTable->translate(gen.addr(), paddr);
+         }
+         PortProxy::writeBlob(paddr, p + prevSize, gen.size());
+         prevSize += gen.size();
+     }
+     return true;
+ }
+ void
+ SETranslatingPortProxy::writeBlob(Addr addr, uint8_t *p, int size)
+ {
+     if (!tryWriteBlob(addr, p, size))
+         fatal("writeBlob(0x%x, ...) failed", addr);
+ }
+ bool
+ SETranslatingPortProxy::tryMemsetBlob(Addr addr, uint8_t val, int size)
+ {
 -    Addr paddr,vaddr;
+     for (ChunkGenerator gen(addr, size, VMPageSize); !gen.done(); gen.next()) {
++        Addr paddr;
+         if (!pTable->translate(gen.addr(), paddr)) {
+             if (allocating == Always) {
+                 process->allocateMem(roundDown(gen.addr(), VMPageSize),
+                                      VMPageSize);
+                 pTable->translate(gen.addr(), paddr);
+             } else {
+                 return false;
+             }
+         }
+         PortProxy::memsetBlob(paddr, val, gen.size());
+     }
+     return true;
+ }
+ void
+ SETranslatingPortProxy::memsetBlob(Addr addr, uint8_t val, int size)
+ {
+     if (!tryMemsetBlob(addr, val, size))
+         fatal("memsetBlob(0x%x, ...) failed", addr);
+ }
+ bool
+ SETranslatingPortProxy::tryWriteString(Addr addr, const char *str)
+ {
 -    vaddr = addr;
+     uint8_t c;
 -        if (!pTable->translate(vaddr++,paddr))
++    Addr vaddr = addr;
+     do {
+         c = *str++;
 -    Addr paddr,vaddr;
++        Addr paddr;
++
++        if (!pTable->translate(vaddr++, paddr))
+             return false;
+         PortProxy::writeBlob(paddr, &c, 1);
+     } while (c);
+     return true;
+ }
+ void
+ SETranslatingPortProxy::writeString(Addr addr, const char *str)
+ {
+     if (!tryWriteString(addr, str))
+         fatal("writeString(0x%x, ...) failed", addr);
+ }
+ bool
+ SETranslatingPortProxy::tryReadString(std::string &str, Addr addr)
+ {
 -    vaddr = addr;
+     uint8_t c;
 -        if (!pTable->translate(vaddr++,paddr))
++    Addr vaddr = addr;
+     do {
++        Addr paddr;
++
++        if (!pTable->translate(vaddr++, paddr))
+             return false;
+         PortProxy::readBlob(paddr, &c, 1);
+         str += c;
+     } while (c);
+     return true;
+ }
+ void
+ SETranslatingPortProxy::readString(std::string &str, Addr addr)
+ {
+     if (!tryReadString(str, addr))
+         fatal("readString(0x%x, ...) failed", addr);
+ }
Simple merge
Simple merge
Simple merge
index 944c55ec0c2bfbd629ef5a3fefb0f87f8e3640e5,b1b14d0f338bfe0d85b64ac50ccc0283e8954faa..401e16f528380612149721bc57b94bcd7d3cff5f
@@@ -57,7 -66,10 +57,7 @@@ copyStringArray(std::vector<std::string
      // add NULL terminator
      data_ptr = 0;
  
-     memPort->writeBlob(array_ptr, (uint8_t*)&data_ptr, sizeof(AddrType));
+     memProxy->writeBlob(array_ptr, (uint8_t*)&data_ptr, sizeof(AddrType));
  }
  
 -
 -#endif // !FULL_SYSTEM
 -
  #endif
index 5c480272d5e4dac41012de726004f87b494b83b7,7ea383b2990ae8bbd3e006cd362fc1c303462da4..45c87f0abb7b7227d164eb381f9d3a5737c07fae
  #include "cpu/thread_context.hh"
  #include "debug/SyscallVerbose.hh"
  #include "mem/page_table.hh"
- #include "mem/translating_port.hh"
+ #include "mem/se_translating_port_proxy.hh"
  #include "sim/byteswap.hh"
  #include "sim/process.hh"
 +#include "sim/syscallreturn.hh"
  #include "sim/system.hh"
  
  ///
index d3bee1ad19d7ebfd9e32f653b4d5a72a0f1583a9,35e6da109ee3add52d1ff5b2c8569c4e23965115..14c44d063c4aa95f4f4d48fe21c8c0b0006bf14b
  #include "cpu/thread_context.hh"
  #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 "mem/vport.hh"
 +#include "params/System.hh"
  #include "sim/byteswap.hh"
  #include "sim/debug.hh"
 +#include "sim/full_system.hh"
  #include "sim/system.hh"
  
 -#if FULL_SYSTEM
 -#include "arch/vtophys.hh"
 -#include "kern/kernel_stats.hh"
 -#include "mem/fs_translating_port_proxy.hh"
 -#else
 -#include "params/System.hh"
 -#endif
 -
  using namespace std;
  using namespace TheISA;
  
@@@ -74,10 -78,16 +74,12 @@@ vector<System *> System::systemList
  int System::numSystemsRunning = 0;
  
  System::System(Params *p)
-     : SimObject(p), physmem(p->physmem), _numContexts(0), pagePtr(0),
+     : MemObject(p), _systemPort("system_port", this),
+       physmem(p->physmem),
+       _numContexts(0),
 -#if FULL_SYSTEM
        init_param(p->init_param),
        loadAddrMask(p->load_addr_mask),
 -#else
 -      pagePtr(0),
        nextPID(0),
 -#endif
        memoryMode(p->mem_mode),
        workItemsBegin(0),
        workItemsEnd(0),
                                        p->memories[x]->size()));
      }
  
 -#if FULL_SYSTEM
 -    kernelSymtab = new SymbolTable;
 -    if (!debugSymbolTable)
 -        debugSymbolTable = new SymbolTable;
 +    if (FullSystem) {
 +        kernelSymtab = new SymbolTable;
 +        if (!debugSymbolTable)
 +            debugSymbolTable = new SymbolTable;
  
 -    /**
 -     * Get a port proxy to memory
 -     */
 -    physProxy = new PortProxy(*getSystemPort());
 -    virtProxy = new FSTranslatingPortProxy(*getSystemPort());
 -#endif
 +        /**
-          * Get a functional port to memory
-          */
-         Port *mem_port;
-         functionalPort = new FunctionalPort(name() + "-fport");
-         mem_port = physmem->getPort("functional");
-         functionalPort->setPeer(mem_port);
-         mem_port->setPeer(functionalPort);
-         virtPort = new VirtualPort(name() + "-fport");
-         mem_port = physmem->getPort("functional");
-         virtPort->setPeer(mem_port);
-         mem_port->setPeer(virtPort);
-         /**
-          * Load the kernel code into memory
++         * Get a port proxy to memory
 +         */
-         if (params()->kernel == "") {
-             inform("No kernel set for full system simulation. "
-                     "Assuming you know what you're doing...\n");
-         } else {
-             // Load kernel code
-             kernel = createObjectFile(params()->kernel);
-             inform("kernel located at: %s", params()->kernel);
-             if (kernel == NULL)
-                 fatal("Could not load kernel file %s", params()->kernel);
-             // Load program sections into memory
-             kernel->loadSections(functionalPort, loadAddrMask);
-             // setup entry points
-             kernelStart = kernel->textBase();
-             kernelEnd = kernel->bssBase() + kernel->bssSize();
-             kernelEntry = kernel->entryPoint();
-             // load symbols
-             if (!kernel->loadGlobalSymbols(kernelSymtab))
-                 fatal("could not load kernel symbols\n");
-             if (!kernel->loadLocalSymbols(kernelSymtab))
-                 fatal("could not load kernel local symbols\n");
-             if (!kernel->loadGlobalSymbols(debugSymbolTable))
-                 fatal("could not load kernel symbols\n");
-             if (!kernel->loadLocalSymbols(debugSymbolTable))
-                 fatal("could not load kernel local symbols\n");
-             DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
-             DPRINTF(Loader, "Kernel end   = %#x\n", kernelEnd);
-             DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
-             DPRINTF(Loader, "Kernel loaded...\n");
-         }
++        physProxy = new PortProxy(*getSystemPort());
++        virtProxy = new FSTranslatingPortProxy(*getSystemPort());
 +    }
-     // increment the number of running systms
-     numSystemsRunning++;
-     activeCpus.clear();
  }
  
  System::~System()
@@@ -257,11 -231,61 +218,64 @@@ System::numRunningContexts(
  void
  System::initState()
  {
 -    // Moved from the constructor to here since it relies on the
 -    // address map being resolved in the interconnect
 -#if FULL_SYSTEM
 -    /**
 -     * Load the kernel code into memory
 -     */
 -    if (params()->kernel == "") {
 -        inform("No kernel set for full system simulation. Assuming you know what"
 -                " you're doing...\n");
 -    } else {
 -        // Load kernel code
 -        kernel = createObjectFile(params()->kernel);
 -        inform("kernel located at: %s", params()->kernel);
 -
 -        if (kernel == NULL)
 -            fatal("Could not load kernel file %s", params()->kernel);
 -
 -        // Load program sections into memory
 -        kernel->loadSections(physProxy, loadAddrMask);
 -
 -        // setup entry points
 -        kernelStart = kernel->textBase();
 -        kernelEnd = kernel->bssBase() + kernel->bssSize();
 -        kernelEntry = kernel->entryPoint();
 -
 -        // load symbols
 -        if (!kernel->loadGlobalSymbols(kernelSymtab))
 -            fatal("could not load kernel symbols\n");
 -
 -        if (!kernel->loadLocalSymbols(kernelSymtab))
 -            fatal("could not load kernel local symbols\n");
 -
 -        if (!kernel->loadGlobalSymbols(debugSymbolTable))
 -            fatal("could not load kernel symbols\n");
 -
 -        if (!kernel->loadLocalSymbols(debugSymbolTable))
 -            fatal("could not load kernel local symbols\n");
 -
 -        DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
 -        DPRINTF(Loader, "Kernel end   = %#x\n", kernelEnd);
 -        DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
 -        DPRINTF(Loader, "Kernel loaded...\n");
++    if (FullSystem) {
++        int i;
++        for (i = 0; i < threadContexts.size(); i++)
++            TheISA::startupCPU(threadContexts[i], i);
++        // Moved from the constructor to here since it relies on the
++        // address map being resolved in the interconnect
++        /**
++         * Load the kernel code into memory
++         */
++        if (params()->kernel == "") {
++            inform("No kernel set for full system simulation. "
++                    "Assuming you know what you're doing...\n");
++        } else {
++            // Load kernel code
++            kernel = createObjectFile(params()->kernel);
++            inform("kernel located at: %s", params()->kernel);
++
++            if (kernel == NULL)
++                fatal("Could not load kernel file %s", params()->kernel);
++
++            // Load program sections into memory
++            kernel->loadSections(physProxy, loadAddrMask);
++
++            // setup entry points
++            kernelStart = kernel->textBase();
++            kernelEnd = kernel->bssBase() + kernel->bssSize();
++            kernelEntry = kernel->entryPoint();
++
++            // load symbols
++            if (!kernel->loadGlobalSymbols(kernelSymtab))
++                fatal("could not load kernel symbols\n");
++
++            if (!kernel->loadLocalSymbols(kernelSymtab))
++                fatal("could not load kernel local symbols\n");
++
++            if (!kernel->loadGlobalSymbols(debugSymbolTable))
++                fatal("could not load kernel symbols\n");
++
++            if (!kernel->loadLocalSymbols(debugSymbolTable))
++                fatal("could not load kernel local symbols\n");
++
++            DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
++            DPRINTF(Loader, "Kernel end   = %#x\n", kernelEnd);
++            DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
++            DPRINTF(Loader, "Kernel loaded...\n");
++        }
+     }
 -#endif // FULL_SYSTEM
+     // increment the number of running systms
+     numSystemsRunning++;
+     activeCpus.clear();
 -#if FULL_SYSTEM
 -    int i;
 -    for (i = 0; i < threadContexts.size(); i++)
 -        TheISA::startupCPU(threadContexts[i], i);
 -#endif
 +    if (FullSystem) {
 +        int i;
 +        for (i = 0; i < threadContexts.size(); i++)
 +            TheISA::startupCPU(threadContexts[i], i);
 +    }
  }
  
  void
index d675eb727c91c2dc56f019b73d422cc42f03cfa5,53f1762c7915151208c59550aeb5e304627fe9b9..eb192fb997a6107460d3864ea78ed681b2bd5a19
  #include "base/loader/symtab.hh"
  #include "base/misc.hh"
  #include "base/statistics.hh"
 -#include "config/full_system.hh"
  #include "cpu/pc_event.hh"
  #include "enums/MemoryMode.hh"
 +#include "kern/system_events.hh"
+ #include "mem/mem_object.hh"
  #include "mem/port.hh"
  #include "params/System.hh"
- #include "sim/sim_object.hh"
  
 -#if FULL_SYSTEM
 -#include "kern/system_events.hh"
 -#endif
 -
  class BaseCPU;
 -class ThreadContext;
 +class BaseRemoteGDB;
- class FunctionalPort;
++class FSTranslatingPortProxy;
 +class GDBListener;
  class ObjectFile;
  class PhysicalMemory;
 -
 -#if FULL_SYSTEM
  class Platform;
 -class FSTranslatingPortProxy;
 -#endif
 -class GDBListener;
 -class BaseRemoteGDB;
+ class PortProxy;
 +class ThreadContext;
 +class VirtualPort;
  
- class System : public SimObject
+ class System : public MemObject
  {
+   private:
+     /**
+      * Private class for the system port which is only used as a
+      * master for debug access and for non-structural entities that do
+      * not have a port of their own.
+      */
+     class SystemPort : public Port
+     {
+       public:
+         /**
+          * Create a system port with a name and an owner.
+          */
+         SystemPort(const std::string &_name, MemObject *_owner)
+             : Port(_name, _owner)
+         { }
+         bool recvTiming(PacketPtr pkt)
+         { panic("SystemPort does not receive timing!\n"); return false; }
+         Tick recvAtomic(PacketPtr pkt)
+         { panic("SystemPort does not receive atomic!\n"); return 0; }
+         void recvFunctional(PacketPtr pkt)
+         { panic("SystemPort does not receive functional!\n"); }
+         /**
+          * The system port is a master port connected to a single
+          * slave and thus do not care about what ranges the slave
+          * covers (as there is nothing to choose from).
+          */
+         void recvRangeChange() { }
+     };
+     SystemPort _systemPort;
    public:
  
+     /**
+      * After all objects have been created and all ports are
+      * connected, check that the system port is connected.
+      */
+     virtual void init();
+     /**
+      * Get a pointer 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
+      */
+     Port* getSystemPort() { return &_systemPort; }
+     /**
+      * Additional function to return the Port of a memory object.
+      */
+     Port *getPort(const std::string &if_name, int idx = -1);
      static const char *MemoryModeStrings[3];
  
      Enums::MemoryMode
index d03b8606887bb6994318866795d97a8893b919ee,359421a49d07cf9e65a4a93723cffd31b589a38d..319dd3b553c3c9db8dfc371d5ea983a9fd0f13a5
@@@ -82,8 -82,12 +82,11 @@@ assert(len(system.ruby._cpu_ruby_ports
  # Tie the cpu cache ports to the ruby cpu ports and
  # physmem, respectively
  #
 -cpu.icache_port = system.ruby._cpu_ruby_ports[0].port
 -cpu.dcache_port = system.ruby._cpu_ruby_ports[0].port
 +cpu.connectAllPorts(system.ruby._cpu_ruby_ports[0])
  
+ # Connect the system port for loading of binaries etc
+ system.system_port = system.ruby._sys_port_proxy.port
  # -----------------------
  # run simulation
  # -----------------------