diff options
Diffstat (limited to 'dev')
-rw-r--r-- | dev/alpha_console.cc | 115 | ||||
-rw-r--r-- | dev/alpha_console.hh | 13 | ||||
-rw-r--r-- | dev/io_device.cc | 18 | ||||
-rw-r--r-- | dev/io_device.hh | 28 |
4 files changed, 95 insertions, 79 deletions
diff --git a/dev/alpha_console.cc b/dev/alpha_console.cc index ad3b16fc0..91cfc0ec3 100644 --- a/dev/alpha_console.cc +++ b/dev/alpha_console.cc @@ -41,9 +41,10 @@ #include "cpu/base.hh" #include "cpu/exec_context.hh" #include "dev/alpha_console.hh" +#include "dev/platform.hh" #include "dev/simconsole.hh" #include "dev/simple_disk.hh" -#include "dev/tsunami_io.hh" +#include "mem/physical.hh" #include "sim/builder.hh" #include "sim/sim_object.hh" @@ -51,13 +52,14 @@ using namespace std; using namespace AlphaISA; AlphaConsole::AlphaConsole(Params *p) - : PioDevice(p->name, p->platform), disk(p->disk), - console(params()->cons), system(params()->sys), cpu(params()->cpu), - pioSize(sizeof(struct alphaAccess)) + : BasicPioDevice(p), disk(p->disk), + console(params()->cons), system(params()->sys), cpu(params()->cpu) { - alphaAccess = new Access; - alphaAccess->last_offset = size - 1; + pioSize = sizeof(struct AlphaAccess); + + alphaAccess = new Access(); + alphaAccess->last_offset = pioSize - 1; alphaAccess->version = ALPHA_ACCESS_VERSION; alphaAccess->diskUnit = 1; @@ -70,7 +72,7 @@ AlphaConsole::AlphaConsole(Params *p) alphaAccess->inputChar = 0; bzero(alphaAccess->cpuStack, sizeof(alphaAccess->cpuStack)); - system->setAlphaAccess(addr); + system->setAlphaAccess(pioAddr); } void @@ -82,9 +84,18 @@ AlphaConsole::startup() alphaAccess->entryPoint = system->getKernelEntry(); alphaAccess->mem_size = system->physmem->size(); alphaAccess->cpuClock = cpu->frequency() / 1000000; // In MHz - alphaAccess->intrClockFrequency = platform->intrFrequency(); + alphaAccess->intrClockFrequency = params()->platform->intrFrequency(); +} + +void +AlphaConsole::addressRanges(AddrRangeList &range_list) +{ + assert(pioSize != 0); + range_list.clear(); + range_list.push_back(RangeSize(pioAddr, sizeof(struct AlphaAccess))); } + Tick AlphaConsole::read(Packet &pkt) { @@ -97,25 +108,34 @@ AlphaConsole::read(Packet &pkt) assert(pkt.result == Unknown); assert(pkt.addr >= pioAddr && pkt.addr < pioAddr + pioSize); - Addr daddr = req.addr - pioAddr; + Addr daddr = pkt.addr - pioAddr; + + uint32_t *data32; + uint64_t *data64; - switch (req.size) + switch (pkt.size) { case sizeof(uint32_t): - if (!pkt.data) pkt.pkt.data = new uint32_t; + if (!pkt.data) { + data32 = new uint32_t; + pkt.data = (uint8_t*)data32; + } + else + data32 = (uint32_t*)pkt.data; + switch (daddr) { case offsetof(AlphaAccess, last_offset): - *(uint32_t*)pkt.data = alphaAccess->last_offset; + *data32 = alphaAccess->last_offset; break; case offsetof(AlphaAccess, version): - *(uint32_t*)pkt.data = alphaAccess->version; + *data32 = alphaAccess->version; break; case offsetof(AlphaAccess, numCPUs): - *(uint32_t*)pkt.data = alphaAccess->numCPUs; + *data32 = alphaAccess->numCPUs; break; case offsetof(AlphaAccess, intrClockFrequency): - *(uint32_t*)pkt.data = alphaAccess->intrClockFrequency; + *data32 = alphaAccess->intrClockFrequency; break; default: /* Old console code read in everyting as a 32bit int @@ -123,60 +143,63 @@ AlphaConsole::read(Packet &pkt) */ pkt.result = BadAddress; } - DPRINTF(AlphaConsole, "read: offset=%#x val=%#x\n", daddr, - *(uint32_t*)pkt.data); + DPRINTF(AlphaConsole, "read: offset=%#x val=%#x\n", daddr, *data32); break; case sizeof(uint64_t): - if (!pkt.data) pkt.pkt.data = new uint64_t; + if (!pkt.data) { + data64 = new uint64_t; + pkt.data = (uint8_t*)data64; + } + else + data64 = (uint64_t*)pkt.data; switch (daddr) { case offsetof(AlphaAccess, inputChar): - *(uint64_t*)pkt.data = console->console_in(); + *data64 = console->console_in(); break; case offsetof(AlphaAccess, cpuClock): - *(uint64_t*)pkt.data = alphaAccess->cpuClock; + *data64 = alphaAccess->cpuClock; break; case offsetof(AlphaAccess, mem_size): - *(uint64_t*)pkt.data = alphaAccess->mem_size; + *data64 = alphaAccess->mem_size; break; case offsetof(AlphaAccess, kernStart): - *(uint64_t*)pkt.data = alphaAccess->kernStart; + *data64 = alphaAccess->kernStart; break; case offsetof(AlphaAccess, kernEnd): - *(uint64_t*)pkt.data = alphaAccess->kernEnd; + *data64 = alphaAccess->kernEnd; break; case offsetof(AlphaAccess, entryPoint): - *(uint64_t*)pkt.data = alphaAccess->entryPoint; + *data64 = alphaAccess->entryPoint; break; case offsetof(AlphaAccess, diskUnit): - *(uint64_t*)pkt.data = alphaAccess->diskUnit; + *data64 = alphaAccess->diskUnit; break; case offsetof(AlphaAccess, diskCount): - *(uint64_t*)pkt.data = alphaAccess->diskCount; + *data64 = alphaAccess->diskCount; break; case offsetof(AlphaAccess, diskPAddr): - *(uint64_t*)pkt.data = alphaAccess->diskPAddr; + *data64 = alphaAccess->diskPAddr; break; case offsetof(AlphaAccess, diskBlock): - *(uint64_t*)pkt.data = alphaAccess->diskBlock; + *data64 = alphaAccess->diskBlock; break; case offsetof(AlphaAccess, diskOperation): - *(uint64_t*)pkt.data = alphaAccess->diskOperation; + *data64 = alphaAccess->diskOperation; break; case offsetof(AlphaAccess, outputChar): - *(uint64_t*)pkt.data = alphaAccess->outputChar; + *data64 = alphaAccess->outputChar; break; default: int cpunum = (daddr - offsetof(AlphaAccess, cpuStack)) / sizeof(alphaAccess->cpuStack[0]); if (cpunum >= 0 && cpunum < 64) - *(uint64_t*)pkt.data = alphaAccess->cpuStack[cpunum]; + *data64 = alphaAccess->cpuStack[cpunum]; else panic("Unknown 64bit access, %#x\n", daddr); } - DPRINTF(AlphaConsole, "read: offset=%#x val=%#x\n", daddr, - *(uint64_t*)data); + DPRINTF(AlphaConsole, "read: offset=%#x val=%#x\n", daddr, *data64); break; default: pkt.result = BadAddress; @@ -186,15 +209,15 @@ AlphaConsole::read(Packet &pkt) } Tick -AlphaConsole::write(MemReqPtr &req, const uint8_t *data) +AlphaConsole::write(Packet &pkt) { pkt.time = curTick + pioDelay; assert(pkt.result == Unknown); assert(pkt.addr >= pioAddr && pkt.addr < pioAddr + pioSize); - Addr daddr = req.addr - pioAddr; + Addr daddr = pkt.addr - pioAddr; - uint64_t val = *(uint64_t *)data; + uint64_t val = *(uint64_t *)pkt.data; assert(pkt.size == sizeof(uint64_t)); switch (daddr) { @@ -303,14 +326,11 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole) SimObjectParam<SimConsole *> sim_console; SimObjectParam<SimpleDisk *> disk; - SimObjectParam<MemoryController *> mmu; Param<Addr> addr; SimObjectParam<AlphaSystem *> system; SimObjectParam<BaseCPU *> cpu; SimObjectParam<Platform *> platform; - SimObjectParam<Bus*> pio_bus; Param<Tick> pio_latency; - SimObjectParam<HierParams *> hier; END_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole) @@ -318,21 +338,26 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(AlphaConsole) INIT_PARAM(sim_console, "The Simulator Console"), INIT_PARAM(disk, "Simple Disk"), - INIT_PARAM(mmu, "Memory Controller"), INIT_PARAM(addr, "Device Address"), INIT_PARAM(system, "system object"), INIT_PARAM(cpu, "Processor"), INIT_PARAM(platform, "platform"), - INIT_PARAM(pio_bus, "The IO Bus to attach to"), - INIT_PARAM_DFLT(pio_latency, "Programmed IO latency", 1000), - INIT_PARAM_DFLT(hier, "Hierarchy global variables", &defaultHierParams) + INIT_PARAM_DFLT(pio_latency, "Programmed IO latency", 1000) END_INIT_SIM_OBJECT_PARAMS(AlphaConsole) CREATE_SIM_OBJECT(AlphaConsole) { - return new AlphaConsole(getInstanceName(), sim_console, disk, - system, cpu, platform, mmu, addr, hier, pio_bus); + AlphaConsole::Params *p = new AlphaConsole::Params; + p->name = getInstanceName(); + p->platform = platform; + p->pio_addr = addr; + p->pio_delay = pio_latency; + p->cons = sim_console; + p->disk = disk; + p->sys = system; + p->cpu = cpu; + return new AlphaConsole(p); } REGISTER_SIM_OBJECT("AlphaConsole", AlphaConsole) diff --git a/dev/alpha_console.hh b/dev/alpha_console.hh index 6f3ea15a6..99c4b00a1 100644 --- a/dev/alpha_console.hh +++ b/dev/alpha_console.hh @@ -43,7 +43,6 @@ class BaseCPU; class SimConsole; class AlphaSystem; class SimpleDisk; -class MemoryController; /** * Memory mapped interface to the system console. This device @@ -70,7 +69,7 @@ class MemoryController; * primarily used doing boot before the kernel has loaded its device * drivers. */ -class AlphaConsole : public BasePioDevice +class AlphaConsole : public BasicPioDevice { protected: struct Access : public AlphaAccess @@ -97,12 +96,12 @@ class AlphaConsole : public BasePioDevice BaseCPU *cpu; public: - struct Params : public BasePioDevice::Params + struct Params : public BasicPioDevice::Params { SimConsole *cons; SimpleDisk *disk; AlphaSystem *sys; - BaseCpu *cpu; + BaseCPU *cpu; }; protected: const Params *params() const {return (const Params *)_params; } @@ -120,14 +119,14 @@ class AlphaConsole : public BasePioDevice virtual Tick read(Packet &pkt); virtual Tick write(Packet &pkt); + /** Address ranges this device is sensitive to. */ + virtual void addressRanges(AddrRangeList &range_list); + /** * standard serialization routines for checkpointing */ virtual void serialize(std::ostream &os); virtual void unserialize(Checkpoint *cp, const std::string §ion); - - public: - Tick cacheAccess(MemReqPtr &req); }; #endif // __ALPHA_CONSOLE_HH__ diff --git a/dev/io_device.cc b/dev/io_device.cc index ac993d78d..5d3a87006 100644 --- a/dev/io_device.cc +++ b/dev/io_device.cc @@ -48,9 +48,10 @@ PioPort::recvFunctional(Packet &pkt) } void -PioPort::getDeviceAddressRanges(AddrRangeList &range_list, bool &owner) +PioPort::getDeviceAddressRanges(AddrRangeList &resp, AddrRangeList &snoop) { - device->addressRanges(range_list, owner); + snoop.clear(); + device->addressRanges(resp); } @@ -100,8 +101,8 @@ DmaPort::recvTiming(Packet &pkt) return Success; } -DmaDevice::DmaDevice(const std::string &name, Platform *p) - : PioDevice(name, p) +DmaDevice::DmaDevice(Params *p) + : PioDevice(p) { dmaPort = new DmaPort(this); } @@ -195,13 +196,4 @@ DmaDevice::~DmaDevice() delete dmaPort; } -void -BasePioDevice::addressRanges(AddrRangeList &range_list, bool &owner) -{ - assert(pioSize != 0); - owner = true; - range_list.clear(); - range_list.push_back(RangeSize(pio_addr, sizeof(struct alphaAccess))); -} - diff --git a/dev/io_device.hh b/dev/io_device.hh index e2565cfdc..a8c36fdd9 100644 --- a/dev/io_device.hh +++ b/dev/io_device.hh @@ -75,7 +75,7 @@ class PioPort : public Port virtual void recvStatusChange(Status status) { peerStatus = status; } - virtual void getDeviceAddressRanges(AddrRangeList &range_list, bool &owner); + virtual void getDeviceAddressRanges(AddrRangeList &resp, AddrRangeList &snoop); /** * This class is used to implemented sendTiming() with a delay. When a delay @@ -131,8 +131,8 @@ class DmaPort : public Port virtual Packet *recvRetry() ; - virtual void getDeviceAddressRanges(AddrRangeList &range_list, bool &owner) - { range_list.clear(); owner = true; } + virtual void getDeviceAddressRanges(AddrRangeList &resp, AddrRangeList &snoop) + { resp.clear(); snoop.clear(); } class SendEvent : public Event { @@ -183,7 +183,7 @@ class PioDevice : public SimObject * that it sees. */ PioPort *pioPort; - virtual void addressRanges(AddrRangeList &range_list, bool &owner) = 0; + virtual void addressRanges(AddrRangeList &range_list) = 0; /** As far as the devices are concerned they only accept atomic transactions * which are converted to either a write or a read. */ @@ -208,26 +208,27 @@ class PioDevice : public SimObject std::string name; Platform *platform; }; + protected: Params *_params; public: const Params *params() const { return _params; } - PioDevice(Params *params) - : SimObject(params()->name), platform(params()->platform) + PioDevice(Params *p) + : SimObject(params()->name), platform(p->platform), _params(p) {} virtual ~PioDevice(); virtual Port *getPort(const std::string &if_name) { - if (if_name == "pio") + if (if_name == "pio") { if (pioPort != NULL) panic("pio port already connected to."); pioPort = new PioPort(this, params()->platform); return pioPort; - else + } else return NULL; } friend class PioPort; @@ -237,7 +238,7 @@ class PioDevice : public SimObject class BasicPioDevice : public PioDevice { public: - struct Params + struct Params : public PioDevice::Params { Addr pio_addr; Tick pio_delay; @@ -248,17 +249,16 @@ class BasicPioDevice : public PioDevice Addr pioAddr; /** Size that the device's address range. */ - Addr pioSize = 0; + Addr pioSize; /** Delay that the device experinces on an access. */ Tick pioDelay; public: - BasePioDevice(Params *p) - : PioDevice(p), pioAddr(p->pio_addr), pioDelay(p->pioDelay) + BasicPioDevice(Params *p) + : PioDevice(p), pioAddr(p->pio_addr), pioSize(0), pioDelay(p->pio_delay) {} - virtual void addressRanges(AddrRangeList &range_list, bool &owner); }; class DmaDevice : public PioDevice @@ -267,7 +267,7 @@ class DmaDevice : public PioDevice DmaPort *dmaPort; public: - DmaDevice(const std::string &name, Platform *p); + DmaDevice(Params *p); virtual ~DmaDevice(); virtual Port *getPort(const std::string &if_name) |