system.cc revision 8706
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{ 618706Sandreas.hansson@arm.com} 628706Sandreas.hansson@arm.com 638706Sandreas.hansson@arm.combool 648706Sandreas.hansson@arm.comLinuxArmSystem::adderBootUncacheable(Addr a) 658706Sandreas.hansson@arm.com{ 668706Sandreas.hansson@arm.com Addr block = a & ~ULL(0x7F); 678706Sandreas.hansson@arm.com if (block == secDataPtrAddr || block == secDataAddr || 688706Sandreas.hansson@arm.com block == penReleaseAddr) 698706Sandreas.hansson@arm.com return true; 708706Sandreas.hansson@arm.com return false; 718706Sandreas.hansson@arm.com} 728706Sandreas.hansson@arm.com 738706Sandreas.hansson@arm.comvoid 748706Sandreas.hansson@arm.comLinuxArmSystem::initState() 758706Sandreas.hansson@arm.com{ 768706Sandreas.hansson@arm.com // Moved from the constructor to here since it relies on the 778706Sandreas.hansson@arm.com // address map being resolved in the interconnect 788706Sandreas.hansson@arm.com 798706Sandreas.hansson@arm.com // Call the initialisation of the super class 808706Sandreas.hansson@arm.com ArmSystem::initState(); 818706Sandreas.hansson@arm.com 827585SAli.Saidi@arm.com // Load symbols at physical address, we might not want 837585SAli.Saidi@arm.com // to do this perminately, for but early bootup work 847585SAli.Saidi@arm.com // it is helpfulp. 857585SAli.Saidi@arm.com kernel->loadGlobalSymbols(kernelSymtab, loadAddrMask); 867585SAli.Saidi@arm.com kernel->loadGlobalSymbols(debugSymbolTable, loadAddrMask); 877585SAli.Saidi@arm.com 887585SAli.Saidi@arm.com // Setup boot data structure 897585SAli.Saidi@arm.com AtagCore *ac = new AtagCore; 907585SAli.Saidi@arm.com ac->flags(1); // read-only 917585SAli.Saidi@arm.com ac->pagesize(8192); 927585SAli.Saidi@arm.com ac->rootdev(0); 937585SAli.Saidi@arm.com 947585SAli.Saidi@arm.com AtagMem *am = new AtagMem; 957585SAli.Saidi@arm.com am->memSize(params()->physmem->size()); 967585SAli.Saidi@arm.com am->memStart(params()->physmem->start()); 977585SAli.Saidi@arm.com 987585SAli.Saidi@arm.com AtagCmdline *ad = new AtagCmdline; 997585SAli.Saidi@arm.com ad->cmdline(params()->boot_osflags); 1007585SAli.Saidi@arm.com 1017585SAli.Saidi@arm.com DPRINTF(Loader, "boot command line %d bytes: %s\n", ad->size() <<2, params()->boot_osflags.c_str()); 1027585SAli.Saidi@arm.com 1037585SAli.Saidi@arm.com AtagNone *an = new AtagNone; 1047585SAli.Saidi@arm.com 1057585SAli.Saidi@arm.com uint32_t size = ac->size() + am->size() + ad->size() + an->size(); 1067585SAli.Saidi@arm.com uint32_t offset = 0; 1077585SAli.Saidi@arm.com uint8_t *boot_data = new uint8_t[size << 2]; 1087585SAli.Saidi@arm.com 1097585SAli.Saidi@arm.com offset += ac->copyOut(boot_data + offset); 1107585SAli.Saidi@arm.com offset += am->copyOut(boot_data + offset); 1117585SAli.Saidi@arm.com offset += ad->copyOut(boot_data + offset); 1127585SAli.Saidi@arm.com offset += an->copyOut(boot_data + offset); 1137585SAli.Saidi@arm.com 1147585SAli.Saidi@arm.com DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2); 1157585SAli.Saidi@arm.com DDUMP(Loader, boot_data, size << 2); 1167585SAli.Saidi@arm.com 1178706Sandreas.hansson@arm.com physProxy->writeBlob(ParamsList, boot_data, size << 2); 1187585SAli.Saidi@arm.com 1197585SAli.Saidi@arm.com#ifndef NDEBUG 1207585SAli.Saidi@arm.com kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic"); 1217585SAli.Saidi@arm.com if (!kernelPanicEvent) 1227585SAli.Saidi@arm.com panic("could not find kernel symbol \'panic\'"); 1237585SAli.Saidi@arm.com#endif 1248143SAli.Saidi@ARM.com 1258143SAli.Saidi@ARM.com // With ARM udelay() is #defined to __udelay 1268143SAli.Saidi@ARM.com Addr addr = 0; 1278143SAli.Saidi@ARM.com if (kernelSymtab->findAddress("__udelay", addr)) { 1288143SAli.Saidi@ARM.com uDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__udelay", 1298143SAli.Saidi@ARM.com fixFuncEventAddr(addr), 1000, 0); 1308143SAli.Saidi@ARM.com } else { 1318143SAli.Saidi@ARM.com panic("couldn't find kernel symbol \'udelay\'"); 1328143SAli.Saidi@ARM.com } 1338143SAli.Saidi@ARM.com 1348143SAli.Saidi@ARM.com // constant arguments to udelay() have some precomputation done ahead of 1358143SAli.Saidi@ARM.com // time. Constant comes from code. 1368143SAli.Saidi@ARM.com if (kernelSymtab->findAddress("__const_udelay", addr)) { 1378143SAli.Saidi@ARM.com constUDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__const_udelay", 1388143SAli.Saidi@ARM.com fixFuncEventAddr(addr), 1000, 107374); 1398143SAli.Saidi@ARM.com } else { 1408143SAli.Saidi@ARM.com panic("couldn't find kernel symbol \'udelay\'"); 1418143SAli.Saidi@ARM.com } 1428527SAli.Saidi@ARM.com 1438527SAli.Saidi@ARM.com secDataPtrAddr = 0; 1448527SAli.Saidi@ARM.com secDataAddr = 0; 1458527SAli.Saidi@ARM.com penReleaseAddr = 0; 1468527SAli.Saidi@ARM.com kernelSymtab->findAddress("__secondary_data", secDataPtrAddr); 1478527SAli.Saidi@ARM.com kernelSymtab->findAddress("secondary_data", secDataAddr); 1488527SAli.Saidi@ARM.com kernelSymtab->findAddress("pen_release", penReleaseAddr); 1498527SAli.Saidi@ARM.com 1508527SAli.Saidi@ARM.com secDataPtrAddr &= ~ULL(0x7F); 1518527SAli.Saidi@ARM.com secDataAddr &= ~ULL(0x7F); 1528527SAli.Saidi@ARM.com penReleaseAddr &= ~ULL(0x7F); 1537585SAli.Saidi@arm.com 1548286SAli.Saidi@ARM.com for (int i = 0; i < threadContexts.size(); i++) { 1558286SAli.Saidi@ARM.com threadContexts[i]->setIntReg(0, 0); 1568286SAli.Saidi@ARM.com threadContexts[i]->setIntReg(1, params()->machine_type); 1578286SAli.Saidi@ARM.com threadContexts[i]->setIntReg(2, ParamsList); 1588286SAli.Saidi@ARM.com } 1597585SAli.Saidi@arm.com} 1607585SAli.Saidi@arm.com 1617585SAli.Saidi@arm.comLinuxArmSystem::~LinuxArmSystem() 1627585SAli.Saidi@arm.com{ 1638143SAli.Saidi@ARM.com if (uDelaySkipEvent) 1648143SAli.Saidi@ARM.com delete uDelaySkipEvent; 1658143SAli.Saidi@ARM.com if (constUDelaySkipEvent) 1668143SAli.Saidi@ARM.com delete constUDelaySkipEvent; 1677585SAli.Saidi@arm.com} 1687585SAli.Saidi@arm.com 1697585SAli.Saidi@arm.comLinuxArmSystem * 1707585SAli.Saidi@arm.comLinuxArmSystemParams::create() 1717585SAli.Saidi@arm.com{ 1727585SAli.Saidi@arm.com return new LinuxArmSystem(this); 1737585SAli.Saidi@arm.com} 174