sim: Use forward declarations for ports.
Virtual ports need TLB data which means anything touching a file in the arch directory rebuilds any file that includes system.hh which in everything.
This commit is contained in:
parent
72b5262278
commit
0ea794bcf4
|
@ -43,6 +43,7 @@
|
||||||
#include "cpu/thread_context.hh"
|
#include "cpu/thread_context.hh"
|
||||||
#include "mem/physical.hh"
|
#include "mem/physical.hh"
|
||||||
#include "mem/port.hh"
|
#include "mem/port.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
#include "sim/byteswap.hh"
|
#include "sim/byteswap.hh"
|
||||||
|
|
||||||
#define TIMER_FREQUENCY 1193180
|
#define TIMER_FREQUENCY 1193180
|
||||||
|
@ -77,8 +78,8 @@ FreebsdAlphaSystem::doCalibrateClocks(ThreadContext *tc)
|
||||||
ppc_vaddr = (Addr)tc->readIntReg(17);
|
ppc_vaddr = (Addr)tc->readIntReg(17);
|
||||||
timer_vaddr = (Addr)tc->readIntReg(18);
|
timer_vaddr = (Addr)tc->readIntReg(18);
|
||||||
|
|
||||||
virtPort.write(ppc_vaddr, (uint32_t)SimClock::Frequency);
|
virtPort->write(ppc_vaddr, (uint32_t)SimClock::Frequency);
|
||||||
virtPort.write(timer_vaddr, (uint32_t)TIMER_FREQUENCY);
|
virtPort->write(timer_vaddr, (uint32_t)TIMER_FREQUENCY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -77,7 +77,7 @@ LinuxAlphaSystem::LinuxAlphaSystem(Params *p)
|
||||||
* Since we aren't using a bootloader, we have to copy the
|
* Since we aren't using a bootloader, we have to copy the
|
||||||
* kernel arguments directly into the kernel's memory.
|
* 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);
|
params()->boot_osflags.length()+1);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,7 +86,7 @@ LinuxAlphaSystem::LinuxAlphaSystem(Params *p)
|
||||||
* calculated it by using the PIT, RTC, etc.
|
* calculated it by using the PIT, RTC, etc.
|
||||||
*/
|
*/
|
||||||
if (kernelSymtab->findAddress("est_cycle_freq", addr))
|
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));
|
p->boot_cpu_frequency));
|
||||||
|
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ LinuxAlphaSystem::LinuxAlphaSystem(Params *p)
|
||||||
* 255 ASNs.
|
* 255 ASNs.
|
||||||
*/
|
*/
|
||||||
if (kernelSymtab->findAddress("dp264_mv", addr))
|
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
|
else
|
||||||
panic("could not find dp264_mv\n");
|
panic("could not find dp264_mv\n");
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "cpu/base.hh"
|
#include "cpu/base.hh"
|
||||||
#include "cpu/thread_context.hh"
|
#include "cpu/thread_context.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
#include "sim/system.hh"
|
#include "sim/system.hh"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "base/loader/symtab.hh"
|
#include "base/loader/symtab.hh"
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "mem/physical.hh"
|
#include "mem/physical.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
#include "params/AlphaSystem.hh"
|
#include "params/AlphaSystem.hh"
|
||||||
#include "sim/byteswap.hh"
|
#include "sim/byteswap.hh"
|
||||||
|
|
||||||
|
@ -65,8 +66,8 @@ AlphaSystem::AlphaSystem(Params *p)
|
||||||
|
|
||||||
|
|
||||||
// Load program sections into memory
|
// Load program sections into memory
|
||||||
pal->loadSections(&functionalPort, loadAddrMask);
|
pal->loadSections(functionalPort, loadAddrMask);
|
||||||
console->loadSections(&functionalPort, loadAddrMask);
|
console->loadSections(functionalPort, loadAddrMask);
|
||||||
|
|
||||||
// load symbols
|
// load symbols
|
||||||
if (!console->loadGlobalSymbols(consoleSymtab))
|
if (!console->loadGlobalSymbols(consoleSymtab))
|
||||||
|
@ -99,7 +100,7 @@ AlphaSystem::AlphaSystem(Params *p)
|
||||||
* others do.)
|
* others do.)
|
||||||
*/
|
*/
|
||||||
if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
|
if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
|
||||||
virtPort.writeBlob(addr, (uint8_t*)params()->boot_osflags.c_str(),
|
virtPort->writeBlob(addr, (uint8_t*)params()->boot_osflags.c_str(),
|
||||||
strlen(params()->boot_osflags.c_str()));
|
strlen(params()->boot_osflags.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,9 +111,9 @@ AlphaSystem::AlphaSystem(Params *p)
|
||||||
if (consoleSymtab->findAddress("m5_rpb", addr)) {
|
if (consoleSymtab->findAddress("m5_rpb", addr)) {
|
||||||
uint64_t data;
|
uint64_t data;
|
||||||
data = htog(params()->system_type);
|
data = htog(params()->system_type);
|
||||||
virtPort.write(addr+0x50, data);
|
virtPort->write(addr+0x50, data);
|
||||||
data = htog(params()->system_rev);
|
data = htog(params()->system_rev);
|
||||||
virtPort.write(addr+0x58, data);
|
virtPort->write(addr+0x58, data);
|
||||||
} else
|
} else
|
||||||
panic("could not find hwrpb\n");
|
panic("could not find hwrpb\n");
|
||||||
}
|
}
|
||||||
|
@ -168,8 +169,8 @@ AlphaSystem::fixFuncEventAddr(Addr addr)
|
||||||
// lda gp,Y(gp): opcode 8, Ra = 29, rb = 29
|
// lda gp,Y(gp): opcode 8, Ra = 29, rb = 29
|
||||||
const uint32_t gp_lda_pattern = (8 << 26) | (29 << 21) | (29 << 16);
|
const uint32_t gp_lda_pattern = (8 << 26) | (29 << 21) | (29 << 16);
|
||||||
|
|
||||||
uint32_t i1 = virtPort.read<uint32_t>(addr);
|
uint32_t i1 = virtPort->read<uint32_t>(addr);
|
||||||
uint32_t i2 = virtPort.read<uint32_t>(addr + sizeof(MachInst));
|
uint32_t i2 = virtPort->read<uint32_t>(addr + sizeof(MachInst));
|
||||||
|
|
||||||
if ((i1 & inst_mask) == gp_ldah_pattern &&
|
if ((i1 & inst_mask) == gp_ldah_pattern &&
|
||||||
(i2 & inst_mask) == gp_lda_pattern) {
|
(i2 & inst_mask) == gp_lda_pattern) {
|
||||||
|
@ -186,7 +187,7 @@ AlphaSystem::setAlphaAccess(Addr access)
|
||||||
{
|
{
|
||||||
Addr addr = 0;
|
Addr addr = 0;
|
||||||
if (consoleSymtab->findAddress("m5AlphaAccess", addr)) {
|
if (consoleSymtab->findAddress("m5AlphaAccess", addr)) {
|
||||||
virtPort.write(addr, htog(Phys2K0Seg(access)));
|
virtPort->write(addr, htog(Phys2K0Seg(access)));
|
||||||
} else {
|
} else {
|
||||||
panic("could not find m5AlphaAccess\n");
|
panic("could not find m5AlphaAccess\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "kern/system_events.hh"
|
#include "kern/system_events.hh"
|
||||||
#include "mem/physical.hh"
|
#include "mem/physical.hh"
|
||||||
#include "mem/port.hh"
|
#include "mem/port.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ Tru64AlphaSystem::Tru64AlphaSystem(Tru64AlphaSystem::Params *p)
|
||||||
{
|
{
|
||||||
Addr addr = 0;
|
Addr addr = 0;
|
||||||
if (kernelSymtab->findAddress("enable_async_printf", addr)) {
|
if (kernelSymtab->findAddress("enable_async_printf", addr)) {
|
||||||
virtPort.write(addr, (uint32_t)0);
|
virtPort->write(addr, (uint32_t)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
|
@ -43,8 +43,10 @@
|
||||||
#include "arch/arm/isa_traits.hh"
|
#include "arch/arm/isa_traits.hh"
|
||||||
#include "arch/arm/linux/atag.hh"
|
#include "arch/arm/linux/atag.hh"
|
||||||
#include "arch/arm/linux/system.hh"
|
#include "arch/arm/linux/system.hh"
|
||||||
|
#include "arch/arm/utility.hh"
|
||||||
#include "base/loader/object_file.hh"
|
#include "base/loader/object_file.hh"
|
||||||
#include "base/loader/symtab.hh"
|
#include "base/loader/symtab.hh"
|
||||||
|
#include "cpu/thread_context.hh"
|
||||||
#include "mem/physical.hh"
|
#include "mem/physical.hh"
|
||||||
|
|
||||||
using namespace ArmISA;
|
using namespace ArmISA;
|
||||||
|
@ -87,7 +89,7 @@ LinuxArmSystem::LinuxArmSystem(Params *p)
|
||||||
DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2);
|
DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2);
|
||||||
DDUMP(Loader, boot_data, size << 2);
|
DDUMP(Loader, boot_data, size << 2);
|
||||||
|
|
||||||
functionalPort.writeBlob(ParamsList, boot_data, size << 2);
|
functionalPort->writeBlob(ParamsList, boot_data, size << 2);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic");
|
kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic");
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "cpu/base.hh"
|
#include "cpu/base.hh"
|
||||||
#include "cpu/thread_context.hh"
|
#include "cpu/thread_context.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
#include "sim/system.hh"
|
#include "sim/system.hh"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace ArmISA;
|
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
ArmSystem::ArmSystem(Params *p)
|
ArmSystem::ArmSystem(Params *p)
|
||||||
|
|
|
@ -50,7 +50,7 @@ MipsSystem::MipsSystem(Params *p) : System(p)
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
if (p->bare_iron == true) {
|
if (p->bare_iron == true) {
|
||||||
hexFile = new HexFile(params()->hex_file_name);
|
hexFile = new HexFile(params()->hex_file_name);
|
||||||
if (!hexFile->loadSections(&functionalPort))
|
if (!hexFile->loadSections(functionalPort))
|
||||||
panic("Could not load hex file\n");
|
panic("Could not load hex file\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ MipsSystem::MipsSystem(Params *p) : System(p)
|
||||||
if (console == NULL)
|
if (console == NULL)
|
||||||
fatal("Could not load console file %s", params()->console);
|
fatal("Could not load console file %s", params()->console);
|
||||||
//Load program sections into memory
|
//Load program sections into memory
|
||||||
console->loadSections(&functionalPort, loadAddrMask);
|
console->loadSections(functionalPort, loadAddrMask);
|
||||||
|
|
||||||
//load symbols
|
//load symbols
|
||||||
if (!console->loadGlobalSymbols(consoleSymtab))
|
if (!console->loadGlobalSymbols(consoleSymtab))
|
||||||
|
@ -92,7 +92,7 @@ MipsSystem::MipsSystem(Params *p) : System(p)
|
||||||
*/
|
*/
|
||||||
if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
|
if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
|
||||||
warn("writing addr starting from %#x", addr);
|
warn("writing addr starting from %#x", addr);
|
||||||
virtPort.writeBlob(addr, (uint8_t*)params()->boot_osflags.c_str(),
|
virtPort->writeBlob(addr, (uint8_t*)params()->boot_osflags.c_str(),
|
||||||
strlen(params()->boot_osflags.c_str()));
|
strlen(params()->boot_osflags.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,9 +103,9 @@ MipsSystem::MipsSystem(Params *p) : System(p)
|
||||||
if (consoleSymtab->findAddress("m5_rpb", addr)) {
|
if (consoleSymtab->findAddress("m5_rpb", addr)) {
|
||||||
uint64_t data;
|
uint64_t data;
|
||||||
data = htog(params()->system_type);
|
data = htog(params()->system_type);
|
||||||
virtPort.write(addr + 0x50, data);
|
virtPort->write(addr + 0x50, data);
|
||||||
data = htog(params()->system_rev);
|
data = htog(params()->system_rev);
|
||||||
virtPort.write(addr + 0x58, data);
|
virtPort->write(addr + 0x58, data);
|
||||||
} else {
|
} else {
|
||||||
panic("could not find hwrpb\n");
|
panic("could not find hwrpb\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -126,6 +126,7 @@
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
#include "arch/vtophys.hh"
|
#include "arch/vtophys.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "base/intmath.hh"
|
#include "base/intmath.hh"
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "cpu/profile.hh"
|
#include "cpu/profile.hh"
|
||||||
#include "cpu/quiesce_event.hh"
|
#include "cpu/quiesce_event.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
#include "sim/serialize.hh"
|
#include "sim/serialize.hh"
|
||||||
#include "sim/sim_exit.hh"
|
#include "sim/sim_exit.hh"
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -68,7 +68,7 @@ SimpleDisk::read(Addr addr, baddr_t block, int count) const
|
||||||
for (int i = 0, j = 0; i < count; i += SectorSize, j++)
|
for (int i = 0, j = 0; i < count; i += SectorSize, j++)
|
||||||
image->read(data + i, block + j);
|
image->read(data + i, block + j);
|
||||||
|
|
||||||
system->functionalPort.writeBlob(addr, data, count);
|
system->functionalPort->writeBlob(addr, data, count);
|
||||||
|
|
||||||
DPRINTF(SimpleDisk, "read block=%#x len=%d\n", (uint64_t)block, count);
|
DPRINTF(SimpleDisk, "read block=%#x len=%d\n", (uint64_t)block, count);
|
||||||
DDUMP(SimpleDiskData, data, count);
|
DDUMP(SimpleDiskData, data, count);
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
#include "arch/sparc/isa_traits.hh"
|
#include "arch/sparc/isa_traits.hh"
|
||||||
#include "arch/sparc/faults.hh"
|
#include "arch/sparc/faults.hh"
|
||||||
|
#include "base/bitfield.hh"
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "cpu/intr_control.hh"
|
#include "cpu/intr_control.hh"
|
||||||
#include "dev/sparc/iob.hh"
|
#include "dev/sparc/iob.hh"
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
#include "arch/vtophys.hh"
|
#include "arch/vtophys.hh"
|
||||||
#include "kern/kernel_stats.hh"
|
#include "kern/kernel_stats.hh"
|
||||||
|
#include "mem/vport.hh"
|
||||||
#else
|
#else
|
||||||
#include "params/System.hh"
|
#include "params/System.hh"
|
||||||
#endif
|
#endif
|
||||||
|
@ -64,8 +65,6 @@ System::System(Params *p)
|
||||||
: SimObject(p), physmem(p->physmem), _numContexts(0),
|
: SimObject(p), physmem(p->physmem), _numContexts(0),
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
init_param(p->init_param),
|
init_param(p->init_param),
|
||||||
functionalPort(p->name + "-fport"),
|
|
||||||
virtPort(p->name + "-vport"),
|
|
||||||
loadAddrMask(p->load_addr_mask),
|
loadAddrMask(p->load_addr_mask),
|
||||||
#else
|
#else
|
||||||
page_ptr(0),
|
page_ptr(0),
|
||||||
|
@ -86,13 +85,15 @@ System::System(Params *p)
|
||||||
* Get a functional port to memory
|
* Get a functional port to memory
|
||||||
*/
|
*/
|
||||||
Port *mem_port;
|
Port *mem_port;
|
||||||
|
functionalPort = new FunctionalPort(name() + "-fport");
|
||||||
mem_port = physmem->getPort("functional");
|
mem_port = physmem->getPort("functional");
|
||||||
functionalPort.setPeer(mem_port);
|
functionalPort->setPeer(mem_port);
|
||||||
mem_port->setPeer(&functionalPort);
|
mem_port->setPeer(functionalPort);
|
||||||
|
|
||||||
|
virtPort = new VirtualPort(name() + "-fport");
|
||||||
mem_port = physmem->getPort("functional");
|
mem_port = physmem->getPort("functional");
|
||||||
virtPort.setPeer(mem_port);
|
virtPort->setPeer(mem_port);
|
||||||
mem_port->setPeer(&virtPort);
|
mem_port->setPeer(virtPort);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -110,7 +111,7 @@ System::System(Params *p)
|
||||||
fatal("Could not load kernel file %s", params()->kernel);
|
fatal("Could not load kernel file %s", params()->kernel);
|
||||||
|
|
||||||
// Load program sections into memory
|
// Load program sections into memory
|
||||||
kernel->loadSections(&functionalPort, loadAddrMask);
|
kernel->loadSections(functionalPort, loadAddrMask);
|
||||||
|
|
||||||
// setup entry points
|
// setup entry points
|
||||||
kernelStart = kernel->textBase();
|
kernelStart = kernel->textBase();
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
#include "kern/system_events.hh"
|
#include "kern/system_events.hh"
|
||||||
#include "mem/vport.hh"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class BaseCPU;
|
class BaseCPU;
|
||||||
|
@ -58,6 +57,8 @@ class PhysicalMemory;
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
class Platform;
|
class Platform;
|
||||||
|
class FunctionalPort;
|
||||||
|
class VirtualPort;
|
||||||
#endif
|
#endif
|
||||||
class GDBListener;
|
class GDBListener;
|
||||||
class BaseRemoteGDB;
|
class BaseRemoteGDB;
|
||||||
|
@ -108,8 +109,8 @@ class System : public SimObject
|
||||||
|
|
||||||
/** Port to physical memory used for writing object files into ram at
|
/** Port to physical memory used for writing object files into ram at
|
||||||
* boot.*/
|
* boot.*/
|
||||||
FunctionalPort functionalPort;
|
FunctionalPort *functionalPort;
|
||||||
VirtualPort virtPort;
|
VirtualPort *virtPort;
|
||||||
|
|
||||||
/** kernel symbol table */
|
/** kernel symbol table */
|
||||||
SymbolTable *kernelSymtab;
|
SymbolTable *kernelSymtab;
|
||||||
|
|
Loading…
Reference in a new issue