ca9d68d77fd9b70b2615673bfae72f1831685d6e
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/exec_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
),
33 // add self to global system list
34 systemList
.push_back(this);
37 kernelSymtab
= new SymbolTable
;
38 debugSymbolTable
= new SymbolTable
;
42 * Get a functional port to memory
45 mem_port
= physmem
->getPort("functional");
46 functionalPort
.setPeer(mem_port
);
47 mem_port
->setPeer(&functionalPort
);
49 mem_port
= physmem
->getPort("functional");
50 virtPort
.setPeer(mem_port
);
51 mem_port
->setPeer(&virtPort
);
55 * Load the kernel code into memory
58 kernel
= createObjectFile(params()->kernel_path
);
60 fatal("Could not load kernel file %s", params()->kernel_path
);
62 // Load program sections into memory
63 kernel
->loadSections(&functionalPort
, LoadAddrMask
);
66 kernelStart
= kernel
->textBase();
67 kernelEnd
= kernel
->bssBase() + kernel
->bssSize();
68 kernelEntry
= kernel
->entryPoint();
71 if (!kernel
->loadGlobalSymbols(kernelSymtab
))
72 panic("could not load kernel symbols\n");
74 if (!kernel
->loadLocalSymbols(kernelSymtab
))
75 panic("could not load kernel local symbols\n");
77 if (!kernel
->loadGlobalSymbols(debugSymbolTable
))
78 panic("could not load kernel symbols\n");
80 if (!kernel
->loadLocalSymbols(debugSymbolTable
))
81 panic("could not load kernel local symbols\n");
83 DPRINTF(Loader
, "Kernel start = %#x\n", kernelStart
);
84 DPRINTF(Loader
, "Kernel end = %#x\n", kernelEnd
);
85 DPRINTF(Loader
, "Kernel entry = %#x\n", kernelEntry
);
86 DPRINTF(Loader
, "Kernel loaded...\n");
88 kernelBinning
= new Kernel::Binning(this);
91 // increment the number of running systms
101 delete kernelBinning
;
103 panic("System::fixFuncEventAddr needs to be rewritten "
104 "to work with syscall emulation");
105 #endif // FULL_SYSTEM}
113 #endif // FULL_SYSTEM
116 System::registerExecContext(ExecContext
*xc
, int id
)
119 for (id
= 0; id
< execContexts
.size(); id
++) {
120 if (!execContexts
[id
])
125 if (execContexts
.size() <= id
)
126 execContexts
.resize(id
+ 1);
128 if (execContexts
[id
])
129 panic("Cannot have two CPUs with the same id (%d)\n", id
);
131 execContexts
[id
] = xc
;
135 RemoteGDB
*rgdb
= new RemoteGDB(this, xc
);
136 GDBListener
*gdbl
= new GDBListener(rgdb
, 7000 + id
);
139 * Uncommenting this line waits for a remote debugger to connect
140 * to the simulator before continuing.
142 if (rgdb_wait
!= -1 && rgdb_wait
== id
)
145 if (remoteGDB
.size() <= id
) {
146 remoteGDB
.resize(id
+ 1);
149 remoteGDB
[id
] = rgdb
;
150 #endif // FULL_SYSTEM
159 for (i
= 0; i
< execContexts
.size(); i
++)
160 execContexts
[i
]->activate(0);
164 System::replaceExecContext(ExecContext
*xc
, int id
)
166 if (id
>= execContexts
.size()) {
167 panic("replaceExecContext: bad id, %d >= %d\n",
168 id
, execContexts
.size());
171 execContexts
[id
] = xc
;
173 remoteGDB
[id
]->replaceExecContext(xc
);
174 #endif // FULL_SYSTEM
181 Addr return_addr
= page_ptr
<< LogVMPageSize
;
191 kernelBinning
->regStats(name() + ".kern");
192 #endif // FULL_SYSTEM
196 System::serialize(ostream
&os
)
199 kernelBinning
->serialize(os
);
201 kernelSymtab
->serialize("kernel_symtab", os
);
202 #endif // FULL_SYSTEM
207 System::unserialize(Checkpoint
*cp
, const string
§ion
)
210 kernelBinning
->unserialize(cp
, section
);
212 kernelSymtab
->unserialize("kernel_symtab", cp
, section
);
213 #endif // FULL_SYSTEM
217 System::printSystems()
219 vector
<System
*>::iterator i
= systemList
.begin();
220 vector
<System
*>::iterator end
= systemList
.end();
221 for (; i
!= end
; ++i
) {
223 cerr
<< "System " << sys
->name() << ": " << hex
<< sys
<< endl
;
231 System::printSystems();
236 // In full system mode, only derived classes (e.g. AlphaLinuxSystem)
237 // can be created directly.
239 DEFINE_SIM_OBJECT_CLASS_NAME("System", System
)
243 BEGIN_DECLARE_SIM_OBJECT_PARAMS(System
)
245 SimObjectParam
<PhysicalMemory
*> physmem
;
247 END_DECLARE_SIM_OBJECT_PARAMS(System
)
249 BEGIN_INIT_SIM_OBJECT_PARAMS(System
)
251 INIT_PARAM(physmem
, "physical memory")
253 END_INIT_SIM_OBJECT_PARAMS(System
)
255 CREATE_SIM_OBJECT(System
)
257 System::Params
*p
= new System::Params
;
258 p
->name
= getInstanceName();
259 p
->physmem
= physmem
;
260 return new System(p
);
263 REGISTER_SIM_OBJECT("System", System
)