diff options
author | Ruslan Bukin <br@bsdpad.com> | 2015-04-29 22:35:23 -0500 |
---|---|---|
committer | Ruslan Bukin <br@bsdpad.com> | 2015-04-29 22:35:23 -0500 |
commit | 81f3211149c051e4f70b0b12eb3709dfc6e0395c (patch) | |
tree | 9b9d276586b948252ec6a39a2748dbca43fe92d3 /src/arch/arm/freebsd/system.cc | |
parent | 52a3bc5e5c3cc694b3f8b29f38b0dd296b91350f (diff) | |
download | gem5-81f3211149c051e4f70b0b12eb3709dfc6e0395c.tar.xz |
arch, base, dev, kern, sym: FreeBSD support
This adds support for FreeBSD/aarch64 FS and SE mode (basic set of syscalls only)
Committed by: Nilay Vaish <nilay@cs.wisc.edu>
Diffstat (limited to 'src/arch/arm/freebsd/system.cc')
-rw-r--r-- | src/arch/arm/freebsd/system.cc | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/src/arch/arm/freebsd/system.cc b/src/arch/arm/freebsd/system.cc new file mode 100644 index 000000000..95e712e7a --- /dev/null +++ b/src/arch/arm/freebsd/system.cc @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> + * All rights reserved. + * + * This software was developed by the University of Cambridge Computer + * Laboratory as part of the CTSRD Project, with support from the UK Higher + * Education Innovation Fund (HEIF). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "arch/arm/freebsd/system.hh" + +#include "arch/arm/isa_traits.hh" +#include "arch/arm/utility.hh" +#include "arch/generic/freebsd/threadinfo.hh" +#include "base/loader/dtb_object.hh" +#include "base/loader/object_file.hh" +#include "base/loader/symtab.hh" +#include "cpu/base.hh" +#include "cpu/pc_event.hh" +#include "cpu/thread_context.hh" +#include "debug/Loader.hh" +#include "kern/freebsd/events.hh" +#include "mem/fs_translating_port_proxy.hh" +#include "mem/physical.hh" +#include "sim/stat_control.hh" + +using namespace ArmISA; +using namespace FreeBSD; + +FreebsdArmSystem::FreebsdArmSystem(Params *p) + : GenericArmSystem(p), dumpStatsPCEventF(nullptr), + enableContextSwitchStatsDump(p->enable_context_switch_stats_dump), + taskFile(nullptr), kernelPanicEvent(nullptr), kernelOopsEvent(nullptr), + bootReleaseAddr(p->boot_release_addr) +{ + if (p->panic_on_panic) { + kernelPanicEvent = addKernelFuncEventOrPanic<PanicPCEvent>( + "panic", "Kernel panic in simulated kernel"); + } else { +#ifndef NDEBUG + kernelPanicEvent = addKernelFuncEventOrPanic<BreakPCEvent>("panic"); +#endif + } + + if (p->panic_on_oops) { + kernelOopsEvent = addKernelFuncEventOrPanic<PanicPCEvent>( + "oops_exit", "Kernel oops in guest"); + } + + uDelaySkipEvent = addKernelFuncEvent<UDelayEvent>( + "DELAY", "DELAY", 1000, 0); +} + +bool +FreebsdArmSystem::adderBootUncacheable(Addr a) +{ + + return false; +} + +void +FreebsdArmSystem::initState() +{ + // Moved from the constructor to here since it relies on the + // address map being resolved in the interconnect + + // Call the initialisation of the super class + GenericArmSystem::initState(); + + // Load symbols at physical address, we might not want + // to do this permanently, for but early bootup work + // it is helpful. + if (params()->early_kernel_symbols) { + kernel->loadGlobalSymbols(kernelSymtab, loadAddrMask); + kernel->loadGlobalSymbols(debugSymbolTable, loadAddrMask); + } + + // Setup boot data structure + Addr addr = 0; + + // Check if the kernel image has a symbol that tells us it supports + // device trees. + bool kernel_has_fdt_support = + kernelSymtab->findAddress("fdt_get_range", addr); + bool dtb_file_specified = params()->dtb_filename != ""; + + if (!dtb_file_specified) + fatal("dtb file is not specified\n"); + + if (!kernel_has_fdt_support) + fatal("kernel must have fdt support\n"); + + // Kernel supports flattened device tree and dtb file specified. + // Using Device Tree Blob to describe system configuration. + inform("Loading DTB file: %s at address %#x\n", params()->dtb_filename, + params()->atags_addr + loadAddrOffset); + + ObjectFile *dtb_file = createObjectFile(params()->dtb_filename, true); + if (!dtb_file) { + fatal("couldn't load DTB file: %s\n", params()->dtb_filename); + } + + DtbObject *_dtb_file = dynamic_cast<DtbObject*>(dtb_file); + + if (_dtb_file) { + if (!_dtb_file->addBootCmdLine(params()->boot_osflags.c_str(), + params()->boot_osflags.size())) { + warn("couldn't append bootargs to DTB file: %s\n", + params()->dtb_filename); + } + } else { + warn("dtb_file cast failed; couldn't append bootargs " + "to DTB file: %s\n", params()->dtb_filename); + } + + Addr ra = _dtb_file->findReleaseAddr(); + if (ra) + bootReleaseAddr = ra & ~ULL(0x7F); + + dtb_file->setTextBase(params()->atags_addr + loadAddrOffset); + dtb_file->loadSections(physProxy); + delete dtb_file; + + // Kernel boot requirements to set up r0, r1 and r2 in ARMv7 + for (int i = 0; i < threadContexts.size(); i++) { + threadContexts[i]->setIntReg(0, 0); + threadContexts[i]->setIntReg(1, params()->machine_type); + threadContexts[i]->setIntReg(2, params()->atags_addr + loadAddrOffset); + } +} + +FreebsdArmSystem::~FreebsdArmSystem() +{ + if (uDelaySkipEvent) + delete uDelaySkipEvent; + if (constUDelaySkipEvent) + delete constUDelaySkipEvent; + + if (dumpStatsPCEventF) + delete dumpStatsPCEventF; +} + +FreebsdArmSystem * +FreebsdArmSystemParams::create() +{ + return new FreebsdArmSystem(this); +} + +void +FreebsdArmSystem::startup() +{ +} |