system.hh revision 1039
110428Sandreas.hansson@arm.com/* 210428Sandreas.hansson@arm.com * Copyright (c) 2004 The Regents of The University of Michigan 310428Sandreas.hansson@arm.com * All rights reserved. 410428Sandreas.hansson@arm.com * 510428Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 610428Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 710428Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 810428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 910428Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1010428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1110428Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1210428Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1310428Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1410428Sandreas.hansson@arm.com * this software without specific prior written permission. 1510428Sandreas.hansson@arm.com * 1610428Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710428Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810428Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910428Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010428Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110428Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210428Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310428Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410428Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510428Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610428Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710428Sandreas.hansson@arm.com */ 2810428Sandreas.hansson@arm.com 2910428Sandreas.hansson@arm.com#ifndef __LINUX_SYSTEM_HH__ 3010428Sandreas.hansson@arm.com#define __LINUX_SYSTEM_HH__ 3110428Sandreas.hansson@arm.com 3210428Sandreas.hansson@arm.com#include <vector> 3310428Sandreas.hansson@arm.com 3410428Sandreas.hansson@arm.com#include "sim/system.hh" 3510428Sandreas.hansson@arm.com#include "sim/host.hh" 3610428Sandreas.hansson@arm.com#include "targetarch/isa_traits.hh" 3710428Sandreas.hansson@arm.com 3810428Sandreas.hansson@arm.com#include <map> 3910428Sandreas.hansson@arm.com 4010428Sandreas.hansson@arm.com/** 4110428Sandreas.hansson@arm.com * MAGIC address where the kernel arguments should go. Defined as 4210428Sandreas.hansson@arm.com * PARAM in linux kernel alpha-asm. 4310428Sandreas.hansson@arm.com */ 4410428Sandreas.hansson@arm.comconst Addr PARAM_ADDR = ULL(0xfffffc000030a000); 4510428Sandreas.hansson@arm.com 4610428Sandreas.hansson@arm.comclass ExecContext; 4710428Sandreas.hansson@arm.comclass ElfObject; 4810428Sandreas.hansson@arm.comclass SymbolTable; 4911555Sjungma@eit.uni-kl.declass DebugPrintkEvent; 5010428Sandreas.hansson@arm.comclass BreakPCEvent; 5110428Sandreas.hansson@arm.comclass LinuxSkipDelayLoopEvent; 5210428Sandreas.hansson@arm.comclass SkipFuncEvent; 5310428Sandreas.hansson@arm.comclass FnEvent; 5410428Sandreas.hansson@arm.comclass AlphaArguments; 5510428Sandreas.hansson@arm.com 5610428Sandreas.hansson@arm.com/** 5710428Sandreas.hansson@arm.com * This class contains linux specific system code (Loading, Events, Binning). 5810428Sandreas.hansson@arm.com * It points to objects that are the system binaries to load and patches them 5910428Sandreas.hansson@arm.com * appropriately to work in simulator. 6010428Sandreas.hansson@arm.com */ 6110428Sandreas.hansson@arm.comclass LinuxSystem : public System 6210428Sandreas.hansson@arm.com{ 6310428Sandreas.hansson@arm.com private: 6410428Sandreas.hansson@arm.com /** Object pointer for the kernel code */ 6510428Sandreas.hansson@arm.com ElfObject *kernel; 6610428Sandreas.hansson@arm.com 6710428Sandreas.hansson@arm.com /** Object pointer for the console code */ 6810428Sandreas.hansson@arm.com ElfObject *console; 6910428Sandreas.hansson@arm.com 7010428Sandreas.hansson@arm.com /** kernel Symbol table */ 7110428Sandreas.hansson@arm.com SymbolTable *kernelSymtab; 7210428Sandreas.hansson@arm.com 7310428Sandreas.hansson@arm.com /** console symbol table */ 7410428Sandreas.hansson@arm.com SymbolTable *consoleSymtab; 7510428Sandreas.hansson@arm.com 7610428Sandreas.hansson@arm.com /** Event to halt the simulator if the kernel calls panic() */ 7711555Sjungma@eit.uni-kl.de BreakPCEvent *kernelPanicEvent; 7810428Sandreas.hansson@arm.com 7910428Sandreas.hansson@arm.com /** Event to halt the simulator if the console calls panic() */ 8011555Sjungma@eit.uni-kl.de BreakPCEvent *consolePanicEvent; 8110428Sandreas.hansson@arm.com 8211555Sjungma@eit.uni-kl.de /** Event to skip determine_cpu_caches() because we don't support the 8311555Sjungma@eit.uni-kl.de * IPRs that the code can access to figure out cache sizes 8411555Sjungma@eit.uni-kl.de */ 8511555Sjungma@eit.uni-kl.de SkipFuncEvent *skipCacheProbeEvent; 8611555Sjungma@eit.uni-kl.de 8711555Sjungma@eit.uni-kl.de /** PC based event to skip the ide_delay_50ms() call */ 8811555Sjungma@eit.uni-kl.de SkipFuncEvent *skipIdeDelay50msEvent; 8910428Sandreas.hansson@arm.com 9010428Sandreas.hansson@arm.com /** PC based event to skip the dprink() call and emulate its functionality */ 9110428Sandreas.hansson@arm.com DebugPrintkEvent *debugPrintkEvent; 9210428Sandreas.hansson@arm.com 9310428Sandreas.hansson@arm.com /** Skip calculate_delay_loop() rather than waiting for this to be 9410428Sandreas.hansson@arm.com * calculated 9511555Sjungma@eit.uni-kl.de */ 9610428Sandreas.hansson@arm.com LinuxSkipDelayLoopEvent *skipDelayLoopEvent; 9711555Sjungma@eit.uni-kl.de 9810428Sandreas.hansson@arm.com /** Begining of kernel code */ 9910428Sandreas.hansson@arm.com Addr kernelStart; 10010428Sandreas.hansson@arm.com 10110428Sandreas.hansson@arm.com /** End of kernel code */ 10210428Sandreas.hansson@arm.com Addr kernelEnd; 10311555Sjungma@eit.uni-kl.de 10410428Sandreas.hansson@arm.com /** Entry point in the kernel to start at */ 10511555Sjungma@eit.uni-kl.de Addr kernelEntry; 10610428Sandreas.hansson@arm.com 10710428Sandreas.hansson@arm.com bool bin; 10810428Sandreas.hansson@arm.com std::vector<string> binned_fns; 10910428Sandreas.hansson@arm.com 11010428Sandreas.hansson@arm.com public: 11110428Sandreas.hansson@arm.com std::vector<RemoteGDB *> remoteGDB; 11210428Sandreas.hansson@arm.com std::vector<GDBListener *> gdbListen; 11310428Sandreas.hansson@arm.com 11410428Sandreas.hansson@arm.com LinuxSystem(const std::string _name, 11510428Sandreas.hansson@arm.com const uint64_t _init_param, 11610428Sandreas.hansson@arm.com MemoryController *_memCtrl, 11710428Sandreas.hansson@arm.com PhysicalMemory *_physmem, 11810428Sandreas.hansson@arm.com const std::string &kernel_path, 11910428Sandreas.hansson@arm.com const std::string &console_path, 12010428Sandreas.hansson@arm.com const std::string &palcode, 12110428Sandreas.hansson@arm.com const std::string &boot_osflags, 12210428Sandreas.hansson@arm.com const bool _bin, 12310428Sandreas.hansson@arm.com const std::vector<std::string> &_binned_fns); 12410428Sandreas.hansson@arm.com 12510428Sandreas.hansson@arm.com ~LinuxSystem(); 12610428Sandreas.hansson@arm.com 12710428Sandreas.hansson@arm.com void setDelayLoop(ExecContext *xc); 12810428Sandreas.hansson@arm.com 12910428Sandreas.hansson@arm.com int registerExecContext(ExecContext *xc); 13011555Sjungma@eit.uni-kl.de void replaceExecContext(ExecContext *xc, int xcIndex); 13110428Sandreas.hansson@arm.com 13210428Sandreas.hansson@arm.com /** 13310428Sandreas.hansson@arm.com * Returns the addess the kernel starts at. 13410428Sandreas.hansson@arm.com * @return address the kernel starts at 13511555Sjungma@eit.uni-kl.de */ 13610428Sandreas.hansson@arm.com Addr getKernelStart() const { return kernelStart; } 13710428Sandreas.hansson@arm.com 13810428Sandreas.hansson@arm.com /** 13910428Sandreas.hansson@arm.com * Returns the addess the kernel ends at. 14010428Sandreas.hansson@arm.com * @return address the kernel ends at 14110428Sandreas.hansson@arm.com */ 14210428Sandreas.hansson@arm.com Addr getKernelEnd() const { return kernelEnd; } 14310428Sandreas.hansson@arm.com 14410428Sandreas.hansson@arm.com /** 14510428Sandreas.hansson@arm.com * Returns the addess the entry point to the kernel code. 14610428Sandreas.hansson@arm.com * @return entry point of the kernel code 14710428Sandreas.hansson@arm.com */ 14810428Sandreas.hansson@arm.com Addr getKernelEntry() const { return kernelEntry; } 149 150 151 bool breakpoint(); 152}; 153 154#endif // __LINUX_SYSTEM_HH__ 155