isa_traits.hh revision 2037
1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef __ARCH_ALPHA_ISA_TRAITS_HH__ 30#define __ARCH_ALPHA_ISA_TRAITS_HH__ 31 32namespace LittleEndianGuest {} 33using namespace LittleEndianGuest; 34 35#include "arch/alpha/faults.hh" 36#include "base/misc.hh" 37#include "config/full_system.hh" 38#include "sim/host.hh" 39 40class FastCPU; 41class FullCPU; 42class Checkpoint; 43 44#define TARGET_ALPHA 45 46template <class ISA> class StaticInst; 47template <class ISA> class StaticInstPtr; 48 49namespace EV5 { 50int DTB_ASN_ASN(uint64_t reg); 51int ITB_ASN_ASN(uint64_t reg); 52} 53 54class AlphaISA 55{ 56 public: 57 58 typedef uint32_t MachInst; 59 typedef uint64_t Addr; 60 typedef uint8_t RegIndex; 61 62 enum { 63 MemoryEnd = 0xffffffffffffffffULL, 64 65 NumIntRegs = 32, 66 NumFloatRegs = 32, 67 NumMiscRegs = 32, 68 69 MaxRegsOfAnyType = 32, 70 // Static instruction parameters 71 MaxInstSrcRegs = 3, 72 MaxInstDestRegs = 2, 73 74 // semantically meaningful register indices 75 ZeroReg = 31, // architecturally meaningful 76 // the rest of these depend on the ABI 77 StackPointerReg = 30, 78 GlobalPointerReg = 29, 79 ProcedureValueReg = 27, 80 ReturnAddressReg = 26, 81 ReturnValueReg = 0, 82 FramePointerReg = 15, 83 ArgumentReg0 = 16, 84 ArgumentReg1 = 17, 85 ArgumentReg2 = 18, 86 ArgumentReg3 = 19, 87 ArgumentReg4 = 20, 88 ArgumentReg5 = 21, 89 90 LogVMPageSize = 13, // 8K bytes 91 VMPageSize = (1 << LogVMPageSize), 92 93 BranchPredAddrShiftAmt = 2, // instructions are 4-byte aligned 94 95 WordBytes = 4, 96 HalfwordBytes = 2, 97 ByteBytes = 1, 98 DepNA = 0, 99 }; 100 101 // These enumerate all the registers for dependence tracking. 102 enum DependenceTags { 103 // 0..31 are the integer regs 0..31 104 // 32..63 are the FP regs 0..31, i.e. use (reg + FP_Base_DepTag) 105 FP_Base_DepTag = 32, 106 Ctrl_Base_DepTag = 64, 107 Fpcr_DepTag = 64, // floating point control register 108 Uniq_DepTag = 65, 109 IPR_Base_DepTag = 66 110 }; 111 112 typedef uint64_t IntReg; 113 typedef IntReg IntRegFile[NumIntRegs]; 114 115 // floating point register file entry type 116 typedef union { 117 uint64_t q; 118 double d; 119 } FloatReg; 120 121 typedef union { 122 uint64_t q[NumFloatRegs]; // integer qword view 123 double d[NumFloatRegs]; // double-precision floating point view 124 } FloatRegFile; 125 126 // control register file contents 127 typedef uint64_t MiscReg; 128 typedef struct { 129 uint64_t fpcr; // floating point condition codes 130 uint64_t uniq; // process-unique register 131 bool lock_flag; // lock flag for LL/SC 132 Addr lock_addr; // lock address for LL/SC 133 } MiscRegFile; 134 135static const Addr PageShift = 13; 136static const Addr PageBytes = ULL(1) << PageShift; 137static const Addr PageMask = ~(PageBytes - 1); 138static const Addr PageOffset = PageBytes - 1; 139 140#if FULL_SYSTEM 141 142 typedef uint64_t InternalProcReg; 143 144#include "arch/alpha/isa_fullsys_traits.hh" 145 146#else 147 enum { 148 NumInternalProcRegs = 0 149 }; 150#endif 151 152 enum { 153 TotalNumRegs = 154 NumIntRegs + NumFloatRegs + NumMiscRegs + NumInternalProcRegs 155 }; 156 157 enum { 158 TotalDataRegs = NumIntRegs + NumFloatRegs 159 }; 160 161 typedef union { 162 IntReg intreg; 163 FloatReg fpreg; 164 MiscReg ctrlreg; 165 } AnyReg; 166 167 struct RegFile { 168 IntRegFile intRegFile; // (signed) integer register file 169 FloatRegFile floatRegFile; // floating point register file 170 MiscRegFile miscRegs; // control register file 171 Addr pc; // program counter 172 Addr npc; // next-cycle program counter 173#if FULL_SYSTEM 174 IntReg palregs[NumIntRegs]; // PAL shadow registers 175 InternalProcReg ipr[NumInternalProcRegs]; // internal processor regs 176 int intrflag; // interrupt flag 177 bool pal_shadow; // using pal_shadow registers 178 inline int instAsid() { return EV5::ITB_ASN_ASN(ipr[IPR_ITB_ASN]); } 179 inline int dataAsid() { return EV5::DTB_ASN_ASN(ipr[IPR_DTB_ASN]); } 180#endif // FULL_SYSTEM 181 182 void serialize(std::ostream &os); 183 void unserialize(Checkpoint *cp, const std::string §ion); 184 }; 185 186 static StaticInstPtr<AlphaISA> decodeInst(MachInst); 187 188 // return a no-op instruction... used for instruction fetch faults 189 static const MachInst NoopMachInst; 190 191 enum annotes { 192 ANNOTE_NONE = 0, 193 // An impossible number for instruction annotations 194 ITOUCH_ANNOTE = 0xffffffff, 195 }; 196 197 static inline bool isCallerSaveIntegerRegister(unsigned int reg) { 198 panic("register classification not implemented"); 199 return (reg >= 1 && reg <= 8 || reg >= 22 && reg <= 25 || reg == 27); 200 } 201 202 static inline bool isCalleeSaveIntegerRegister(unsigned int reg) { 203 panic("register classification not implemented"); 204 return (reg >= 9 && reg <= 15); 205 } 206 207 static inline bool isCallerSaveFloatRegister(unsigned int reg) { 208 panic("register classification not implemented"); 209 return false; 210 } 211 212 static inline bool isCalleeSaveFloatRegister(unsigned int reg) { 213 panic("register classification not implemented"); 214 return false; 215 } 216 217 static inline Addr alignAddress(const Addr &addr, 218 unsigned int nbytes) { 219 return (addr & ~(nbytes - 1)); 220 } 221 222 // Instruction address compression hooks 223 static inline Addr realPCToFetchPC(const Addr &addr) { 224 return addr; 225 } 226 227 static inline Addr fetchPCToRealPC(const Addr &addr) { 228 return addr; 229 } 230 231 // the size of "fetched" instructions (not necessarily the size 232 // of real instructions for PISA) 233 static inline size_t fetchInstSize() { 234 return sizeof(MachInst); 235 } 236 237 static inline MachInst makeRegisterCopy(int dest, int src) { 238 panic("makeRegisterCopy not implemented"); 239 return 0; 240 } 241 242 // Machine operations 243 244 static void saveMachineReg(AnyReg &savereg, const RegFile ®_file, 245 int regnum); 246 247 static void restoreMachineReg(RegFile ®s, const AnyReg ®, 248 int regnum); 249 250#if 0 251 static void serializeSpecialRegs(const Serializable::Proxy &proxy, 252 const RegFile ®s); 253 254 static void unserializeSpecialRegs(const IniFile *db, 255 const std::string &category, 256 ConfigNode *node, 257 RegFile ®s); 258#endif 259 260 /** 261 * Function to insure ISA semantics about 0 registers. 262 * @param xc The execution context. 263 */ 264 template <class XC> 265 static void zeroRegisters(XC *xc); 266}; 267 268 269typedef AlphaISA TheISA; 270 271typedef TheISA::MachInst MachInst; 272typedef TheISA::Addr Addr; 273typedef TheISA::RegIndex RegIndex; 274typedef TheISA::IntReg IntReg; 275typedef TheISA::IntRegFile IntRegFile; 276typedef TheISA::FloatReg FloatReg; 277typedef TheISA::FloatRegFile FloatRegFile; 278typedef TheISA::MiscReg MiscReg; 279typedef TheISA::MiscRegFile MiscRegFile; 280typedef TheISA::AnyReg AnyReg; 281typedef TheISA::RegFile RegFile; 282 283const int NumIntRegs = TheISA::NumIntRegs; 284const int NumFloatRegs = TheISA::NumFloatRegs; 285const int NumMiscRegs = TheISA::NumMiscRegs; 286const int TotalNumRegs = TheISA::TotalNumRegs; 287const int VMPageSize = TheISA::VMPageSize; 288const int LogVMPageSize = TheISA::LogVMPageSize; 289const int ZeroReg = TheISA::ZeroReg; 290const int StackPointerReg = TheISA::StackPointerReg; 291const int GlobalPointerReg = TheISA::GlobalPointerReg; 292const int ReturnAddressReg = TheISA::ReturnAddressReg; 293const int ReturnValueReg = TheISA::ReturnValueReg; 294const int ArgumentReg0 = TheISA::ArgumentReg0; 295const int ArgumentReg1 = TheISA::ArgumentReg1; 296const int ArgumentReg2 = TheISA::ArgumentReg2; 297const int BranchPredAddrShiftAmt = TheISA::BranchPredAddrShiftAmt; 298const int MaxAddr = (Addr)-1; 299 300#if !FULL_SYSTEM 301class SyscallReturn { 302 public: 303 template <class T> 304 SyscallReturn(T v, bool s) 305 { 306 retval = (uint64_t)v; 307 success = s; 308 } 309 310 template <class T> 311 SyscallReturn(T v) 312 { 313 success = (v >= 0); 314 retval = (uint64_t)v; 315 } 316 317 ~SyscallReturn() {} 318 319 SyscallReturn& operator=(const SyscallReturn& s) { 320 retval = s.retval; 321 success = s.success; 322 return *this; 323 } 324 325 bool successful() { return success; } 326 uint64_t value() { return retval; } 327 328 329 private: 330 uint64_t retval; 331 bool success; 332}; 333 334#endif 335 336 337#if FULL_SYSTEM 338typedef TheISA::InternalProcReg InternalProcReg; 339const int NumInternalProcRegs = TheISA::NumInternalProcRegs; 340const int NumInterruptLevels = TheISA::NumInterruptLevels; 341 342#include "arch/alpha/ev5.hh" 343#endif 344 345#endif // __ARCH_ALPHA_ISA_TRAITS_HH__ 346