system.cc revision 8931
17585SAli.Saidi@arm.com/* 27585SAli.Saidi@arm.com * Copyright (c) 2010 ARM Limited 37585SAli.Saidi@arm.com * All rights reserved 47585SAli.Saidi@arm.com * 57585SAli.Saidi@arm.com * The license below extends only to copyright in the software and shall 67585SAli.Saidi@arm.com * not be construed as granting a license to any other intellectual 77585SAli.Saidi@arm.com * property including but not limited to intellectual property relating 87585SAli.Saidi@arm.com * to a hardware implementation of the functionality of the software 97585SAli.Saidi@arm.com * licensed hereunder. You may use the software subject to the license 107585SAli.Saidi@arm.com * terms below provided that you ensure that this notice is replicated 117585SAli.Saidi@arm.com * unmodified and in its entirety in all distributions of the software, 127585SAli.Saidi@arm.com * modified or unmodified, in source code or in binary form. 137585SAli.Saidi@arm.com * 147585SAli.Saidi@arm.com * Copyright (c) 2002-2006 The Regents of The University of Michigan 157585SAli.Saidi@arm.com * All rights reserved. 167585SAli.Saidi@arm.com * 177585SAli.Saidi@arm.com * Redistribution and use in source and binary forms, with or without 187585SAli.Saidi@arm.com * modification, are permitted provided that the following conditions are 197585SAli.Saidi@arm.com * met: redistributions of source code must retain the above copyright 207585SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer; 217585SAli.Saidi@arm.com * redistributions in binary form must reproduce the above copyright 227585SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer in the 237585SAli.Saidi@arm.com * documentation and/or other materials provided with the distribution; 247585SAli.Saidi@arm.com * neither the name of the copyright holders nor the names of its 257585SAli.Saidi@arm.com * contributors may be used to endorse or promote products derived from 267585SAli.Saidi@arm.com * this software without specific prior written permission. 277585SAli.Saidi@arm.com * 287585SAli.Saidi@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 297585SAli.Saidi@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 307585SAli.Saidi@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 317585SAli.Saidi@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 327585SAli.Saidi@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 337585SAli.Saidi@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 347585SAli.Saidi@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 357585SAli.Saidi@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 367585SAli.Saidi@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 377585SAli.Saidi@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 387585SAli.Saidi@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 397585SAli.Saidi@arm.com * 407585SAli.Saidi@arm.com * Authors: Ali Saidi 417585SAli.Saidi@arm.com */ 427585SAli.Saidi@arm.com 437585SAli.Saidi@arm.com#include "arch/arm/linux/atag.hh" 447585SAli.Saidi@arm.com#include "arch/arm/linux/system.hh" 458229Snate@binkert.org#include "arch/arm/isa_traits.hh" 467723SAli.Saidi@ARM.com#include "arch/arm/utility.hh" 477585SAli.Saidi@arm.com#include "base/loader/object_file.hh" 487585SAli.Saidi@arm.com#include "base/loader/symtab.hh" 497723SAli.Saidi@ARM.com#include "cpu/thread_context.hh" 508245Snate@binkert.org#include "debug/Loader.hh" 518143SAli.Saidi@ARM.com#include "kern/linux/events.hh" 528706Sandreas.hansson@arm.com#include "mem/fs_translating_port_proxy.hh" 537585SAli.Saidi@arm.com#include "mem/physical.hh" 547585SAli.Saidi@arm.com 557585SAli.Saidi@arm.comusing namespace ArmISA; 568143SAli.Saidi@ARM.comusing namespace Linux; 577585SAli.Saidi@arm.com 587585SAli.Saidi@arm.comLinuxArmSystem::LinuxArmSystem(Params *p) 597585SAli.Saidi@arm.com : ArmSystem(p) 607585SAli.Saidi@arm.com{ 618885SAli.Saidi@ARM.com#ifndef NDEBUG 628885SAli.Saidi@ARM.com kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic"); 638885SAli.Saidi@ARM.com if (!kernelPanicEvent) 648885SAli.Saidi@ARM.com panic("could not find kernel symbol \'panic\'"); 658885SAli.Saidi@ARM.com#endif 668885SAli.Saidi@ARM.com 678885SAli.Saidi@ARM.com // With ARM udelay() is #defined to __udelay 688885SAli.Saidi@ARM.com Addr addr = 0; 698885SAli.Saidi@ARM.com if (kernelSymtab->findAddress("__udelay", addr)) { 708885SAli.Saidi@ARM.com uDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__udelay", 718885SAli.Saidi@ARM.com fixFuncEventAddr(addr), 1000, 0); 728885SAli.Saidi@ARM.com } else { 738885SAli.Saidi@ARM.com panic("couldn't find kernel symbol \'udelay\'"); 748885SAli.Saidi@ARM.com } 758885SAli.Saidi@ARM.com 768885SAli.Saidi@ARM.com // constant arguments to udelay() have some precomputation done ahead of 778885SAli.Saidi@ARM.com // time. Constant comes from code. 788885SAli.Saidi@ARM.com if (kernelSymtab->findAddress("__const_udelay", addr)) { 798885SAli.Saidi@ARM.com constUDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__const_udelay", 808885SAli.Saidi@ARM.com fixFuncEventAddr(addr), 1000, 107374); 818885SAli.Saidi@ARM.com } else { 828885SAli.Saidi@ARM.com panic("couldn't find kernel symbol \'udelay\'"); 838885SAli.Saidi@ARM.com } 848885SAli.Saidi@ARM.com 858885SAli.Saidi@ARM.com secDataPtrAddr = 0; 868885SAli.Saidi@ARM.com secDataAddr = 0; 878885SAli.Saidi@ARM.com penReleaseAddr = 0; 888885SAli.Saidi@ARM.com kernelSymtab->findAddress("__secondary_data", secDataPtrAddr); 898885SAli.Saidi@ARM.com kernelSymtab->findAddress("secondary_data", secDataAddr); 908885SAli.Saidi@ARM.com kernelSymtab->findAddress("pen_release", penReleaseAddr); 918885SAli.Saidi@ARM.com 928885SAli.Saidi@ARM.com secDataPtrAddr &= ~ULL(0x7F); 938885SAli.Saidi@ARM.com secDataAddr &= ~ULL(0x7F); 948885SAli.Saidi@ARM.com penReleaseAddr &= ~ULL(0x7F); 958706Sandreas.hansson@arm.com} 968706Sandreas.hansson@arm.com 978706Sandreas.hansson@arm.combool 988706Sandreas.hansson@arm.comLinuxArmSystem::adderBootUncacheable(Addr a) 998706Sandreas.hansson@arm.com{ 1008706Sandreas.hansson@arm.com Addr block = a & ~ULL(0x7F); 1018706Sandreas.hansson@arm.com if (block == secDataPtrAddr || block == secDataAddr || 1028706Sandreas.hansson@arm.com block == penReleaseAddr) 1038706Sandreas.hansson@arm.com return true; 1048706Sandreas.hansson@arm.com return false; 1058706Sandreas.hansson@arm.com} 1068706Sandreas.hansson@arm.com 1078706Sandreas.hansson@arm.comvoid 1088706Sandreas.hansson@arm.comLinuxArmSystem::initState() 1098706Sandreas.hansson@arm.com{ 1108706Sandreas.hansson@arm.com // Moved from the constructor to here since it relies on the 1118706Sandreas.hansson@arm.com // address map being resolved in the interconnect 1128706Sandreas.hansson@arm.com 1138706Sandreas.hansson@arm.com // Call the initialisation of the super class 1148706Sandreas.hansson@arm.com ArmSystem::initState(); 1158706Sandreas.hansson@arm.com 1167585SAli.Saidi@arm.com // Load symbols at physical address, we might not want 1177585SAli.Saidi@arm.com // to do this perminately, for but early bootup work 1187585SAli.Saidi@arm.com // it is helpfulp. 1197585SAli.Saidi@arm.com kernel->loadGlobalSymbols(kernelSymtab, loadAddrMask); 1207585SAli.Saidi@arm.com kernel->loadGlobalSymbols(debugSymbolTable, loadAddrMask); 1217585SAli.Saidi@arm.com 1227585SAli.Saidi@arm.com // Setup boot data structure 1237585SAli.Saidi@arm.com AtagCore *ac = new AtagCore; 1247585SAli.Saidi@arm.com ac->flags(1); // read-only 1257585SAli.Saidi@arm.com ac->pagesize(8192); 1267585SAli.Saidi@arm.com ac->rootdev(0); 1277585SAli.Saidi@arm.com 1288931Sandreas.hansson@arm.com AddrRangeList atagRanges = physmem.getConfAddrRanges(); 1298931Sandreas.hansson@arm.com if (atagRanges.size() != 1) { 1308931Sandreas.hansson@arm.com fatal("Expected a single ATAG memory entry but got %d\n", 1318931Sandreas.hansson@arm.com atagRanges.size()); 1328931Sandreas.hansson@arm.com } 1337585SAli.Saidi@arm.com AtagMem *am = new AtagMem; 1348931Sandreas.hansson@arm.com am->memSize(atagRanges.begin()->size()); 1358931Sandreas.hansson@arm.com am->memStart(atagRanges.begin()->start); 1367585SAli.Saidi@arm.com 1377585SAli.Saidi@arm.com AtagCmdline *ad = new AtagCmdline; 1387585SAli.Saidi@arm.com ad->cmdline(params()->boot_osflags); 1397585SAli.Saidi@arm.com 1407585SAli.Saidi@arm.com DPRINTF(Loader, "boot command line %d bytes: %s\n", ad->size() <<2, params()->boot_osflags.c_str()); 1417585SAli.Saidi@arm.com 1427585SAli.Saidi@arm.com AtagNone *an = new AtagNone; 1437585SAli.Saidi@arm.com 1447585SAli.Saidi@arm.com uint32_t size = ac->size() + am->size() + ad->size() + an->size(); 1457585SAli.Saidi@arm.com uint32_t offset = 0; 1467585SAli.Saidi@arm.com uint8_t *boot_data = new uint8_t[size << 2]; 1477585SAli.Saidi@arm.com 1487585SAli.Saidi@arm.com offset += ac->copyOut(boot_data + offset); 1497585SAli.Saidi@arm.com offset += am->copyOut(boot_data + offset); 1507585SAli.Saidi@arm.com offset += ad->copyOut(boot_data + offset); 1517585SAli.Saidi@arm.com offset += an->copyOut(boot_data + offset); 1527585SAli.Saidi@arm.com 1537585SAli.Saidi@arm.com DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2); 1547585SAli.Saidi@arm.com DDUMP(Loader, boot_data, size << 2); 1557585SAli.Saidi@arm.com 1568870SAli.Saidi@ARM.com physProxy.writeBlob(params()->atags_addr, boot_data, size << 2); 1577585SAli.Saidi@arm.com 1588286SAli.Saidi@ARM.com for (int i = 0; i < threadContexts.size(); i++) { 1598286SAli.Saidi@ARM.com threadContexts[i]->setIntReg(0, 0); 1608286SAli.Saidi@ARM.com threadContexts[i]->setIntReg(1, params()->machine_type); 1618870SAli.Saidi@ARM.com threadContexts[i]->setIntReg(2, params()->atags_addr); 1628286SAli.Saidi@ARM.com } 1637585SAli.Saidi@arm.com} 1647585SAli.Saidi@arm.com 1657585SAli.Saidi@arm.comLinuxArmSystem::~LinuxArmSystem() 1667585SAli.Saidi@arm.com{ 1678143SAli.Saidi@ARM.com if (uDelaySkipEvent) 1688143SAli.Saidi@ARM.com delete uDelaySkipEvent; 1698143SAli.Saidi@ARM.com if (constUDelaySkipEvent) 1708143SAli.Saidi@ARM.com delete constUDelaySkipEvent; 1717585SAli.Saidi@arm.com} 1727585SAli.Saidi@arm.com 1737585SAli.Saidi@arm.comLinuxArmSystem * 1747585SAli.Saidi@arm.comLinuxArmSystemParams::create() 1757585SAli.Saidi@arm.com{ 1767585SAli.Saidi@arm.com return new LinuxArmSystem(this); 1777585SAli.Saidi@arm.com} 178