system.cc revision 8229
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" 508143SAli.Saidi@ARM.com#include "kern/linux/events.hh" 517585SAli.Saidi@arm.com#include "mem/physical.hh" 527585SAli.Saidi@arm.com 537585SAli.Saidi@arm.comusing namespace ArmISA; 548143SAli.Saidi@ARM.comusing namespace Linux; 557585SAli.Saidi@arm.com 567585SAli.Saidi@arm.comLinuxArmSystem::LinuxArmSystem(Params *p) 577585SAli.Saidi@arm.com : ArmSystem(p) 587585SAli.Saidi@arm.com{ 597585SAli.Saidi@arm.com // Load symbols at physical address, we might not want 607585SAli.Saidi@arm.com // to do this perminately, for but early bootup work 617585SAli.Saidi@arm.com // it is helpfulp. 627585SAli.Saidi@arm.com kernel->loadGlobalSymbols(kernelSymtab, loadAddrMask); 637585SAli.Saidi@arm.com kernel->loadGlobalSymbols(debugSymbolTable, loadAddrMask); 647585SAli.Saidi@arm.com 657585SAli.Saidi@arm.com // Setup boot data structure 667585SAli.Saidi@arm.com AtagCore *ac = new AtagCore; 677585SAli.Saidi@arm.com ac->flags(1); // read-only 687585SAli.Saidi@arm.com ac->pagesize(8192); 697585SAli.Saidi@arm.com ac->rootdev(0); 707585SAli.Saidi@arm.com 717585SAli.Saidi@arm.com AtagMem *am = new AtagMem; 727585SAli.Saidi@arm.com am->memSize(params()->physmem->size()); 737585SAli.Saidi@arm.com am->memStart(params()->physmem->start()); 747585SAli.Saidi@arm.com 757585SAli.Saidi@arm.com AtagCmdline *ad = new AtagCmdline; 767585SAli.Saidi@arm.com ad->cmdline(params()->boot_osflags); 777585SAli.Saidi@arm.com 787585SAli.Saidi@arm.com DPRINTF(Loader, "boot command line %d bytes: %s\n", ad->size() <<2, params()->boot_osflags.c_str()); 797585SAli.Saidi@arm.com 807585SAli.Saidi@arm.com AtagNone *an = new AtagNone; 817585SAli.Saidi@arm.com 827585SAli.Saidi@arm.com uint32_t size = ac->size() + am->size() + ad->size() + an->size(); 837585SAli.Saidi@arm.com uint32_t offset = 0; 847585SAli.Saidi@arm.com uint8_t *boot_data = new uint8_t[size << 2]; 857585SAli.Saidi@arm.com 867585SAli.Saidi@arm.com offset += ac->copyOut(boot_data + offset); 877585SAli.Saidi@arm.com offset += am->copyOut(boot_data + offset); 887585SAli.Saidi@arm.com offset += ad->copyOut(boot_data + offset); 897585SAli.Saidi@arm.com offset += an->copyOut(boot_data + offset); 907585SAli.Saidi@arm.com 917585SAli.Saidi@arm.com DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2); 927585SAli.Saidi@arm.com DDUMP(Loader, boot_data, size << 2); 937585SAli.Saidi@arm.com 947723SAli.Saidi@ARM.com functionalPort->writeBlob(ParamsList, boot_data, size << 2); 957585SAli.Saidi@arm.com 967585SAli.Saidi@arm.com#ifndef NDEBUG 977585SAli.Saidi@arm.com kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic"); 987585SAli.Saidi@arm.com if (!kernelPanicEvent) 997585SAli.Saidi@arm.com panic("could not find kernel symbol \'panic\'"); 1007585SAli.Saidi@arm.com#endif 1018143SAli.Saidi@ARM.com 1028143SAli.Saidi@ARM.com // With ARM udelay() is #defined to __udelay 1038143SAli.Saidi@ARM.com Addr addr = 0; 1048143SAli.Saidi@ARM.com if (kernelSymtab->findAddress("__udelay", addr)) { 1058143SAli.Saidi@ARM.com uDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__udelay", 1068143SAli.Saidi@ARM.com fixFuncEventAddr(addr), 1000, 0); 1078143SAli.Saidi@ARM.com } else { 1088143SAli.Saidi@ARM.com panic("couldn't find kernel symbol \'udelay\'"); 1098143SAli.Saidi@ARM.com } 1108143SAli.Saidi@ARM.com 1118143SAli.Saidi@ARM.com // constant arguments to udelay() have some precomputation done ahead of 1128143SAli.Saidi@ARM.com // time. Constant comes from code. 1138143SAli.Saidi@ARM.com if (kernelSymtab->findAddress("__const_udelay", addr)) { 1148143SAli.Saidi@ARM.com constUDelaySkipEvent = new UDelayEvent(&pcEventQueue, "__const_udelay", 1158143SAli.Saidi@ARM.com fixFuncEventAddr(addr), 1000, 107374); 1168143SAli.Saidi@ARM.com } else { 1178143SAli.Saidi@ARM.com panic("couldn't find kernel symbol \'udelay\'"); 1188143SAli.Saidi@ARM.com } 1197585SAli.Saidi@arm.com} 1207585SAli.Saidi@arm.com 1217585SAli.Saidi@arm.comvoid 1227733SAli.Saidi@ARM.comLinuxArmSystem::initState() 1237585SAli.Saidi@arm.com{ 1247733SAli.Saidi@ARM.com ArmSystem::initState(); 1257585SAli.Saidi@arm.com ThreadContext *tc = threadContexts[0]; 1267585SAli.Saidi@arm.com 1277585SAli.Saidi@arm.com // Set the initial PC to be at start of the kernel code 1287720Sgblack@eecs.umich.edu tc->pcState(tc->getSystemPtr()->kernelEntry & loadAddrMask); 1297585SAli.Saidi@arm.com 1307585SAli.Saidi@arm.com // Setup the machine type 1317585SAli.Saidi@arm.com tc->setIntReg(0, 0); 1327585SAli.Saidi@arm.com tc->setIntReg(1, params()->machine_type); 1337585SAli.Saidi@arm.com tc->setIntReg(2, ParamsList); 1347585SAli.Saidi@arm.com} 1357585SAli.Saidi@arm.com 1367585SAli.Saidi@arm.comLinuxArmSystem::~LinuxArmSystem() 1377585SAli.Saidi@arm.com{ 1388143SAli.Saidi@ARM.com if (uDelaySkipEvent) 1398143SAli.Saidi@ARM.com delete uDelaySkipEvent; 1408143SAli.Saidi@ARM.com if (constUDelaySkipEvent) 1418143SAli.Saidi@ARM.com delete constUDelaySkipEvent; 1427585SAli.Saidi@arm.com} 1437585SAli.Saidi@arm.com 1447585SAli.Saidi@arm.comLinuxArmSystem * 1457585SAli.Saidi@arm.comLinuxArmSystemParams::create() 1467585SAli.Saidi@arm.com{ 1477585SAli.Saidi@arm.com return new LinuxArmSystem(this); 1487585SAli.Saidi@arm.com} 149