summaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
authorNathan Binkert <binkertn@umich.edu>2003-10-14 16:53:52 -0400
committerNathan Binkert <binkertn@umich.edu>2003-10-14 16:53:52 -0400
commit638a07d15a149b48c854b58e2b3f4df097aa5e2e (patch)
tree82ac6aa2e2df719eeb2c8b6d319c4c7956bbc6b1 /sim
parent2ac3dc5aa184da9fa08a304c67d646197ed9a7c5 (diff)
parent4759c203c774ef42a2a35832e220a95cffb5fa7b (diff)
downloadgem5-638a07d15a149b48c854b58e2b3f4df097aa5e2e.tar.xz
Merge
cpu/pc_event.cc: SCCS merged --HG-- extra : convert_revision : f7046f2bf6053be9b00150390fabe3d4f82b0981
Diffstat (limited to 'sim')
-rw-r--r--sim/system.cc198
-rw-r--r--sim/system.hh53
2 files changed, 20 insertions, 231 deletions
diff --git a/sim/system.cc b/sim/system.cc
index 74216176a..fd80e23c3 100644
--- a/sim/system.cc
+++ b/sim/system.cc
@@ -27,14 +27,8 @@
*/
#include "cpu/exec_context.hh"
-#include "base/loader/object_file.hh"
-#include "mem/functional_mem/memory_control.hh"
-#include "mem/functional_mem/physical_memory.hh"
-#include "base/loader/symtab.hh"
-#include "base/remote_gdb.hh"
#include "targetarch/vtophys.hh"
#include "sim/system.hh"
-#include "base/trace.hh"
using namespace std;
@@ -44,170 +38,31 @@ int System::numSystemsRunning = 0;
System::System(const std::string _name,
MemoryController *_memCtrl,
- PhysicalMemory *_physmem,
- const std::string &kernel_path,
- const std::string &console_path,
- const std::string &palcode,
- const std::string &boot_osflags)
+ PhysicalMemory *_physmem)
: SimObject(_name),
- kernel_panic_event(&pcEventQueue, "kernel panic"),
- console_panic_event(&pcEventQueue, "console panic"),
- badaddr_event(&pcEventQueue, "badaddr"),
- skip_power_state(&pcEventQueue, "tl_v48_capture_power_state"),
- skip_scavenge_boot(&pcEventQueue, "pmap_scavenge_boot"),
- printf_event(&pcEventQueue, "printf"),
- debug_printf_event(&pcEventQueue, "debug_printf", false),
- debug_printfr_event(&pcEventQueue, "debug_printfr", true),
- dump_mbuf_event(&pcEventQueue, "dump_mbuf"),
memCtrl(_memCtrl),
- physmem(_physmem),
- remoteGDB(NULL),
- gdbListen(NULL)
+ physmem(_physmem)
{
- kernelSymtab = new SymbolTable;
- consoleSymtab = new SymbolTable;
-
- ObjectFile *kernel = createObjectFile(kernel_path);
- if (kernel == NULL)
- fatal("Could not load kernel file %s", kernel_path);
-
- ObjectFile *console = createObjectFile(console_path);
- if (console == NULL)
- fatal("Could not load console file %s", console_path);
-
- if (!kernel->loadGlobalSymbols(kernelSymtab))
- panic("could not load kernel symbols\n");
-
- if (!console->loadGlobalSymbols(consoleSymtab))
- panic("could not load console symbols\n");
-
- // Load pal file
- ObjectFile *pal = createObjectFile(palcode);
- if (pal == NULL)
- fatal("Could not load PALcode file %s", palcode);
- pal->loadSections(physmem, true);
-
- // copy of initial reg file contents
- initRegs = new RegFile;
- memset(initRegs, 0, sizeof(RegFile));
-
- // Load console file
- console->loadSections(physmem, true);
-
- // Load kernel file
- kernel->loadSections(physmem, true);
- kernelStart = kernel->textBase();
- kernelEnd = kernel->bssBase() + kernel->bssSize();
- kernelEntry = kernel->entryPoint();
-
- DPRINTF(Loader, "Kernel start = %#x\n"
- "Kernel end = %#x\n"
- "Kernel entry = %#x\n",
- kernelStart, kernelEnd, kernelEntry);
-
- // Setup kernel boot parameters
- initRegs->pc = 0x4001;
- initRegs->npc = initRegs->pc + sizeof(MachInst);
-
- DPRINTF(Loader, "Kernel loaded...\n");
-
-#ifdef FULL_SYSTEM
- Addr addr = 0;
-
- for(int i = 0; i < 12/*MAX_CPUS*/; i++)
- xc_array[i] = (ExecContext *) 0;
-
- num_cpus = 0;
-
- if (kernelSymtab->findAddress("enable_async_printf", addr)) {
- Addr paddr = vtophys(physmem, addr);
- uint8_t *enable_async_printf =
- physmem->dma_addr(paddr, sizeof(uint32_t));
-
- if (enable_async_printf)
- *(uint32_t *)enable_async_printf = 0;
- }
-
- if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
- Addr paddr = vtophys(physmem, addr);
- char *osflags = (char *)physmem->dma_addr(paddr, sizeof(uint32_t));
-
- if (osflags)
- strcpy(osflags, boot_osflags.c_str());
- }
-
- if (kernelSymtab->findAddress("panic", addr))
- kernel_panic_event.schedule(addr);
- else
- panic("could not find kernel symbol \'panic\'");
-
- if (consoleSymtab->findAddress("panic", addr))
- console_panic_event.schedule(addr);
-
- if (kernelSymtab->findAddress("badaddr", addr))
- badaddr_event.schedule(addr);
- else
- panic("could not find kernel symbol \'badaddr\'");
-
- if (kernelSymtab->findAddress("tl_v48_capture_power_state", addr))
- skip_power_state.schedule(addr);
-
- if (kernelSymtab->findAddress("pmap_scavenge_boot", addr))
- skip_scavenge_boot.schedule(addr);
-
-#if TRACING_ON
- if (kernelSymtab->findAddress("printf", addr))
- printf_event.schedule(addr);
-
- if (kernelSymtab->findAddress("m5printf", addr))
- debug_printf_event.schedule(addr);
-
- if (kernelSymtab->findAddress("m5printfr", addr))
- debug_printfr_event.schedule(addr);
-
- if (kernelSymtab->findAddress("m5_dump_mbuf", addr))
- dump_mbuf_event.schedule(addr);
-#endif
-
-#endif
-
// add self to global system list
systemList.push_back(this);
-
- numSystemsRunning++;
}
System::~System()
{
- delete kernelSymtab;
- delete consoleSymtab;
- delete initRegs;
-}
-
-
-void
-System::initBootContext(ExecContext *xc)
-{
- xc->regs = *initRegs;
-
- remoteGDB = new RemoteGDB(this, xc);
- gdbListen = new GDBListener(remoteGDB, 7000);
- gdbListen->listen();
-
- // Reset the system
- //
- TheISA::init(physmem, &xc->regs);
}
void
System::registerExecContext(ExecContext *xc)
{
- if (num_cpus == 12/*MAX_CPUS*/)
+ if (xc->cpu_id >= 12/*MAX_CPUS*/)
panic("Too many CPU's\n");
- xc_array[xc->cpu_id] = xc;
- num_cpus++;
+
+ if (xc->cpu_id >= xcvec.size())
+ xcvec.resize(xc->cpu_id + 1);
+
+ xcvec[xc->cpu_id] = xc;
}
@@ -222,7 +77,6 @@ System::printSystems()
}
}
-
extern "C"
void
printSystems()
@@ -230,39 +84,5 @@ printSystems()
System::printSystems();
}
+DEFINE_SIM_OBJECT_CLASS_NAME("System", System)
-BEGIN_DECLARE_SIM_OBJECT_PARAMS(System)
-
- SimObjectParam<MemoryController *> mem_ctl;
- SimObjectParam<PhysicalMemory *> physmem;
-
- Param<string> kernel_code;
- Param<string> console_code;
- Param<string> pal_code;
- Param<string> boot_osflags;
-
-END_DECLARE_SIM_OBJECT_PARAMS(System)
-
-BEGIN_INIT_SIM_OBJECT_PARAMS(System)
-
- INIT_PARAM(mem_ctl, "memory controller"),
- INIT_PARAM(physmem, "phsyical memory"),
- INIT_PARAM(kernel_code, "file that contains the kernel code"),
- INIT_PARAM(console_code, "file that contains the console code"),
- INIT_PARAM(pal_code, "file that contains palcode"),
- INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
- "a")
-
-END_INIT_SIM_OBJECT_PARAMS(System)
-
-
-CREATE_SIM_OBJECT(System)
-{
- System *sys = new System(getInstanceName(), mem_ctl, physmem,
- kernel_code, console_code, pal_code,
- boot_osflags);
-
- return sys;
-}
-
-REGISTER_SIM_OBJECT("System", System)
diff --git a/sim/system.hh b/sim/system.hh
index 830e78f4a..bec1011ce 100644
--- a/sim/system.hh
+++ b/sim/system.hh
@@ -30,6 +30,7 @@
#define __SYSTEM_HH__
#include <string>
+#include <vector>
#include "sim/sim_object.hh"
#include "cpu/pc_event.hh"
@@ -44,67 +45,35 @@ class ExecContext;
class System : public SimObject
{
- private:
-
- SymbolTable *kernelSymtab;
- SymbolTable *consoleSymtab;
-
- BreakPCEvent kernel_panic_event;
- BreakPCEvent console_panic_event;
- BadAddrEvent badaddr_event;
- SkipFuncEvent skip_power_state;
- SkipFuncEvent skip_scavenge_boot;
- PrintfEvent printf_event;
- DebugPrintfEvent debug_printf_event;
- DebugPrintfEvent debug_printfr_event;
- DumpMbufEvent dump_mbuf_event;
-
- RegFile *initRegs;
-
- Addr kernelStart;
- Addr kernelEnd;
- Addr kernelEntry;
-
public:
-
MemoryController *memCtrl;
PhysicalMemory *physmem;
PCEventQueue pcEventQueue;
- ExecContext *xc_array[12/*MAX_CPUS*/];
- int num_cpus;
-
- RemoteGDB *remoteGDB;
- GDBListener *gdbListen;
-
- System(const std::string name,
- MemoryController *, PhysicalMemory *,
- const std::string &kernel_path, const std::string &console_path,
- const std::string &palcode, const std::string &boot_osflags);
+ std::vector<ExecContext *> xcvec;
+ void registerExecContext(ExecContext *xc);
+ public:
+ System(const std::string name, MemoryController *, PhysicalMemory *);
~System();
- const SymbolTable *getKernelSymtab() const { return kernelSymtab; }
- const SymbolTable *getConsoleSymtab() const { return consoleSymtab; }
+ virtual void init(ExecContext *xc) = 0;
- Addr getKernelStart() const { return kernelStart; }
- Addr getKernelEnd() const { return kernelEnd; }
- Addr getKernelEntry() const { return kernelEntry; }
+ virtual Addr getKernelStart() const = 0;
+ virtual Addr getKernelEnd() const = 0;
+ virtual Addr getKernelEntry() const = 0;
+ virtual bool breakpoint() = 0;
- void initBootContext(ExecContext *xc);
- void registerExecContext(ExecContext *xc);
+ public:
////////////////////////////////////////////
//
// STATIC GLOBAL SYSTEM LIST
//
////////////////////////////////////////////
- public:
-
static std::vector<System *> systemList;
-
static int numSystemsRunning;
static void printSystems();