Merge zizzer.eecs.umich.edu:/bk/m5
[gem5.git] / sim / system.cc
1 /*
2 * Copyright (c) 2002-2004 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "base/loader/object_file.hh"
30 #include "base/loader/symtab.hh"
31 #include "base/remote_gdb.hh"
32 #include "cpu/exec_context.hh"
33 #include "kern/kernel_stats.hh"
34 #include "mem/functional_mem/memory_control.hh"
35 #include "mem/functional_mem/physical_memory.hh"
36 #include "targetarch/vtophys.hh"
37 #include "sim/param.hh"
38 #include "sim/system.hh"
39 #include "base/trace.hh"
40
41 using namespace std;
42
43 vector<System *> System::systemList;
44
45 int System::numSystemsRunning = 0;
46
47 System::System(Params *p)
48 : SimObject(p->name), memctrl(p->memctrl), physmem(p->physmem),
49 init_param(p->init_param), params(p)
50 {
51 // add self to global system list
52 systemList.push_back(this);
53
54 kernelSymtab = new SymbolTable;
55 consoleSymtab = new SymbolTable;
56 palSymtab = new SymbolTable;
57 debugSymbolTable = new SymbolTable;
58
59 /**
60 * Load the kernel, pal, and console code into memory
61 */
62 // Load kernel code
63 kernel = createObjectFile(params->kernel_path);
64 if (kernel == NULL)
65 fatal("Could not load kernel file %s", params->kernel_path);
66
67 // Load Console Code
68 console = createObjectFile(params->console_path);
69 if (console == NULL)
70 fatal("Could not load console file %s", params->console_path);
71
72 // Load pal file
73 pal = createObjectFile(params->palcode);
74 if (pal == NULL)
75 fatal("Could not load PALcode file %s", params->palcode);
76
77
78 // Load program sections into memory
79 pal->loadSections(physmem, true);
80 console->loadSections(physmem, true);
81 kernel->loadSections(physmem, true);
82
83 // setup entry points
84 kernelStart = kernel->textBase();
85 kernelEnd = kernel->bssBase() + kernel->bssSize();
86 kernelEntry = kernel->entryPoint();
87
88 // load symbols
89 if (!kernel->loadGlobalSymbols(kernelSymtab))
90 panic("could not load kernel symbols\n");
91
92 if (!kernel->loadLocalSymbols(kernelSymtab))
93 panic("could not load kernel local symbols\n");
94
95 if (!console->loadGlobalSymbols(consoleSymtab))
96 panic("could not load console symbols\n");
97
98 if (!pal->loadGlobalSymbols(palSymtab))
99 panic("could not load pal symbols\n");
100
101 if (!pal->loadLocalSymbols(palSymtab))
102 panic("could not load pal symbols\n");
103
104 if (!kernel->loadGlobalSymbols(debugSymbolTable))
105 panic("could not load kernel symbols\n");
106
107 if (!kernel->loadLocalSymbols(debugSymbolTable))
108 panic("could not load kernel local symbols\n");
109
110 if (!console->loadGlobalSymbols(debugSymbolTable))
111 panic("could not load console symbols\n");
112
113 if (!pal->loadGlobalSymbols(debugSymbolTable))
114 panic("could not load pal symbols\n");
115
116 if (!pal->loadLocalSymbols(debugSymbolTable))
117 panic("could not load pal symbols\n");
118
119
120 DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
121 DPRINTF(Loader, "Kernel end = %#x\n", kernelEnd);
122 DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
123 DPRINTF(Loader, "Kernel loaded...\n");
124
125 Addr addr = 0;
126 #ifdef DEBUG
127 consolePanicEvent = new BreakPCEvent(&pcEventQueue, "console panic");
128 if (consoleSymtab->findAddress("panic", addr))
129 consolePanicEvent->schedule(addr);
130 #endif
131
132 /**
133 * Copy the osflags (kernel arguments) into the consoles
134 * memory. (Presently Linux does not use the console service
135 * routine to get these command line arguments, but Tru64 and
136 * others do.)
137 */
138 if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
139 Addr paddr = vtophys(physmem, addr);
140 char *osflags = (char *)physmem->dma_addr(paddr, sizeof(uint32_t));
141
142 if (osflags)
143 strcpy(osflags, params->boot_osflags.c_str());
144 }
145
146 /**
147 * Set the hardware reset parameter block system type and revision
148 * information to Tsunami.
149 */
150 if (consoleSymtab->findAddress("xxm_rpb", addr)) {
151 Addr paddr = vtophys(physmem, addr);
152 char *hwrpb = (char *)physmem->dma_addr(paddr, sizeof(uint64_t));
153
154 if (!hwrpb)
155 panic("could not translate hwrpb addr\n");
156
157 *(uint64_t*)(hwrpb+0x50) = htoa(params->system_type);
158 *(uint64_t*)(hwrpb+0x58) = htoa(params->system_rev);
159 } else
160 panic("could not find hwrpb\n");
161
162 // increment the number of running systms
163 numSystemsRunning++;
164
165 kernelBinning = new Kernel::Binning(this);
166 }
167
168 System::~System()
169 {
170 delete kernelSymtab;
171 delete consoleSymtab;
172 delete kernel;
173 delete console;
174 delete pal;
175
176 delete kernelBinning;
177
178 #ifdef DEBUG
179 delete consolePanicEvent;
180 #endif
181 }
182
183 bool
184 System::breakpoint()
185 {
186 return remoteGDB[0]->trap(ALPHA_KENTRY_INT);
187 }
188
189 int
190 System::registerExecContext(ExecContext *xc)
191 {
192 int xcIndex = execContexts.size();
193 execContexts.push_back(xc);
194
195 RemoteGDB *rgdb = new RemoteGDB(this, xc);
196 GDBListener *gdbl = new GDBListener(rgdb, 7000 + xcIndex);
197 gdbl->listen();
198 /**
199 * Uncommenting this line waits for a remote debugger to connect
200 * to the simulator before continuing.
201 */
202 //gdbl->accept();
203
204 if (remoteGDB.size() <= xcIndex) {
205 remoteGDB.resize(xcIndex+1);
206 }
207
208 remoteGDB[xcIndex] = rgdb;
209
210 return xcIndex;
211 }
212
213 void
214 System::startup()
215 {
216 if (!execContexts.empty()) {
217 // activate with zero delay so that we start ticking right
218 // away on cycle 0
219 execContexts[0]->activate(0);
220 }
221 }
222
223 void
224 System::replaceExecContext(ExecContext *xc, int xcIndex)
225 {
226 if (xcIndex >= execContexts.size()) {
227 panic("replaceExecContext: bad xcIndex, %d >= %d\n",
228 xcIndex, execContexts.size());
229 }
230
231 execContexts[xcIndex] = xc;
232 remoteGDB[xcIndex]->replaceExecContext(xc);
233 }
234
235 void
236 System::regStats()
237 {
238 kernelBinning->regStats(name() + ".kern");
239 }
240
241 void
242 System::serialize(ostream &os)
243 {
244 kernelBinning->serialize(os);
245 }
246
247
248 void
249 System::unserialize(Checkpoint *cp, const string &section)
250 {
251 kernelBinning->unserialize(cp, section);
252 }
253
254 void
255 System::printSystems()
256 {
257 vector<System *>::iterator i = systemList.begin();
258 vector<System *>::iterator end = systemList.end();
259 for (; i != end; ++i) {
260 System *sys = *i;
261 cerr << "System " << sys->name() << ": " << hex << sys << endl;
262 }
263 }
264
265 extern "C"
266 void
267 printSystems()
268 {
269 System::printSystems();
270 }
271
272 DEFINE_SIM_OBJECT_CLASS_NAME("System", System)
273