2 * Copyright (c) 2004-2005 The Regents of The University of Michigan
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.
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.
31 * Modifications for the FreeBSD kernel.
32 * Based on kern/linux/linux_system.cc.
36 #include "base/loader/symtab.hh"
37 #include "cpu/exec_context.hh"
38 #include "kern/freebsd/freebsd_system.hh"
39 #include "mem/functional/memory_control.hh"
40 #include "mem/functional/physical.hh"
41 #include "sim/builder.hh"
42 #include "targetarch/vtophys.hh"
44 #define TIMER_FREQUENCY 1193180
48 FreebsdSystem::FreebsdSystem(Params
*p
)
52 * Any time DELAY is called just skip the function.
53 * Shouldn't we actually emulate the delay?
55 skipDelayEvent
= addKernelFuncEvent
<SkipFuncEvent
>("DELAY");
57 addKernelFuncEvent
<SkipCalibrateClocksEvent
>("calibrate_clocks");
61 FreebsdSystem::~FreebsdSystem()
63 delete skipDelayEvent
;
64 delete skipCalibrateClocks
;
69 FreebsdSystem::doCalibrateClocks(ExecContext
*xc
)
76 ppc_vaddr
= (Addr
)xc
->regs
.intRegFile
[ArgumentReg1
];
77 timer_vaddr
= (Addr
)xc
->regs
.intRegFile
[ArgumentReg2
];
79 ppc_paddr
= vtophys(physmem
, ppc_vaddr
);
80 timer_paddr
= vtophys(physmem
, timer_vaddr
);
82 uint8_t *ppc
= physmem
->dma_addr(ppc_paddr
, sizeof(uint32_t));
83 uint8_t *timer
= physmem
->dma_addr(timer_paddr
, sizeof(uint32_t));
85 *(uint32_t *)ppc
= htog((uint32_t)Clock::Frequency
);
86 *(uint32_t *)timer
= htog((uint32_t)TIMER_FREQUENCY
);
91 FreebsdSystem::SkipCalibrateClocksEvent::process(ExecContext
*xc
)
93 SkipFuncEvent::process(xc
);
94 ((FreebsdSystem
*)xc
->system
)->doCalibrateClocks(xc
);
98 BEGIN_DECLARE_SIM_OBJECT_PARAMS(FreebsdSystem
)
100 Param
<Tick
> boot_cpu_frequency
;
101 SimObjectParam
<MemoryController
*> memctrl
;
102 SimObjectParam
<PhysicalMemory
*> physmem
;
104 Param
<string
> kernel
;
105 Param
<string
> console
;
108 Param
<string
> boot_osflags
;
109 Param
<string
> readfile
;
110 Param
<unsigned int> init_param
;
112 Param
<uint64_t> system_type
;
113 Param
<uint64_t> system_rev
;
116 VectorParam
<string
> binned_fns
;
119 END_DECLARE_SIM_OBJECT_PARAMS(FreebsdSystem
)
121 BEGIN_INIT_SIM_OBJECT_PARAMS(FreebsdSystem
)
123 INIT_PARAM(boot_cpu_frequency
, "Frequency of the boot CPU"),
124 INIT_PARAM(memctrl
, "memory controller"),
125 INIT_PARAM(physmem
, "phsyical memory"),
126 INIT_PARAM(kernel
, "file that contains the kernel code"),
127 INIT_PARAM(console
, "file that contains the console code"),
128 INIT_PARAM(pal
, "file that contains palcode"),
129 INIT_PARAM_DFLT(boot_osflags
, "flags to pass to the kernel during boot",
131 INIT_PARAM_DFLT(readfile
, "file to read startup script from", ""),
132 INIT_PARAM_DFLT(init_param
, "numerical value to pass into simulator", 0),
133 INIT_PARAM_DFLT(system_type
, "Type of system we are emulating", 34),
134 INIT_PARAM_DFLT(system_rev
, "Revision of system we are emulating", 1<<10),
135 INIT_PARAM_DFLT(bin
, "is this system to be binned", false),
136 INIT_PARAM(binned_fns
, "functions to be broken down and binned"),
137 INIT_PARAM_DFLT(bin_int
, "is interrupt code binned seperately?", true)
139 END_INIT_SIM_OBJECT_PARAMS(FreebsdSystem
)
141 CREATE_SIM_OBJECT(FreebsdSystem
)
143 System::Params
*p
= new System::Params
;
144 p
->name
= getInstanceName();
145 p
->boot_cpu_frequency
= boot_cpu_frequency
;
146 p
->memctrl
= memctrl
;
147 p
->physmem
= physmem
;
148 p
->kernel_path
= kernel
;
149 p
->console_path
= console
;
151 p
->boot_osflags
= boot_osflags
;
152 p
->init_param
= init_param
;
153 p
->readfile
= readfile
;
154 p
->system_type
= system_type
;
155 p
->system_rev
= system_rev
;
157 p
->binned_fns
= binned_fns
;
158 p
->bin_int
= bin_int
;
159 return new FreebsdSystem(p
);
162 REGISTER_SIM_OBJECT("FreebsdSystem", FreebsdSystem
)