isa_traits.hh revision 2474
110779SCurtis.Dunham@arm.com/* 210779SCurtis.Dunham@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 310779SCurtis.Dunham@arm.com * All rights reserved. 410779SCurtis.Dunham@arm.com * 510779SCurtis.Dunham@arm.com * Redistribution and use in source and binary forms, with or without 610779SCurtis.Dunham@arm.com * modification, are permitted provided that the following conditions are 710779SCurtis.Dunham@arm.com * met: redistributions of source code must retain the above copyright 810779SCurtis.Dunham@arm.com * notice, this list of conditions and the following disclaimer; 910779SCurtis.Dunham@arm.com * redistributions in binary form must reproduce the above copyright 1010779SCurtis.Dunham@arm.com * notice, this list of conditions and the following disclaimer in the 1110779SCurtis.Dunham@arm.com * documentation and/or other materials provided with the distribution; 1210779SCurtis.Dunham@arm.com * neither the name of the copyright holders nor the names of its 1310779SCurtis.Dunham@arm.com * contributors may be used to endorse or promote products derived from 1410779SCurtis.Dunham@arm.com * this software without specific prior written permission. 1510779SCurtis.Dunham@arm.com * 1610779SCurtis.Dunham@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710779SCurtis.Dunham@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810779SCurtis.Dunham@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910779SCurtis.Dunham@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010779SCurtis.Dunham@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110779SCurtis.Dunham@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210779SCurtis.Dunham@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310779SCurtis.Dunham@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410779SCurtis.Dunham@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510779SCurtis.Dunham@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610779SCurtis.Dunham@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710779SCurtis.Dunham@arm.com */ 2810779SCurtis.Dunham@arm.com 2910779SCurtis.Dunham@arm.com#ifndef __ARCH_SPARC_ISA_TRAITS_HH__ 3010779SCurtis.Dunham@arm.com#define __ARCH_SPARC_ISA_TRAITS_HH__ 3110779SCurtis.Dunham@arm.com 3210779SCurtis.Dunham@arm.com#include "base/misc.hh" 3310779SCurtis.Dunham@arm.com#include "config/full_system.hh" 3410779SCurtis.Dunham@arm.com#include "sim/host.hh" 3510779SCurtis.Dunham@arm.com 3610779SCurtis.Dunham@arm.comclass ExecContext; 3710779SCurtis.Dunham@arm.comclass FastCPU; 3810779SCurtis.Dunham@arm.com//class FullCPU; 3910779SCurtis.Dunham@arm.comclass Checkpoint; 4010779SCurtis.Dunham@arm.com 4110779SCurtis.Dunham@arm.comclass StaticInst; 4210779SCurtis.Dunham@arm.comclass StaticInstPtr; 4310779SCurtis.Dunham@arm.com 4410779SCurtis.Dunham@arm.comnamespace BigEndianGuest {} 4510779SCurtis.Dunham@arm.com 4610779SCurtis.Dunham@arm.com#if !FULL_SYSTEM 4710779SCurtis.Dunham@arm.comclass SyscallReturn 4810779SCurtis.Dunham@arm.com{ 4910779SCurtis.Dunham@arm.com public: 5010779SCurtis.Dunham@arm.com template <class T> 5111618SCurtis.Dunham@arm.com SyscallReturn(T v, bool s) 5211618SCurtis.Dunham@arm.com { 5310779SCurtis.Dunham@arm.com retval = (uint64_t)v; 5410779SCurtis.Dunham@arm.com success = s; 5510779SCurtis.Dunham@arm.com } 5610779SCurtis.Dunham@arm.com 5710779SCurtis.Dunham@arm.com template <class T> 5810779SCurtis.Dunham@arm.com SyscallReturn(T v) 5910779SCurtis.Dunham@arm.com { 6010779SCurtis.Dunham@arm.com success = (v >= 0); 6110779SCurtis.Dunham@arm.com retval = (uint64_t)v; 6210779SCurtis.Dunham@arm.com } 6310779SCurtis.Dunham@arm.com 6410779SCurtis.Dunham@arm.com ~SyscallReturn() {} 6510779SCurtis.Dunham@arm.com 6610779SCurtis.Dunham@arm.com SyscallReturn& operator=(const SyscallReturn& s) 6710779SCurtis.Dunham@arm.com { 6810779SCurtis.Dunham@arm.com retval = s.retval; 6910779SCurtis.Dunham@arm.com success = s.success; 7010779SCurtis.Dunham@arm.com return *this; 7110779SCurtis.Dunham@arm.com } 7210779SCurtis.Dunham@arm.com 7310779SCurtis.Dunham@arm.com bool successful() { return success; } 7410779SCurtis.Dunham@arm.com uint64_t value() { return retval; } 7510779SCurtis.Dunham@arm.com 7610779SCurtis.Dunham@arm.com private: 7710779SCurtis.Dunham@arm.com uint64_t retval; 7810779SCurtis.Dunham@arm.com bool success; 7910779SCurtis.Dunham@arm.com}; 8010779SCurtis.Dunham@arm.com 8110779SCurtis.Dunham@arm.com#endif 8210779SCurtis.Dunham@arm.com 8310779SCurtis.Dunham@arm.com 8410779SCurtis.Dunham@arm.comnamespace SparcISA 8510779SCurtis.Dunham@arm.com{ 8610779SCurtis.Dunham@arm.com //This makes sure the big endian versions of certain functions are used. 8710779SCurtis.Dunham@arm.com using namespace BigEndianGuest; 8810779SCurtis.Dunham@arm.com 8910779SCurtis.Dunham@arm.com typedef uint32_t MachInst; 9010779SCurtis.Dunham@arm.com typedef uint64_t ExtMachInst; 9110779SCurtis.Dunham@arm.com 9210779SCurtis.Dunham@arm.com const int NumIntRegs = 32; 9310779SCurtis.Dunham@arm.com const int NumFloatRegs = 64; 9410779SCurtis.Dunham@arm.com const int NumMiscRegs = 32; 9510779SCurtis.Dunham@arm.com 9610779SCurtis.Dunham@arm.com // semantically meaningful register indices 9710779SCurtis.Dunham@arm.com const int ZeroReg = 0; // architecturally meaningful 9810779SCurtis.Dunham@arm.com // the rest of these depend on the ABI 9910779SCurtis.Dunham@arm.com const int StackPointerReg = 14; 10010779SCurtis.Dunham@arm.com const int ReturnAddressReg = 31; // post call, precall is 15 10110779SCurtis.Dunham@arm.com const int ReturnValueReg = 8; // Post return, 24 is pre-return. 10210779SCurtis.Dunham@arm.com const int FramePointerReg = 30; 10310779SCurtis.Dunham@arm.com const int ArgumentReg0 = 8; 10410779SCurtis.Dunham@arm.com const int ArgumentReg1 = 9; 10510779SCurtis.Dunham@arm.com const int ArgumentReg2 = 10; 10610779SCurtis.Dunham@arm.com const int ArgumentReg3 = 11; 10710779SCurtis.Dunham@arm.com const int ArgumentReg4 = 12; 10810779SCurtis.Dunham@arm.com const int ArgumentReg5 = 13; 10910779SCurtis.Dunham@arm.com // Some OS syscall sue a second register (o1) to return a second value 11010779SCurtis.Dunham@arm.com const int SyscallPseudoReturnReg = ArgumentReg1; 11110779SCurtis.Dunham@arm.com 11210779SCurtis.Dunham@arm.com //XXX These numbers are bogus 11310779SCurtis.Dunham@arm.com const int MaxInstSrcRegs = 3; 11410779SCurtis.Dunham@arm.com const int MaxInstDestRegs = 2; 11510779SCurtis.Dunham@arm.com 11610779SCurtis.Dunham@arm.com typedef uint64_t IntReg; 11710779SCurtis.Dunham@arm.com 11810779SCurtis.Dunham@arm.com // control register file contents 119 typedef uint64_t MiscReg; 120 121 typedef double FloatReg; 122 typedef uint64_t FloatRegBits; 123 124 //8K. This value is implmentation specific; and should probably 125 //be somewhere else. 126 const int LogVMPageSize = 13; 127 const int VMPageSize = (1 << LogVMPageSize); 128 129 //Why does both the previous set of constants and this one exist? 130 const int PageShift = 13; 131 const int PageBytes = ULL(1) << PageShift; 132 133 const int BranchPredAddrShiftAmt = 2; 134 135 const int MachineBytes = 8; 136 const int WordBytes = 4; 137 const int HalfwordBytes = 2; 138 const int ByteBytes = 1; 139 140 void serialize(std::ostream & os); 141 142 void unserialize(Checkpoint *cp, const std::string §ion); 143 144 StaticInstPtr decodeInst(MachInst); 145 146 // return a no-op instruction... used for instruction fetch faults 147 extern const MachInst NoopMachInst; 148 149 // Instruction address compression hooks 150 inline Addr realPCToFetchPC(const Addr &addr) 151 { 152 return addr; 153 } 154 155 inline Addr fetchPCToRealPC(const Addr &addr) 156 { 157 return addr; 158 } 159 160 // the size of "fetched" instructions (not necessarily the size 161 // of real instructions for PISA) 162 inline size_t fetchInstSize() 163 { 164 return sizeof(MachInst); 165 } 166 167 /** 168 * Function to insure ISA semantics about 0 registers. 169 * @param xc The execution context. 170 */ 171 template <class XC> 172 void zeroRegisters(XC *xc); 173} 174 175#include "arch/sparc/regfile.hh" 176 177namespace SparcISA 178{ 179 180#if !FULL_SYSTEM 181 static inline void setSyscallReturn(SyscallReturn return_value, 182 RegFile *regs) 183 { 184 // check for error condition. SPARC syscall convention is to 185 // indicate success/failure in reg the carry bit of the ccr 186 // and put the return value itself in the standard return value reg (). 187 if (return_value.successful()) { 188 // no error 189 regs->miscRegs.setReg(MISCREG_CCR_ICC_C, 0); 190 regs->intRegFile[ReturnValueReg] = return_value.value(); 191 } else { 192 // got an error, return details 193 regs->miscRegs.setReg(MISCREG_CCR_ICC_C, 1); 194 regs->intRegFile[ReturnValueReg] = -return_value.value(); 195 } 196 } 197#endif 198}; 199 200#endif // __ARCH_SPARC_ISA_TRAITS_HH__ 201