diff options
Diffstat (limited to 'src/arch/arm/system.cc')
-rw-r--r-- | src/arch/arm/system.cc | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/src/arch/arm/system.cc b/src/arch/arm/system.cc index 8b85715cb..7fbabafcb 100644 --- a/src/arch/arm/system.cc +++ b/src/arch/arm/system.cc @@ -55,6 +55,19 @@ using namespace Linux; ArmSystem::ArmSystem(Params *p) : System(p), bootldr(NULL) { + if ((p->boot_loader == "") != (p->boot_loader_mem == NULL)) + fatal("If boot_loader is specifed, memory to load it must be also.\n"); + + if (p->boot_loader != "") { + bootldr = createObjectFile(p->boot_loader); + + if (!bootldr) + fatal("Could not read bootloader: %s\n", p->boot_loader); + + bootldr->loadGlobalSymbols(debugSymbolTable); + + } + debugPrintkEvent = addKernelFuncEvent<DebugPrintkEvent>("dprintk"); } void @@ -68,17 +81,8 @@ ArmSystem::initState() const Params* p = params(); - if ((p->boot_loader == "") != (p->boot_loader_mem == NULL)) - fatal("If boot_loader is specifed, memory to load it must be also.\n"); - - if (p->boot_loader != "") { - bootldr = createObjectFile(p->boot_loader); - - if (!bootldr) - fatal("Could not read bootloader: %s\n", p->boot_loader); - + if (bootldr) { bootldr->loadSections(physProxy); - bootldr->loadGlobalSymbols(debugSymbolTable); uint8_t jump_to_bl[] = { @@ -87,32 +91,30 @@ ArmSystem::initState() physProxy.writeBlob(0x0, jump_to_bl, sizeof(jump_to_bl)); inform("Using bootloader at address %#x\n", bootldr->entryPoint()); - } - if (bootldr) { // Put the address of the boot loader into r7 so we know // where to branch to after the reset fault // All other values needed by the boot loader to know what to do + if (!p->gic_cpu_addr || !p->flags_addr) + fatal("gic_cpu_addr && flags_addr must be set with bootloader\n"); + for (int i = 0; i < threadContexts.size(); i++) { threadContexts[i]->setIntReg(3, kernelEntry & loadAddrMask); threadContexts[i]->setIntReg(4, params()->gic_cpu_addr); threadContexts[i]->setIntReg(5, params()->flags_addr); threadContexts[i]->setIntReg(7, bootldr->entryPoint()); } - if (!p->gic_cpu_addr || !p->flags_addr) - fatal("gic_cpu_addr && flags_addr must be set with bootloader\n"); } else { // Set the initial PC to be at start of the kernel code threadContexts[0]->pcState(kernelEntry & loadAddrMask); } + for (int i = 0; i < threadContexts.size(); i++) { if (p->midr_regval) { threadContexts[i]->setMiscReg(ArmISA::MISCREG_MIDR, p->midr_regval); } } - - debugPrintkEvent = addKernelFuncEvent<DebugPrintkEvent>("dprintk"); } ArmSystem::~ArmSystem() |