isa_traits.hh revision 3454
18012Ssaidi@eecs.umich.edu/* 28013Sbinkertn@umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 38013Sbinkertn@umich.edu * All rights reserved. 48013Sbinkertn@umich.edu * 58013Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 68013Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 78013Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 88013Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 98013Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 108013Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 118013Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 128013Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 138013Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 148013Sbinkertn@umich.edu * this software without specific prior written permission. 158013Sbinkertn@umich.edu * 168013Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 178013Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 188013Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 198013Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 208013Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 218013Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 228013Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 238013Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 248013Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258013Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 268013Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278013Sbinkertn@umich.edu * 288013Sbinkertn@umich.edu * Authors: Steve Reinhardt 298013Sbinkertn@umich.edu * Gabe Black 308012Ssaidi@eecs.umich.edu */ 318013Sbinkertn@umich.edu 328013Sbinkertn@umich.edu#ifndef __ARCH_ALPHA_ISA_TRAITS_HH__ 338013Sbinkertn@umich.edu#define __ARCH_ALPHA_ISA_TRAITS_HH__ 348013Sbinkertn@umich.edu 358013Sbinkertn@umich.edunamespace LittleEndianGuest {} 368013Sbinkertn@umich.edu 378013Sbinkertn@umich.edu#include "arch/alpha/types.hh" 388013Sbinkertn@umich.edu#include "config/full_system.hh" 398013Sbinkertn@umich.edu#include "sim/host.hh" 408013Sbinkertn@umich.edu 418013Sbinkertn@umich.educlass StaticInstPtr; 428013Sbinkertn@umich.edu 438013Sbinkertn@umich.edunamespace AlphaISA 448013Sbinkertn@umich.edu{ 458013Sbinkertn@umich.edu using namespace LittleEndianGuest; 468013Sbinkertn@umich.edu 478013Sbinkertn@umich.edu // These enumerate all the registers for dependence tracking. 488013Sbinkertn@umich.edu enum DependenceTags { 498013Sbinkertn@umich.edu // 0..31 are the integer regs 0..31 508013Sbinkertn@umich.edu // 32..63 are the FP regs 0..31, i.e. use (reg + FP_Base_DepTag) 518013Sbinkertn@umich.edu FP_Base_DepTag = 40, 528013Sbinkertn@umich.edu Ctrl_Base_DepTag = 72, 538013Sbinkertn@umich.edu Fpcr_DepTag = 72, // floating point control register 548012Ssaidi@eecs.umich.edu Uniq_DepTag = 73, 558013Sbinkertn@umich.edu Lock_Flag_DepTag = 74, 568013Sbinkertn@umich.edu Lock_Addr_DepTag = 75, 578013Sbinkertn@umich.edu Intr_Flag_DepTag = 76, 588013Sbinkertn@umich.edu IPR_Base_DepTag = 77 598012Ssaidi@eecs.umich.edu }; 608012Ssaidi@eecs.umich.edu 618013Sbinkertn@umich.edu StaticInstPtr decodeInst(ExtMachInst); 628013Sbinkertn@umich.edu 638013Sbinkertn@umich.edu // Alpha Does NOT have a delay slot 648013Sbinkertn@umich.edu #define ISA_HAS_DELAY_SLOT 0 658013Sbinkertn@umich.edu 668013Sbinkertn@umich.edu const Addr PageShift = 13; 678013Sbinkertn@umich.edu const Addr PageBytes = ULL(1) << PageShift; 688013Sbinkertn@umich.edu const Addr PageMask = ~(PageBytes - 1); 698013Sbinkertn@umich.edu const Addr PageOffset = PageBytes - 1; 708013Sbinkertn@umich.edu 718008Ssaidi@eecs.umich.edu#if FULL_SYSTEM 728008Ssaidi@eecs.umich.edu 738008Ssaidi@eecs.umich.edu //////////////////////////////////////////////////////////////////////// 748008Ssaidi@eecs.umich.edu // 758008Ssaidi@eecs.umich.edu // Translation stuff 768008Ssaidi@eecs.umich.edu // 778008Ssaidi@eecs.umich.edu 788008Ssaidi@eecs.umich.edu const Addr PteShift = 3; 798008Ssaidi@eecs.umich.edu const Addr NPtePageShift = PageShift - PteShift; 808008Ssaidi@eecs.umich.edu const Addr NPtePage = ULL(1) << NPtePageShift; 818008Ssaidi@eecs.umich.edu const Addr PteMask = NPtePage - 1; 828008Ssaidi@eecs.umich.edu 838008Ssaidi@eecs.umich.edu // User Virtual 848008Ssaidi@eecs.umich.edu const Addr USegBase = ULL(0x0); 858008Ssaidi@eecs.umich.edu const Addr USegEnd = ULL(0x000003ffffffffff); 868008Ssaidi@eecs.umich.edu 878008Ssaidi@eecs.umich.edu // Kernel Direct Mapped 888008Ssaidi@eecs.umich.edu const Addr K0SegBase = ULL(0xfffffc0000000000); 898008Ssaidi@eecs.umich.edu const Addr K0SegEnd = ULL(0xfffffdffffffffff); 908008Ssaidi@eecs.umich.edu 918013Sbinkertn@umich.edu // Kernel Virtual 928008Ssaidi@eecs.umich.edu const Addr K1SegBase = ULL(0xfffffe0000000000); 938008Ssaidi@eecs.umich.edu const Addr K1SegEnd = ULL(0xffffffffffffffff); 948008Ssaidi@eecs.umich.edu 958008Ssaidi@eecs.umich.edu // For loading... XXX This maybe could be USegEnd?? --ali 968008Ssaidi@eecs.umich.edu const Addr LoadAddrMask = ULL(0xffffffffff); 978008Ssaidi@eecs.umich.edu 988008Ssaidi@eecs.umich.edu //////////////////////////////////////////////////////////////////////// 998008Ssaidi@eecs.umich.edu // 1008013Sbinkertn@umich.edu // Interrupt levels 1018008Ssaidi@eecs.umich.edu // 1028008Ssaidi@eecs.umich.edu enum InterruptLevels 1038008Ssaidi@eecs.umich.edu { 1048008Ssaidi@eecs.umich.edu INTLEVEL_SOFTWARE_MIN = 4, 1058013Sbinkertn@umich.edu INTLEVEL_SOFTWARE_MAX = 19, 1068008Ssaidi@eecs.umich.edu 1078008Ssaidi@eecs.umich.edu INTLEVEL_EXTERNAL_MIN = 20, 1088008Ssaidi@eecs.umich.edu INTLEVEL_EXTERNAL_MAX = 34, 1098008Ssaidi@eecs.umich.edu 1108008Ssaidi@eecs.umich.edu INTLEVEL_IRQ0 = 20, 1118008Ssaidi@eecs.umich.edu INTLEVEL_IRQ1 = 21, 1128013Sbinkertn@umich.edu INTINDEX_ETHERNET = 0, 1138008Ssaidi@eecs.umich.edu INTINDEX_SCSI = 1, 1148013Sbinkertn@umich.edu INTLEVEL_IRQ2 = 22, 1158008Ssaidi@eecs.umich.edu INTLEVEL_IRQ3 = 23, 1168008Ssaidi@eecs.umich.edu 1178008Ssaidi@eecs.umich.edu INTLEVEL_SERIAL = 33, 1188013Sbinkertn@umich.edu 1198013Sbinkertn@umich.edu NumInterruptLevels = INTLEVEL_EXTERNAL_MAX 1208008Ssaidi@eecs.umich.edu }; 1218013Sbinkertn@umich.edu 1228008Ssaidi@eecs.umich.edu 1238008Ssaidi@eecs.umich.edu // EV5 modes 1248008Ssaidi@eecs.umich.edu enum mode_type 1258013Sbinkertn@umich.edu { 1268013Sbinkertn@umich.edu mode_kernel = 0, // kernel 1278008Ssaidi@eecs.umich.edu mode_executive = 1, // executive (unused by unix) 1288008Ssaidi@eecs.umich.edu mode_supervisor = 2, // supervisor (unused by unix) 1298008Ssaidi@eecs.umich.edu mode_user = 3, // user mode 1308008Ssaidi@eecs.umich.edu mode_number // number of modes 1318008Ssaidi@eecs.umich.edu }; 1328013Sbinkertn@umich.edu 1338008Ssaidi@eecs.umich.edu#endif 1348008Ssaidi@eecs.umich.edu 1358008Ssaidi@eecs.umich.edu#if FULL_SYSTEM 1368013Sbinkertn@umich.edu //////////////////////////////////////////////////////////////////////// 1378008Ssaidi@eecs.umich.edu // 1388008Ssaidi@eecs.umich.edu // Internal Processor Reigsters 1398008Ssaidi@eecs.umich.edu // 1408008Ssaidi@eecs.umich.edu enum md_ipr_names 1418008Ssaidi@eecs.umich.edu { 1428008Ssaidi@eecs.umich.edu IPR_ISR = 0x100, // interrupt summary register 1438008Ssaidi@eecs.umich.edu IPR_ITB_TAG = 0x101, // ITLB tag register 1448008Ssaidi@eecs.umich.edu IPR_ITB_PTE = 0x102, // ITLB page table entry register 1458008Ssaidi@eecs.umich.edu IPR_ITB_ASN = 0x103, // ITLB address space register 1468008Ssaidi@eecs.umich.edu IPR_ITB_PTE_TEMP = 0x104, // ITLB page table entry temp register 1478013Sbinkertn@umich.edu IPR_ITB_IA = 0x105, // ITLB invalidate all register 1488008Ssaidi@eecs.umich.edu IPR_ITB_IAP = 0x106, // ITLB invalidate all process register 1498008Ssaidi@eecs.umich.edu IPR_ITB_IS = 0x107, // ITLB invalidate select register 1508008Ssaidi@eecs.umich.edu IPR_SIRR = 0x108, // software interrupt request register 1518008Ssaidi@eecs.umich.edu IPR_ASTRR = 0x109, // asynchronous system trap request register 1528008Ssaidi@eecs.umich.edu IPR_ASTER = 0x10a, // asynchronous system trap enable register 1538008Ssaidi@eecs.umich.edu IPR_EXC_ADDR = 0x10b, // exception address register 1548008Ssaidi@eecs.umich.edu IPR_EXC_SUM = 0x10c, // exception summary register 1558008Ssaidi@eecs.umich.edu IPR_EXC_MASK = 0x10d, // exception mask register 1568008Ssaidi@eecs.umich.edu IPR_PAL_BASE = 0x10e, // PAL base address register 1578008Ssaidi@eecs.umich.edu IPR_ICM = 0x10f, // instruction current mode 1588013Sbinkertn@umich.edu IPR_IPLR = 0x110, // interrupt priority level register 1598008Ssaidi@eecs.umich.edu IPR_INTID = 0x111, // interrupt ID register 1608008Ssaidi@eecs.umich.edu IPR_IFAULT_VA_FORM = 0x112, // formatted faulting virtual addr register 1618008Ssaidi@eecs.umich.edu IPR_IVPTBR = 0x113, // virtual page table base register 1628008Ssaidi@eecs.umich.edu IPR_HWINT_CLR = 0x115, // H/W interrupt clear register 1638008Ssaidi@eecs.umich.edu IPR_SL_XMIT = 0x116, // serial line transmit register 1648008Ssaidi@eecs.umich.edu IPR_SL_RCV = 0x117, // serial line receive register 1658008Ssaidi@eecs.umich.edu IPR_ICSR = 0x118, // instruction control and status register 1668008Ssaidi@eecs.umich.edu IPR_IC_FLUSH = 0x119, // instruction cache flush control 1678008Ssaidi@eecs.umich.edu IPR_IC_PERR_STAT = 0x11a, // inst cache parity error status register 1688008Ssaidi@eecs.umich.edu IPR_PMCTR = 0x11c, // performance counter register 1698013Sbinkertn@umich.edu 1708008Ssaidi@eecs.umich.edu // PAL temporary registers... 1718008Ssaidi@eecs.umich.edu // register meanings gleaned from osfpal.s source code 1728008Ssaidi@eecs.umich.edu IPR_PALtemp0 = 0x140, // local scratch 1738008Ssaidi@eecs.umich.edu IPR_PALtemp1 = 0x141, // local scratch 1748008Ssaidi@eecs.umich.edu IPR_PALtemp2 = 0x142, // entUna 1758008Ssaidi@eecs.umich.edu IPR_PALtemp3 = 0x143, // CPU specific impure area pointer 1768008Ssaidi@eecs.umich.edu IPR_PALtemp4 = 0x144, // memory management temp 1778008Ssaidi@eecs.umich.edu IPR_PALtemp5 = 0x145, // memory management temp 1788008Ssaidi@eecs.umich.edu IPR_PALtemp6 = 0x146, // memory management temp 1798008Ssaidi@eecs.umich.edu IPR_PALtemp7 = 0x147, // entIF 1808013Sbinkertn@umich.edu IPR_PALtemp8 = 0x148, // intmask 1818008Ssaidi@eecs.umich.edu IPR_PALtemp9 = 0x149, // entSys 1828008Ssaidi@eecs.umich.edu IPR_PALtemp10 = 0x14a, // ?? 1838008Ssaidi@eecs.umich.edu IPR_PALtemp11 = 0x14b, // entInt 1848008Ssaidi@eecs.umich.edu IPR_PALtemp12 = 0x14c, // entArith 1858013Sbinkertn@umich.edu IPR_PALtemp13 = 0x14d, // reserved for platform specific PAL 1868008Ssaidi@eecs.umich.edu IPR_PALtemp14 = 0x14e, // reserved for platform specific PAL 187 IPR_PALtemp15 = 0x14f, // reserved for platform specific PAL 188 IPR_PALtemp16 = 0x150, // scratch / whami<7:0> / mces<4:0> 189 IPR_PALtemp17 = 0x151, // sysval 190 IPR_PALtemp18 = 0x152, // usp 191 IPR_PALtemp19 = 0x153, // ksp 192 IPR_PALtemp20 = 0x154, // PTBR 193 IPR_PALtemp21 = 0x155, // entMM 194 IPR_PALtemp22 = 0x156, // kgp 195 IPR_PALtemp23 = 0x157, // PCBB 196 197 IPR_DTB_ASN = 0x200, // DTLB address space number register 198 IPR_DTB_CM = 0x201, // DTLB current mode register 199 IPR_DTB_TAG = 0x202, // DTLB tag register 200 IPR_DTB_PTE = 0x203, // DTLB page table entry register 201 IPR_DTB_PTE_TEMP = 0x204, // DTLB page table entry temporary register 202 203 IPR_MM_STAT = 0x205, // data MMU fault status register 204 IPR_VA = 0x206, // fault virtual address register 205 IPR_VA_FORM = 0x207, // formatted virtual address register 206 IPR_MVPTBR = 0x208, // MTU virtual page table base register 207 IPR_DTB_IAP = 0x209, // DTLB invalidate all process register 208 IPR_DTB_IA = 0x20a, // DTLB invalidate all register 209 IPR_DTB_IS = 0x20b, // DTLB invalidate single register 210 IPR_ALT_MODE = 0x20c, // alternate mode register 211 IPR_CC = 0x20d, // cycle counter register 212 IPR_CC_CTL = 0x20e, // cycle counter control register 213 IPR_MCSR = 0x20f, // MTU control register 214 215 IPR_DC_FLUSH = 0x210, 216 IPR_DC_PERR_STAT = 0x212, // Dcache parity error status register 217 IPR_DC_TEST_CTL = 0x213, // Dcache test tag control register 218 IPR_DC_TEST_TAG = 0x214, // Dcache test tag register 219 IPR_DC_TEST_TAG_TEMP = 0x215, // Dcache test tag temporary register 220 IPR_DC_MODE = 0x216, // Dcache mode register 221 IPR_MAF_MODE = 0x217, // miss address file mode register 222 223 NumInternalProcRegs // number of IPR registers 224 }; 225#else 226 const int NumInternalProcRegs = 0; 227#endif 228 229 // Constants Related to the number of registers 230 231 const int NumIntArchRegs = 32; 232 const int NumPALShadowRegs = 8; 233 const int NumFloatArchRegs = 32; 234 // @todo: Figure out what this number really should be. 235 const int NumMiscArchRegs = 32; 236 237 const int NumIntRegs = NumIntArchRegs + NumPALShadowRegs; 238 const int NumFloatRegs = NumFloatArchRegs; 239 const int NumMiscRegs = NumMiscArchRegs; 240 241 const int TotalNumRegs = NumIntRegs + NumFloatRegs + 242 NumMiscRegs + NumInternalProcRegs; 243 244 const int TotalDataRegs = NumIntRegs + NumFloatRegs; 245 246 // Static instruction parameters 247 const int MaxInstSrcRegs = 3; 248 const int MaxInstDestRegs = 2; 249 250 // semantically meaningful register indices 251 const int ZeroReg = 31; // architecturally meaningful 252 // the rest of these depend on the ABI 253 const int StackPointerReg = 30; 254 const int GlobalPointerReg = 29; 255 const int ProcedureValueReg = 27; 256 const int ReturnAddressReg = 26; 257 const int ReturnValueReg = 0; 258 const int FramePointerReg = 15; 259 const int ArgumentReg0 = 16; 260 const int ArgumentReg1 = 17; 261 const int ArgumentReg2 = 18; 262 const int ArgumentReg3 = 19; 263 const int ArgumentReg4 = 20; 264 const int ArgumentReg5 = 21; 265 const int SyscallNumReg = ReturnValueReg; 266 const int SyscallPseudoReturnReg = ArgumentReg4; 267 const int SyscallSuccessReg = 19; 268 269 const int LogVMPageSize = 13; // 8K bytes 270 const int VMPageSize = (1 << LogVMPageSize); 271 272 const int BranchPredAddrShiftAmt = 2; // instructions are 4-byte aligned 273 274 const int MachineBytes = 8; 275 const int WordBytes = 4; 276 const int HalfwordBytes = 2; 277 const int ByteBytes = 1; 278 279 // return a no-op instruction... used for instruction fetch faults 280 // Alpha UNOP (ldq_u r31,0(r0)) 281 const ExtMachInst NoopMachInst = 0x2ffe0000; 282 283 // redirected register map, really only used for the full system case. 284 extern const int reg_redir[NumIntRegs]; 285 286}; 287 288#endif // __ARCH_ALPHA_ISA_TRAITS_HH__ 289