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