diff options
Diffstat (limited to 'src/arch/arm')
-rw-r--r-- | src/arch/arm/linux/system.cc | 69 | ||||
-rw-r--r-- | src/arch/arm/system.cc | 34 |
2 files changed, 52 insertions, 51 deletions
diff --git a/src/arch/arm/linux/system.cc b/src/arch/arm/linux/system.cc index 4e18a265d..64bda4b4d 100644 --- a/src/arch/arm/linux/system.cc +++ b/src/arch/arm/linux/system.cc @@ -58,6 +58,40 @@ using namespace Linux; LinuxArmSystem::LinuxArmSystem(Params *p) : ArmSystem(p) { +#ifndef NDEBUG + kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic"); + if (!kernelPanicEvent) + panic("could not find kernel symbol \'panic\'"); +#endif + + // With ARM udelay() is #defined to __udelay + Addr addr = 0; + if (kernelSymtab->findAddress("__udelay", addr)) { + uDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__udelay", + fixFuncEventAddr(addr), 1000, 0); + } else { + panic("couldn't find kernel symbol \'udelay\'"); + } + + // constant arguments to udelay() have some precomputation done ahead of + // time. Constant comes from code. + if (kernelSymtab->findAddress("__const_udelay", addr)) { + constUDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__const_udelay", + fixFuncEventAddr(addr), 1000, 107374); + } else { + panic("couldn't find kernel symbol \'udelay\'"); + } + + secDataPtrAddr = 0; + secDataAddr = 0; + penReleaseAddr = 0; + kernelSymtab->findAddress("__secondary_data", secDataPtrAddr); + kernelSymtab->findAddress("secondary_data", secDataAddr); + kernelSymtab->findAddress("pen_release", penReleaseAddr); + + secDataPtrAddr &= ~ULL(0x7F); + secDataAddr &= ~ULL(0x7F); + penReleaseAddr &= ~ULL(0x7F); } bool @@ -116,41 +150,6 @@ LinuxArmSystem::initState() physProxy.writeBlob(params()->atags_addr, boot_data, size << 2); -#ifndef NDEBUG - kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic"); - if (!kernelPanicEvent) - panic("could not find kernel symbol \'panic\'"); -#endif - - // With ARM udelay() is #defined to __udelay - Addr addr = 0; - if (kernelSymtab->findAddress("__udelay", addr)) { - uDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__udelay", - fixFuncEventAddr(addr), 1000, 0); - } else { - panic("couldn't find kernel symbol \'udelay\'"); - } - - // constant arguments to udelay() have some precomputation done ahead of - // time. Constant comes from code. - if (kernelSymtab->findAddress("__const_udelay", addr)) { - constUDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__const_udelay", - fixFuncEventAddr(addr), 1000, 107374); - } else { - panic("couldn't find kernel symbol \'udelay\'"); - } - - secDataPtrAddr = 0; - secDataAddr = 0; - penReleaseAddr = 0; - kernelSymtab->findAddress("__secondary_data", secDataPtrAddr); - kernelSymtab->findAddress("secondary_data", secDataAddr); - kernelSymtab->findAddress("pen_release", penReleaseAddr); - - secDataPtrAddr &= ~ULL(0x7F); - secDataAddr &= ~ULL(0x7F); - penReleaseAddr &= ~ULL(0x7F); - for (int i = 0; i < threadContexts.size(); i++) { threadContexts[i]->setIntReg(0, 0); threadContexts[i]->setIntReg(1, params()->machine_type); 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() |