1/*
2 * Copyright (c) 2010-2012 ARM Limited
2 * Copyright (c) 2010-2013 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated

--- 47 unchanged lines hidden (view full) ---

58#include "sim/stat_control.hh"
59
60using namespace ArmISA;
61using namespace Linux;
62
63LinuxArmSystem::LinuxArmSystem(Params *p)
64 : ArmSystem(p),
65 enableContextSwitchStatsDump(p->enable_context_switch_stats_dump),
66 kernelPanicEvent(NULL), kernelOopsEvent(NULL)
66 kernelPanicEvent(NULL), kernelOopsEvent(NULL),
67 bootReleaseAddr(p->boot_release_addr)
68{
69 if (p->panic_on_panic) {
70 kernelPanicEvent = addKernelFuncEventOrPanic<PanicPCEvent>(
71 "panic", "Kernel panic in simulated kernel");
72 } else {
73#ifndef NDEBUG
74 kernelPanicEvent = addKernelFuncEventOrPanic<BreakPCEvent>("panic");
75#endif

--- 18 unchanged lines hidden (view full) ---

94 "__loop_const_udelay", "__const_udelay", 1000, 107374);
95 if(!constUDelaySkipEvent)
96 constUDelaySkipEvent = addKernelFuncEventOrPanic<UDelayEvent>(
97 "__const_udelay", "__const_udelay", 1000, 107374);
98
99 secDataPtrAddr = 0;
100 secDataAddr = 0;
101 penReleaseAddr = 0;
102
103 kernelSymtab->findAddress("__secondary_data", secDataPtrAddr);
104 kernelSymtab->findAddress("secondary_data", secDataAddr);
105 kernelSymtab->findAddress("pen_release", penReleaseAddr);
106 kernelSymtab->findAddress("secondary_holding_pen_release", pen64ReleaseAddr);
107
108 secDataPtrAddr &= ~ULL(0x7F);
109 secDataAddr &= ~ULL(0x7F);
110 penReleaseAddr &= ~ULL(0x7F);
111 pen64ReleaseAddr &= ~ULL(0x7F);
112 bootReleaseAddr = (bootReleaseAddr & ~ULL(0x7F)) + loadAddrOffset;
113
114}
115
116bool
117LinuxArmSystem::adderBootUncacheable(Addr a)
118{
119 Addr block = a & ~ULL(0x7F);
120
121 if (block == secDataPtrAddr || block == secDataAddr ||
115 block == penReleaseAddr)
122 block == penReleaseAddr || pen64ReleaseAddr == block ||
123 block == bootReleaseAddr)
124 return true;
125
126 return false;
127}
128
129void
130LinuxArmSystem::initState()
131{
132 // Moved from the constructor to here since it relies on the
133 // address map being resolved in the interconnect

--- 15 unchanged lines hidden (view full) ---

149 // device trees.
150 bool kernel_has_fdt_support =
151 kernelSymtab->findAddress("unflatten_device_tree", addr);
152 bool dtb_file_specified = params()->dtb_filename != "";
153
154 if (kernel_has_fdt_support && dtb_file_specified) {
155 // Kernel supports flattened device tree and dtb file specified.
156 // Using Device Tree Blob to describe system configuration.
148 inform("Loading DTB file: %s\n", params()->dtb_filename);
157 inform("Loading DTB file: %s at address %#x\n", params()->dtb_filename,
158 params()->atags_addr + loadAddrOffset);
159
160 ObjectFile *dtb_file = createObjectFile(params()->dtb_filename, true);
161 if (!dtb_file) {
162 fatal("couldn't load DTB file: %s\n", params()->dtb_filename);
163 }
164
165 DtbObject *_dtb_file = dynamic_cast<DtbObject*>(dtb_file);
166
167 if (_dtb_file) {
168 if (!_dtb_file->addBootCmdLine(params()->boot_osflags.c_str(),
169 params()->boot_osflags.size())) {
170 warn("couldn't append bootargs to DTB file: %s\n",
171 params()->dtb_filename);
172 }
173 } else {
174 warn("dtb_file cast failed; couldn't append bootargs "
175 "to DTB file: %s\n", params()->dtb_filename);
176 }
177
168 dtb_file->setTextBase(params()->atags_addr);
178 dtb_file->setTextBase(params()->atags_addr + loadAddrOffset);
179 dtb_file->loadSections(physProxy);
180 delete dtb_file;
181 } else {
182 // Using ATAGS
183 // Warn if the kernel supports FDT and we haven't specified one
184 if (kernel_has_fdt_support) {
185 assert(!dtb_file_specified);
186 warn("Kernel supports device tree, but no DTB file specified\n");

--- 33 unchanged lines hidden (view full) ---

220 offset += ac.copyOut(boot_data + offset);
221 offset += am.copyOut(boot_data + offset);
222 offset += ad.copyOut(boot_data + offset);
223 offset += an.copyOut(boot_data + offset);
224
225 DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2);
226 DDUMP(Loader, boot_data, size << 2);
227
218 physProxy.writeBlob(params()->atags_addr, boot_data, size << 2);
228 physProxy.writeBlob(params()->atags_addr + loadAddrOffset, boot_data,
229 size << 2);
230
231 delete[] boot_data;
232 }
233
234 // Kernel boot requirements to set up r0, r1 and r2 in ARMv7
235 for (int i = 0; i < threadContexts.size(); i++) {
236 threadContexts[i]->setIntReg(0, 0);
237 threadContexts[i]->setIntReg(1, params()->machine_type);
226 threadContexts[i]->setIntReg(2, params()->atags_addr);
238 threadContexts[i]->setIntReg(2, params()->atags_addr + loadAddrOffset);
239 }
240}
241
242LinuxArmSystem::~LinuxArmSystem()
243{
244 if (uDelaySkipEvent)
245 delete uDelaySkipEvent;
246 if (constUDelaySkipEvent)

--- 103 unchanged lines hidden ---