1 #include "arch/isa_traits.hh"
2 #include "base/loader/object_file.hh"
3 #include "base/loader/symtab.hh"
4 #include "base/trace.hh"
5 #include "cpu/thread_context.hh"
6 #include "mem/mem_object.hh"
7 #include "mem/physical.hh"
8 #include "sim/builder.hh"
9 #include "sim/byteswap.hh"
10 #include "sim/system.hh"
12 #include "arch/vtophys.hh"
13 #include "base/remote_gdb.hh"
14 #include "kern/kernel_stats.hh"
18 using namespace TheISA
;
20 vector
<System
*> System::systemList
;
22 int System::numSystemsRunning
= 0;
24 System::System(Params
*p
)
25 : SimObject(p
->name
), physmem(p
->physmem
), numcpus(0),
27 init_param(p
->init_param
),
28 functionalPort(p
->name
+ "-fport"),
29 virtPort(p
->name
+ "-vport"),
35 // add self to global system list
36 systemList
.push_back(this);
39 kernelSymtab
= new SymbolTable
;
40 debugSymbolTable
= new SymbolTable
;
44 * Get a functional port to memory
47 mem_port
= physmem
->getPort("functional");
48 functionalPort
.setPeer(mem_port
);
49 mem_port
->setPeer(&functionalPort
);
51 mem_port
= physmem
->getPort("functional");
52 virtPort
.setPeer(mem_port
);
53 mem_port
->setPeer(&virtPort
);
57 * Load the kernel code into memory
60 kernel
= createObjectFile(params()->kernel_path
);
62 fatal("Could not load kernel file %s", params()->kernel_path
);
64 // Load program sections into memory
65 kernel
->loadSections(&functionalPort
, LoadAddrMask
);
68 kernelStart
= kernel
->textBase();
69 kernelEnd
= kernel
->bssBase() + kernel
->bssSize();
70 kernelEntry
= kernel
->entryPoint();
73 if (!kernel
->loadGlobalSymbols(kernelSymtab
))
74 panic("could not load kernel symbols\n");
76 if (!kernel
->loadLocalSymbols(kernelSymtab
))
77 panic("could not load kernel local symbols\n");
79 if (!kernel
->loadGlobalSymbols(debugSymbolTable
))
80 panic("could not load kernel symbols\n");
82 if (!kernel
->loadLocalSymbols(debugSymbolTable
))
83 panic("could not load kernel local symbols\n");
85 DPRINTF(Loader
, "Kernel start = %#x\n", kernelStart
);
86 DPRINTF(Loader
, "Kernel end = %#x\n", kernelEnd
);
87 DPRINTF(Loader
, "Kernel entry = %#x\n", kernelEntry
);
88 DPRINTF(Loader
, "Kernel loaded...\n");
90 kernelBinning
= new Kernel::Binning(this);
93 // increment the number of running systms
103 delete kernelBinning
;
105 panic("System::fixFuncEventAddr needs to be rewritten "
106 "to work with syscall emulation");
107 #endif // FULL_SYSTEM}
115 #endif // FULL_SYSTEM
118 System::registerThreadContext(ThreadContext
*tc
, int id
)
121 for (id
= 0; id
< threadContexts
.size(); id
++) {
122 if (!threadContexts
[id
])
127 if (threadContexts
.size() <= id
)
128 threadContexts
.resize(id
+ 1);
130 if (threadContexts
[id
])
131 panic("Cannot have two CPUs with the same id (%d)\n", id
);
133 threadContexts
[id
] = tc
;
137 RemoteGDB
*rgdb
= new RemoteGDB(this, tc
);
138 GDBListener
*gdbl
= new GDBListener(rgdb
, 7000 + id
);
141 * Uncommenting this line waits for a remote debugger to connect
142 * to the simulator before continuing.
144 if (rgdb_wait
!= -1 && rgdb_wait
== id
)
147 if (remoteGDB
.size() <= id
) {
148 remoteGDB
.resize(id
+ 1);
151 remoteGDB
[id
] = rgdb
;
152 #endif // FULL_SYSTEM
161 for (i
= 0; i
< threadContexts
.size(); i
++)
162 threadContexts
[i
]->activate(0);
166 System::replaceThreadContext(ThreadContext
*tc
, int id
)
168 if (id
>= threadContexts
.size()) {
169 panic("replaceThreadContext: bad id, %d >= %d\n",
170 id
, threadContexts
.size());
173 threadContexts
[id
] = tc
;
175 remoteGDB
[id
]->replaceThreadContext(tc
);
176 #endif // FULL_SYSTEM
183 Addr return_addr
= page_ptr
<< LogVMPageSize
;
193 kernelBinning
->regStats(name() + ".kern");
194 #endif // FULL_SYSTEM
198 System::serialize(ostream
&os
)
201 kernelBinning
->serialize(os
);
203 kernelSymtab
->serialize("kernel_symtab", os
);
204 #endif // FULL_SYSTEM
209 System::unserialize(Checkpoint
*cp
, const string
§ion
)
212 kernelBinning
->unserialize(cp
, section
);
214 kernelSymtab
->unserialize("kernel_symtab", cp
, section
);
215 #endif // FULL_SYSTEM
219 System::printSystems()
221 vector
<System
*>::iterator i
= systemList
.begin();
222 vector
<System
*>::iterator end
= systemList
.end();
223 for (; i
!= end
; ++i
) {
225 cerr
<< "System " << sys
->name() << ": " << hex
<< sys
<< endl
;
233 System::printSystems();
238 // In full system mode, only derived classes (e.g. AlphaLinuxSystem)
239 // can be created directly.
241 DEFINE_SIM_OBJECT_CLASS_NAME("System", System
)
245 BEGIN_DECLARE_SIM_OBJECT_PARAMS(System
)
247 SimObjectParam
<PhysicalMemory
*> physmem
;
249 END_DECLARE_SIM_OBJECT_PARAMS(System
)
251 BEGIN_INIT_SIM_OBJECT_PARAMS(System
)
253 INIT_PARAM(physmem
, "physical memory")
255 END_INIT_SIM_OBJECT_PARAMS(System
)
257 CREATE_SIM_OBJECT(System
)
259 System::Params
*p
= new System::Params
;
260 p
->name
= getInstanceName();
261 p
->physmem
= physmem
;
262 return new System(p
);
265 REGISTER_SIM_OBJECT("System", System
)