/*
- * Copyright (c) 2003 The Regents of The University of Michigan
+ * Copyright (c) 2002-2004 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include <string>
#include <vector>
-#include "sim/sim_object.hh"
+#include "base/statistics.hh"
#include "cpu/pc_event.hh"
-#include "base/loader/symtab.hh"
+#include "kern/system_events.hh"
+#include "sim/sim_object.hh"
+class BaseCPU;
+class ExecContext;
+class GDBListener;
class MemoryController;
+class ObjectFile;
class PhysicalMemory;
+class Platform;
class RemoteGDB;
-class GDBListener;
-
-class ExecContext;
+class SymbolTable;
+namespace Kernel { class Binning; }
class System : public SimObject
{
public:
- const int init_param;
- MemoryController *memCtrl;
+ MemoryController *memctrl;
PhysicalMemory *physmem;
-
+ Platform *platform;
PCEventQueue pcEventQueue;
+ uint64_t init_param;
+
+ std::vector<ExecContext *> execContexts;
+
+ /** kernel Symbol table */
+ SymbolTable *kernelSymtab;
+
+ /** console symbol table */
+ SymbolTable *consoleSymtab;
+
+ /** pal symbol table */
+ SymbolTable *palSymtab;
- std::vector<ExecContext *> xcvec;
- void registerExecContext(ExecContext *xc);
+ /** Object pointer for the kernel code */
+ ObjectFile *kernel;
+
+ /** Object pointer for the console code */
+ ObjectFile *console;
+
+ /** Object pointer for the PAL code */
+ ObjectFile *pal;
+
+ /** Begining of kernel code */
+ Addr kernelStart;
+
+ /** End of kernel code */
+ Addr kernelEnd;
+
+ /** Entry point in the kernel to start at */
+ Addr kernelEntry;
+
+ Kernel::Binning *kernelBinning;
+
+#ifdef DEBUG
+ /** Event to halt the simulator if the console calls panic() */
+ BreakPCEvent *consolePanicEvent;
+#endif
public:
- System(const std::string _name, const int _init_param,
- MemoryController *, PhysicalMemory *);
- ~System();
+ std::vector<RemoteGDB *> remoteGDB;
+ std::vector<GDBListener *> gdbListen;
+ bool breakpoint();
- virtual void init(ExecContext *xc) = 0;
+ public:
+ struct Params
+ {
+ std::string name;
+ Tick boot_cpu_frequency;
+ MemoryController *memctrl;
+ PhysicalMemory *physmem;
+ uint64_t init_param;
+ bool bin;
+ std::vector<std::string> binned_fns;
+ bool bin_int;
+
+ std::string kernel_path;
+ std::string console_path;
+ std::string palcode;
+ std::string boot_osflags;
+
+ std::string readfile;
+ uint64_t system_type;
+ uint64_t system_rev;
+ };
+ Params *params;
+
+ System(Params *p);
+ ~System();
- virtual Addr getKernelStart() const = 0;
- virtual Addr getKernelEnd() const = 0;
- virtual Addr getKernelEntry() const = 0;
- virtual bool breakpoint() = 0;
+ void startup();
+ public:
+ /**
+ * Returns the addess the kernel starts at.
+ * @return address the kernel starts at
+ */
+ Addr getKernelStart() const { return kernelStart; }
+
+ /**
+ * Returns the addess the kernel ends at.
+ * @return address the kernel ends at
+ */
+ Addr getKernelEnd() const { return kernelEnd; }
+
+ /**
+ * Returns the addess the entry point to the kernel code.
+ * @return entry point of the kernel code
+ */
+ Addr getKernelEntry() const { return kernelEntry; }
+
+ int registerExecContext(ExecContext *xc);
+ void replaceExecContext(ExecContext *xc, int xcIndex);
+
+ void regStats();
+ void serialize(std::ostream &os);
+ void unserialize(Checkpoint *cp, const std::string §ion);
public:
////////////////////////////////////////////