system.cc (3138:6d4c1cc3af0b) system.cc (3527:0485338dc5e1)
1/*
2 * Copyright (c) 2002-2006 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 * Authors: Ali Saidi
29 */
30
31#include "arch/sparc/system.hh"
32#include "arch/vtophys.hh"
33#include "base/remote_gdb.hh"
34#include "base/loader/object_file.hh"
35#include "base/loader/symtab.hh"
36#include "base/trace.hh"
37#include "mem/physical.hh"
38#include "sim/byteswap.hh"
39#include "sim/builder.hh"
40
41
42using namespace BigEndianGuest;
43
44SparcSystem::SparcSystem(Params *p)
45 : System(p), sysTick(0)
46
47{
48 resetSymtab = new SymbolTable;
49 hypervisorSymtab = new SymbolTable;
50 openbootSymtab = new SymbolTable;
51
52
53 /**
54 * Load the boot code, and hypervisor into memory.
55 */
56 // Read the reset binary
57 reset = createObjectFile(params()->reset_bin);
58 if (reset == NULL)
59 fatal("Could not load reset binary %s", params()->reset_bin);
60
61 // Read the openboot binary
62 openboot = createObjectFile(params()->openboot_bin);
63 if (openboot == NULL)
64 fatal("Could not load openboot bianry %s", params()->openboot_bin);
65
66 // Read the hypervisor binary
67 hypervisor = createObjectFile(params()->hypervisor_bin);
68 if (hypervisor == NULL)
69 fatal("Could not load hypervisor binary %s", params()->hypervisor_bin);
70
71
72 // Load reset binary into memory
73 reset->loadSections(&functionalPort, SparcISA::LoadAddrMask);
74 // Load the openboot binary
75 openboot->loadSections(&functionalPort, SparcISA::LoadAddrMask);
76 // Load the hypervisor binary
77 hypervisor->loadSections(&functionalPort, SparcISA::LoadAddrMask);
78
79 // load symbols
1/*
2 * Copyright (c) 2002-2006 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 * Authors: Ali Saidi
29 */
30
31#include "arch/sparc/system.hh"
32#include "arch/vtophys.hh"
33#include "base/remote_gdb.hh"
34#include "base/loader/object_file.hh"
35#include "base/loader/symtab.hh"
36#include "base/trace.hh"
37#include "mem/physical.hh"
38#include "sim/byteswap.hh"
39#include "sim/builder.hh"
40
41
42using namespace BigEndianGuest;
43
44SparcSystem::SparcSystem(Params *p)
45 : System(p), sysTick(0)
46
47{
48 resetSymtab = new SymbolTable;
49 hypervisorSymtab = new SymbolTable;
50 openbootSymtab = new SymbolTable;
51
52
53 /**
54 * Load the boot code, and hypervisor into memory.
55 */
56 // Read the reset binary
57 reset = createObjectFile(params()->reset_bin);
58 if (reset == NULL)
59 fatal("Could not load reset binary %s", params()->reset_bin);
60
61 // Read the openboot binary
62 openboot = createObjectFile(params()->openboot_bin);
63 if (openboot == NULL)
64 fatal("Could not load openboot bianry %s", params()->openboot_bin);
65
66 // Read the hypervisor binary
67 hypervisor = createObjectFile(params()->hypervisor_bin);
68 if (hypervisor == NULL)
69 fatal("Could not load hypervisor binary %s", params()->hypervisor_bin);
70
71
72 // Load reset binary into memory
73 reset->loadSections(&functionalPort, SparcISA::LoadAddrMask);
74 // Load the openboot binary
75 openboot->loadSections(&functionalPort, SparcISA::LoadAddrMask);
76 // Load the hypervisor binary
77 hypervisor->loadSections(&functionalPort, SparcISA::LoadAddrMask);
78
79 // load symbols
80 if (!reset->loadGlobalSymbols(reset))
80 if (!reset->loadGlobalSymbols(resetSymtab))
81 panic("could not load reset symbols\n");
82
83 if (!openboot->loadGlobalSymbols(openbootSymtab))
84 panic("could not load openboot symbols\n");
85
86 if (!hypervisor->loadLocalSymbols(hypervisorSymtab))
87 panic("could not load hypervisor symbols\n");
88
89 // load symbols into debug table
90 if (!reset->loadGlobalSymbols(debugSymbolTable))
91 panic("could not load reset symbols\n");
92
93 if (!openboot->loadGlobalSymbols(debugSymbolTable))
94 panic("could not load openboot symbols\n");
95
96 if (!hypervisor->loadLocalSymbols(debugSymbolTable))
97 panic("could not load hypervisor symbols\n");
98
99
100 // @todo any fixup code over writing data in binaries on setting break
101 // events on functions should happen here.
102
103}
104
105SparcSystem::~SparcSystem()
106{
107 delete resetSymtab;
108 delete hypervisorSymtab;
109 delete openbootSymtab;
110 delete reset;
111 delete openboot;
112 delete hypervisor;
113}
114
115bool
116SparcSystem::breakpoint()
117{
118 panic("Need to implement");
119}
120
121void
122SparcSystem::serialize(std::ostream &os)
123{
124 System::serialize(os);
125 resetSymtab->serialize("reset_symtab", os);
126 hypervisorSymtab->serialize("hypervisor_symtab", os);
127 openbootSymtab->serialize("openboot_symtab", os);
128}
129
130
131void
132SparcSystem::unserialize(Checkpoint *cp, const std::string &section)
133{
134 System::unserialize(cp,section);
135 resetSymtab->unserialize("reset_symtab", cp, section);
136 hypervisorSymtab->unserialize("hypervisor_symtab", cp, section);
137 openbootSymtab->unserialize("openboot_symtab", cp, section);
138}
139
140
141BEGIN_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
142
143 SimObjectParam<PhysicalMemory *> physmem;
144 SimpleEnumParam<System::MemoryMode> mem_mode;
145
146 Param<std::string> kernel;
147 Param<std::string> reset_bin;
148 Param<std::string> hypervisor_bin;
149 Param<std::string> openboot_bin;
150
81 panic("could not load reset symbols\n");
82
83 if (!openboot->loadGlobalSymbols(openbootSymtab))
84 panic("could not load openboot symbols\n");
85
86 if (!hypervisor->loadLocalSymbols(hypervisorSymtab))
87 panic("could not load hypervisor symbols\n");
88
89 // load symbols into debug table
90 if (!reset->loadGlobalSymbols(debugSymbolTable))
91 panic("could not load reset symbols\n");
92
93 if (!openboot->loadGlobalSymbols(debugSymbolTable))
94 panic("could not load openboot symbols\n");
95
96 if (!hypervisor->loadLocalSymbols(debugSymbolTable))
97 panic("could not load hypervisor symbols\n");
98
99
100 // @todo any fixup code over writing data in binaries on setting break
101 // events on functions should happen here.
102
103}
104
105SparcSystem::~SparcSystem()
106{
107 delete resetSymtab;
108 delete hypervisorSymtab;
109 delete openbootSymtab;
110 delete reset;
111 delete openboot;
112 delete hypervisor;
113}
114
115bool
116SparcSystem::breakpoint()
117{
118 panic("Need to implement");
119}
120
121void
122SparcSystem::serialize(std::ostream &os)
123{
124 System::serialize(os);
125 resetSymtab->serialize("reset_symtab", os);
126 hypervisorSymtab->serialize("hypervisor_symtab", os);
127 openbootSymtab->serialize("openboot_symtab", os);
128}
129
130
131void
132SparcSystem::unserialize(Checkpoint *cp, const std::string &section)
133{
134 System::unserialize(cp,section);
135 resetSymtab->unserialize("reset_symtab", cp, section);
136 hypervisorSymtab->unserialize("hypervisor_symtab", cp, section);
137 openbootSymtab->unserialize("openboot_symtab", cp, section);
138}
139
140
141BEGIN_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
142
143 SimObjectParam<PhysicalMemory *> physmem;
144 SimpleEnumParam<System::MemoryMode> mem_mode;
145
146 Param<std::string> kernel;
147 Param<std::string> reset_bin;
148 Param<std::string> hypervisor_bin;
149 Param<std::string> openboot_bin;
150
151 Param<Tick> boot_cpu_frequency;
151 Param<std::string> boot_osflags;
152 Param<std::string> boot_osflags;
153 Param<uint64_t> system_type;
154 Param<uint64_t> system_rev;
152 Param<std::string> readfile;
153 Param<unsigned int> init_param;
154
155END_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
156
157BEGIN_INIT_SIM_OBJECT_PARAMS(SparcSystem)
158
155 Param<std::string> readfile;
156 Param<unsigned int> init_param;
157
158END_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
159
160BEGIN_INIT_SIM_OBJECT_PARAMS(SparcSystem)
161
159 INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"),
160 INIT_PARAM(physmem, "phsyical memory"),
161 INIT_ENUM_PARAM(mem_mode, "Memory Mode, (1=atomic, 2=timing)",
162 System::MemoryModeStrings),
163 INIT_PARAM(kernel, "file that contains the kernel code"),
164 INIT_PARAM(reset_bin, "file that contains the reset code"),
165 INIT_PARAM(hypervisor_bin, "file that contains the hypervisor code"),
166 INIT_PARAM(openboot_bin, "file that contains the openboot code"),
162 INIT_PARAM(physmem, "phsyical memory"),
163 INIT_ENUM_PARAM(mem_mode, "Memory Mode, (1=atomic, 2=timing)",
164 System::MemoryModeStrings),
165 INIT_PARAM(kernel, "file that contains the kernel code"),
166 INIT_PARAM(reset_bin, "file that contains the reset code"),
167 INIT_PARAM(hypervisor_bin, "file that contains the hypervisor code"),
168 INIT_PARAM(openboot_bin, "file that contains the openboot code"),
169 INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"),
167 INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
168 "a"),
170 INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
171 "a"),
169 INIT_PARAM_DFLT(readfile, "file to read startup script from", ""),
170 INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0),
171 INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 34),
172 INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 34),
172 INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 1<<10)
173 INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 1<<10),
174 INIT_PARAM_DFLT(readfile, "file to read startup script from", ""),
175 INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0)
173
174END_INIT_SIM_OBJECT_PARAMS(SparcSystem)
175
176CREATE_SIM_OBJECT(SparcSystem)
177{
178 SparcSystem::Params *p = new SparcSystem::Params;
179 p->name = getInstanceName();
180 p->boot_cpu_frequency = boot_cpu_frequency;
181 p->physmem = physmem;
182 p->mem_mode = mem_mode;
183 p->kernel_path = kernel;
184 p->reset_bin = reset_bin;
185 p->hypervisor_bin = hypervisor_bin;
186 p->openboot_bin = openboot_bin;
187 p->boot_osflags = boot_osflags;
188 p->init_param = init_param;
189 p->readfile = readfile;
190 p->system_type = system_type;
191 p->system_rev = system_rev;
192 return new SparcSystem(p);
193}
194
195REGISTER_SIM_OBJECT("SparcSystem", SparcSystem)
196
197
176
177END_INIT_SIM_OBJECT_PARAMS(SparcSystem)
178
179CREATE_SIM_OBJECT(SparcSystem)
180{
181 SparcSystem::Params *p = new SparcSystem::Params;
182 p->name = getInstanceName();
183 p->boot_cpu_frequency = boot_cpu_frequency;
184 p->physmem = physmem;
185 p->mem_mode = mem_mode;
186 p->kernel_path = kernel;
187 p->reset_bin = reset_bin;
188 p->hypervisor_bin = hypervisor_bin;
189 p->openboot_bin = openboot_bin;
190 p->boot_osflags = boot_osflags;
191 p->init_param = init_param;
192 p->readfile = readfile;
193 p->system_type = system_type;
194 p->system_rev = system_rev;
195 return new SparcSystem(p);
196}
197
198REGISTER_SIM_OBJECT("SparcSystem", SparcSystem)
199
200