system.cc revision 7733
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/isa_traits.hh" 447585SAli.Saidi@arm.com#include "arch/arm/linux/atag.hh" 457585SAli.Saidi@arm.com#include "arch/arm/linux/system.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" 507585SAli.Saidi@arm.com#include "mem/physical.hh" 517585SAli.Saidi@arm.com 527585SAli.Saidi@arm.comusing namespace ArmISA; 537585SAli.Saidi@arm.com 547585SAli.Saidi@arm.comLinuxArmSystem::LinuxArmSystem(Params *p) 557585SAli.Saidi@arm.com : ArmSystem(p) 567585SAli.Saidi@arm.com{ 577585SAli.Saidi@arm.com // Load symbols at physical address, we might not want 587585SAli.Saidi@arm.com // to do this perminately, for but early bootup work 597585SAli.Saidi@arm.com // it is helpfulp. 607585SAli.Saidi@arm.com kernel->loadGlobalSymbols(kernelSymtab, loadAddrMask); 617585SAli.Saidi@arm.com kernel->loadGlobalSymbols(debugSymbolTable, loadAddrMask); 627585SAli.Saidi@arm.com 637585SAli.Saidi@arm.com // Setup boot data structure 647585SAli.Saidi@arm.com AtagCore *ac = new AtagCore; 657585SAli.Saidi@arm.com ac->flags(1); // read-only 667585SAli.Saidi@arm.com ac->pagesize(8192); 677585SAli.Saidi@arm.com ac->rootdev(0); 687585SAli.Saidi@arm.com 697585SAli.Saidi@arm.com AtagMem *am = new AtagMem; 707585SAli.Saidi@arm.com am->memSize(params()->physmem->size()); 717585SAli.Saidi@arm.com am->memStart(params()->physmem->start()); 727585SAli.Saidi@arm.com 737585SAli.Saidi@arm.com AtagCmdline *ad = new AtagCmdline; 747585SAli.Saidi@arm.com ad->cmdline(params()->boot_osflags); 757585SAli.Saidi@arm.com 767585SAli.Saidi@arm.com DPRINTF(Loader, "boot command line %d bytes: %s\n", ad->size() <<2, params()->boot_osflags.c_str()); 777585SAli.Saidi@arm.com 787585SAli.Saidi@arm.com AtagNone *an = new AtagNone; 797585SAli.Saidi@arm.com 807585SAli.Saidi@arm.com uint32_t size = ac->size() + am->size() + ad->size() + an->size(); 817585SAli.Saidi@arm.com uint32_t offset = 0; 827585SAli.Saidi@arm.com uint8_t *boot_data = new uint8_t[size << 2]; 837585SAli.Saidi@arm.com 847585SAli.Saidi@arm.com offset += ac->copyOut(boot_data + offset); 857585SAli.Saidi@arm.com offset += am->copyOut(boot_data + offset); 867585SAli.Saidi@arm.com offset += ad->copyOut(boot_data + offset); 877585SAli.Saidi@arm.com offset += an->copyOut(boot_data + offset); 887585SAli.Saidi@arm.com 897585SAli.Saidi@arm.com DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2); 907585SAli.Saidi@arm.com DDUMP(Loader, boot_data, size << 2); 917585SAli.Saidi@arm.com 927723SAli.Saidi@ARM.com functionalPort->writeBlob(ParamsList, boot_data, size << 2); 937585SAli.Saidi@arm.com 947585SAli.Saidi@arm.com#ifndef NDEBUG 957585SAli.Saidi@arm.com kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic"); 967585SAli.Saidi@arm.com if (!kernelPanicEvent) 977585SAli.Saidi@arm.com panic("could not find kernel symbol \'panic\'"); 987585SAli.Saidi@arm.com#endif 997585SAli.Saidi@arm.com} 1007585SAli.Saidi@arm.com 1017585SAli.Saidi@arm.comvoid 1027733SAli.Saidi@ARM.comLinuxArmSystem::initState() 1037585SAli.Saidi@arm.com{ 1047733SAli.Saidi@ARM.com ArmSystem::initState(); 1057585SAli.Saidi@arm.com ThreadContext *tc = threadContexts[0]; 1067585SAli.Saidi@arm.com 1077585SAli.Saidi@arm.com // Set the initial PC to be at start of the kernel code 1087720Sgblack@eecs.umich.edu tc->pcState(tc->getSystemPtr()->kernelEntry & loadAddrMask); 1097585SAli.Saidi@arm.com 1107585SAli.Saidi@arm.com // Setup the machine type 1117585SAli.Saidi@arm.com tc->setIntReg(0, 0); 1127585SAli.Saidi@arm.com tc->setIntReg(1, params()->machine_type); 1137585SAli.Saidi@arm.com tc->setIntReg(2, ParamsList); 1147585SAli.Saidi@arm.com} 1157585SAli.Saidi@arm.com 1167585SAli.Saidi@arm.comLinuxArmSystem::~LinuxArmSystem() 1177585SAli.Saidi@arm.com{ 1187585SAli.Saidi@arm.com} 1197585SAli.Saidi@arm.com 1207585SAli.Saidi@arm.comLinuxArmSystem * 1217585SAli.Saidi@arm.comLinuxArmSystemParams::create() 1227585SAli.Saidi@arm.com{ 1237585SAli.Saidi@arm.com return new LinuxArmSystem(this); 1247585SAli.Saidi@arm.com} 125