isa.cc revision 10037
12207SN/A/* 22207SN/A * Copyright (c) 2009 The Regents of The University of Michigan 32207SN/A * All rights reserved. 42207SN/A * 52207SN/A * Redistribution and use in source and binary forms, with or without 62207SN/A * modification, are permitted provided that the following conditions are 72207SN/A * met: redistributions of source code must retain the above copyright 82207SN/A * notice, this list of conditions and the following disclaimer; 92207SN/A * redistributions in binary form must reproduce the above copyright 102207SN/A * notice, this list of conditions and the following disclaimer in the 112207SN/A * documentation and/or other materials provided with the distribution; 122207SN/A * neither the name of the copyright holders nor the names of its 132207SN/A * contributors may be used to endorse or promote products derived from 142207SN/A * this software without specific prior written permission. 152207SN/A * 162207SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172207SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182207SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192207SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202207SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212207SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222207SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232207SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242207SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252207SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262207SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Gabe Black 292665Ssaidi@eecs.umich.edu */ 302207SN/A 312207SN/A#include "arch/sparc/asi.hh" 3211793Sbrandon.potter@amd.com#include "arch/sparc/decoder.hh" 3311793Sbrandon.potter@amd.com#include "arch/sparc/isa.hh" 343589Sgblack@eecs.umich.edu#include "base/bitfield.hh" 354111Sgblack@eecs.umich.edu#include "base/trace.hh" 362474SN/A#include "cpu/base.hh" 376335Sgblack@eecs.umich.edu#include "cpu/thread_context.hh" 383760Sgblack@eecs.umich.edu#include "debug/MiscRegs.hh" 398229Snate@binkert.org#include "debug/Timer.hh" 402454SN/A#include "params/SparcISA.hh" 412454SN/A 422680Sktlim@umich.edunamespace SparcISA 438232Snate@binkert.org{ 442561SN/A 454434Ssaidi@eecs.umich.edustatic PSTATE 462474SN/AbuildPstateMask() 472207SN/A{ 482458SN/A PSTATE mask = 0; 492474SN/A mask.ie = 1; 502458SN/A mask.priv = 1; 515958Sgblack@eecs.umich.edu mask.am = 1; 525958Sgblack@eecs.umich.edu mask.pef = 1; 532207SN/A mask.mm = 3; 545154Sgblack@eecs.umich.edu mask.tle = 1; 555285Sgblack@eecs.umich.edu mask.cle = 1; 565285Sgblack@eecs.umich.edu mask.pid1 = 1; 572474SN/A return mask; 582474SN/A} 592474SN/A 602474SN/Astatic const PSTATE PstateMask = buildPstateMask(); 6110318Sandreas.hansson@arm.com 622474SN/AISA::ISA(Params *p) 632474SN/A : SimObject(p) 642474SN/A{ 653415Sgblack@eecs.umich.edu tickCompare = NULL; 667741Sgblack@eecs.umich.edu sTickCompare = NULL; 673415Sgblack@eecs.umich.edu hSTickCompare = NULL; 683415Sgblack@eecs.umich.edu 692474SN/A clear(); 702474SN/A} 717741Sgblack@eecs.umich.edu 727741Sgblack@eecs.umich.educonst SparcISAParams * 734111Sgblack@eecs.umich.eduISA::params() const 747720Sgblack@eecs.umich.edu{ 757741Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 767741Sgblack@eecs.umich.edu} 777720Sgblack@eecs.umich.edu 785128Sgblack@eecs.umich.eduvoid 797741Sgblack@eecs.umich.eduISA::reloadRegMap() 807720Sgblack@eecs.umich.edu{ 815128Sgblack@eecs.umich.edu installGlobals(gl, CurrentGlobalsOffset); 827741Sgblack@eecs.umich.edu installWindow(cwp, CurrentWindowOffset); 835128Sgblack@eecs.umich.edu // Microcode registers. 845128Sgblack@eecs.umich.edu for (int i = 0; i < NumMicroIntRegs; i++) 857741Sgblack@eecs.umich.edu intRegMap[MicroIntOffset + i] = i + TotalGlobals + NWindows * 16; 865128Sgblack@eecs.umich.edu installGlobals(gl, NextGlobalsOffset); 877720Sgblack@eecs.umich.edu installWindow(cwp - 1, NextWindowOffset); 885128Sgblack@eecs.umich.edu installGlobals(gl, PreviousGlobalsOffset); 897741Sgblack@eecs.umich.edu installWindow(cwp + 1, PreviousWindowOffset); 907720Sgblack@eecs.umich.edu} 915128Sgblack@eecs.umich.edu 927741Sgblack@eecs.umich.eduvoid 935128Sgblack@eecs.umich.eduISA::installWindow(int cwp, int offset) 947720Sgblack@eecs.umich.edu{ 955128Sgblack@eecs.umich.edu assert(offset >= 0 && offset + NumWindowedRegs <= NumIntRegs); 967741Sgblack@eecs.umich.edu RegIndex *mapChunk = intRegMap + offset; 977720Sgblack@eecs.umich.edu for (int i = 0; i < NumWindowedRegs; i++) 985128Sgblack@eecs.umich.edu mapChunk[i] = TotalGlobals + 997741Sgblack@eecs.umich.edu ((i - cwp * RegsPerWindow + TotalWindowed) % (TotalWindowed)); 1005128Sgblack@eecs.umich.edu} 1017720Sgblack@eecs.umich.edu 1025128Sgblack@eecs.umich.eduvoid 1037741Sgblack@eecs.umich.eduISA::installGlobals(int gl, int offset) 1045128Sgblack@eecs.umich.edu{ 1057720Sgblack@eecs.umich.edu assert(offset >= 0 && offset + NumGlobalRegs <= NumIntRegs); 1064111Sgblack@eecs.umich.edu RegIndex *mapChunk = intRegMap + offset; 1074111Sgblack@eecs.umich.edu mapChunk[0] = 0; 1084111Sgblack@eecs.umich.edu for (int i = 1; i < NumGlobalRegs; i++) 1094111Sgblack@eecs.umich.edu mapChunk[i] = i + gl * NumGlobalRegs; 1104111Sgblack@eecs.umich.edu} 1114111Sgblack@eecs.umich.edu 1122474SN/Avoid 1137532Ssteve.reinhardt@amd.comISA::clear() 1144111Sgblack@eecs.umich.edu{ 1157532Ssteve.reinhardt@amd.com cwp = 0; 1164111Sgblack@eecs.umich.edu gl = 0; 1175713Shsul@eecs.umich.edu reloadRegMap(); 1187741Sgblack@eecs.umich.edu 1194111Sgblack@eecs.umich.edu // y = 0; 1207741Sgblack@eecs.umich.edu // ccr = 0; 1215713Shsul@eecs.umich.edu asi = 0; 1222646Ssaidi@eecs.umich.edu tick = ULL(1) << 63; 1235713Shsul@eecs.umich.edu fprs = 0; 1244997Sgblack@eecs.umich.edu gsr = 0; 1252561SN/A softint = 0; 1262561SN/A tick_cmpr = 0; 1272561SN/A stick = 0; 1282561SN/A stick_cmpr = 0; 1297741Sgblack@eecs.umich.edu memset(tpc, 0, sizeof(tpc)); 1307741Sgblack@eecs.umich.edu memset(tnpc, 0, sizeof(tnpc)); 1315713Shsul@eecs.umich.edu memset(tstate, 0, sizeof(tstate)); 1327741Sgblack@eecs.umich.edu memset(tt, 0, sizeof(tt)); 1337741Sgblack@eecs.umich.edu tba = 0; 1345713Shsul@eecs.umich.edu pstate = 0; 1357741Sgblack@eecs.umich.edu tl = 0; 1367741Sgblack@eecs.umich.edu pil = 0; 1375713Shsul@eecs.umich.edu // cansave = 0; 1387741Sgblack@eecs.umich.edu // canrestore = 0; 1397741Sgblack@eecs.umich.edu // cleanwin = 0; 1405713Shsul@eecs.umich.edu // otherwin = 0; 1417741Sgblack@eecs.umich.edu // wstate = 0; 1426337Sgblack@eecs.umich.edu // In a T1, bit 11 is apparently always 1 1437741Sgblack@eecs.umich.edu hpstate = 0; 1447741Sgblack@eecs.umich.edu hpstate.id = 1; 1455713Shsul@eecs.umich.edu memset(htstate, 0, sizeof(htstate)); 1467741Sgblack@eecs.umich.edu hintp = 0; 1475713Shsul@eecs.umich.edu htba = 0; 1487741Sgblack@eecs.umich.edu hstick_cmpr = 0; 1499375Sgblack@eecs.umich.edu // This is set this way in Legion for some reason 1504997Sgblack@eecs.umich.edu strandStatusReg = 0x50000; 1514997Sgblack@eecs.umich.edu fsr = 0; 1524997Sgblack@eecs.umich.edu 1534997Sgblack@eecs.umich.edu priContext = 0; 1547741Sgblack@eecs.umich.edu secContext = 0; 1555713Shsul@eecs.umich.edu partId = 0; 1562474SN/A lsuCtrlReg = 0; 1572474SN/A 1585285Sgblack@eecs.umich.edu memset(scratchPad, 0, sizeof(scratchPad)); 1597532Ssteve.reinhardt@amd.com 1602585SN/A cpu_mondo_head = 0; 1617532Ssteve.reinhardt@amd.com cpu_mondo_tail = 0; 1625285Sgblack@eecs.umich.edu dev_mondo_head = 0; 1635713Shsul@eecs.umich.edu dev_mondo_tail = 0; 1647741Sgblack@eecs.umich.edu res_error_head = 0; 1658829Sgblack@eecs.umich.edu res_error_tail = 0; 1668829Sgblack@eecs.umich.edu nres_error_head = 0; 1678829Sgblack@eecs.umich.edu nres_error_tail = 0; 1688829Sgblack@eecs.umich.edu 1695285Sgblack@eecs.umich.edu // If one of these events is active, it's not obvious to me how to get 17010318Sandreas.hansson@arm.com // rid of it cleanly. For now we'll just assert that they're not. 1714111Sgblack@eecs.umich.edu if (tickCompare != NULL && sTickCompare != NULL && hSTickCompare != NULL) 1723415Sgblack@eecs.umich.edu panic("Tick comparison event active when clearing the ISA object.\n"); 1732561SN/A} 1747532Ssteve.reinhardt@amd.com 1752561SN/AMiscReg 1767532Ssteve.reinhardt@amd.comISA::readMiscRegNoEffect(int miscReg) 1775285Sgblack@eecs.umich.edu{ 1785713Shsul@eecs.umich.edu 1797741Sgblack@eecs.umich.edu // The three miscRegs are moved up from the switch statement 1808829Sgblack@eecs.umich.edu // due to more frequent calls. 1818829Sgblack@eecs.umich.edu 1828829Sgblack@eecs.umich.edu if (miscReg == MISCREG_GL) 1835285Sgblack@eecs.umich.edu return gl; 18410318Sandreas.hansson@arm.com if (miscReg == MISCREG_CWP) 1855285Sgblack@eecs.umich.edu return cwp; 1865285Sgblack@eecs.umich.edu if (miscReg == MISCREG_TLB_DATA) { 1875285Sgblack@eecs.umich.edu /* Package up all the data for the tlb: 1885285Sgblack@eecs.umich.edu * 6666555555555544444444443333333333222222222211111111110000000000 1895285Sgblack@eecs.umich.edu * 3210987654321098765432109876543210987654321098765432109876543210 1905285Sgblack@eecs.umich.edu * secContext | priContext | |tl|partid| |||||^hpriv 1915285Sgblack@eecs.umich.edu * ||||^red 1925285Sgblack@eecs.umich.edu * |||^priv 1935771Shsul@eecs.umich.edu * ||^am 1945285Sgblack@eecs.umich.edu * |^lsuim 1955285Sgblack@eecs.umich.edu * ^lsudm 1962474SN/A */ 1973044Sgblack@eecs.umich.edu return (uint64_t)hpstate.hpriv | 1987741Sgblack@eecs.umich.edu (uint64_t)hpstate.red << 1 | 1993044Sgblack@eecs.umich.edu (uint64_t)pstate.priv << 2 | 2003044Sgblack@eecs.umich.edu (uint64_t)pstate.am << 3 | 2013044Sgblack@eecs.umich.edu bits((uint64_t)lsuCtrlReg,3,2) << 4 | 2023044Sgblack@eecs.umich.edu bits((uint64_t)partId,7,0) << 8 | 2037741Sgblack@eecs.umich.edu bits((uint64_t)tl,2,0) << 16 | 2047741Sgblack@eecs.umich.edu (uint64_t)priContext << 32 | 2055286Sgblack@eecs.umich.edu (uint64_t)secContext << 48; 2062561SN/A } 20711389Sbrandon.potter@amd.com 20811389Sbrandon.potter@amd.com switch (miscReg) { 20911389Sbrandon.potter@amd.com // case MISCREG_TLB_DATA: 2102561SN/A // [original contents see above] 2112561SN/A // case MISCREG_Y: 2122561SN/A // return y; 2132585SN/A // case MISCREG_CCR: 2142585SN/A // return ccr; 2152585SN/A case MISCREG_ASI: 2162585SN/A return asi; 2172585SN/A case MISCREG_FPRS: 2182585SN/A return fprs; 2192585SN/A case MISCREG_TICK: 2207741Sgblack@eecs.umich.edu return tick; 2217741Sgblack@eecs.umich.edu case MISCREG_PCR: 2227741Sgblack@eecs.umich.edu panic("PCR not implemented\n"); 2232585SN/A case MISCREG_PIC: 2242585SN/A panic("PIC not implemented\n"); 2252585SN/A case MISCREG_GSR: 2262585SN/A return gsr; 2272585SN/A case MISCREG_SOFTINT: 2282585SN/A return softint; 2292585SN/A case MISCREG_TICK_CMPR: 2302585SN/A return tick_cmpr; 2312585SN/A case MISCREG_STICK: 2322585SN/A return stick; 2332585SN/A case MISCREG_STICK_CMPR: 2347741Sgblack@eecs.umich.edu return stick_cmpr; 2357741Sgblack@eecs.umich.edu 2362976Sgblack@eecs.umich.edu /** Privilged Registers */ 2377741Sgblack@eecs.umich.edu case MISCREG_TPC: 2387741Sgblack@eecs.umich.edu return tpc[tl-1]; 2394793Sgblack@eecs.umich.edu case MISCREG_TNPC: 2407741Sgblack@eecs.umich.edu return tnpc[tl-1]; 24110318Sandreas.hansson@arm.com case MISCREG_TSTATE: 2427741Sgblack@eecs.umich.edu return tstate[tl-1]; 2437741Sgblack@eecs.umich.edu case MISCREG_TT: 2444793Sgblack@eecs.umich.edu return tt[tl-1]; 2452976Sgblack@eecs.umich.edu case MISCREG_PRIVTICK: 2462976Sgblack@eecs.umich.edu panic("Priviliged access to tick registers not implemented\n"); 2474793Sgblack@eecs.umich.edu case MISCREG_TBA: 2482976Sgblack@eecs.umich.edu return tba; 2494793Sgblack@eecs.umich.edu case MISCREG_PSTATE: 2502976Sgblack@eecs.umich.edu return (MiscReg)pstate; 2514793Sgblack@eecs.umich.edu case MISCREG_TL: 25211389Sbrandon.potter@amd.com return tl; 25311389Sbrandon.potter@amd.com case MISCREG_PIL: 25411389Sbrandon.potter@amd.com return pil; 25511389Sbrandon.potter@amd.com // CWP, GL moved 2567741Sgblack@eecs.umich.edu // case MISCREG_CWP: 2574793Sgblack@eecs.umich.edu // return cwp; 2587741Sgblack@eecs.umich.edu // case MISCREG_CANSAVE: 2594793Sgblack@eecs.umich.edu // return cansave; 2607741Sgblack@eecs.umich.edu // case MISCREG_CANRESTORE: 2614793Sgblack@eecs.umich.edu // return canrestore; 2624793Sgblack@eecs.umich.edu // case MISCREG_CLEANWIN: 2634793Sgblack@eecs.umich.edu // return cleanwin; 2644793Sgblack@eecs.umich.edu // case MISCREG_OTHERWIN: 2657741Sgblack@eecs.umich.edu // return otherwin; 2664793Sgblack@eecs.umich.edu // case MISCREG_WSTATE: 2672976Sgblack@eecs.umich.edu // return wstate; 2682585SN/A // case MISCREG_GL: 2697741Sgblack@eecs.umich.edu // return gl; 2702561SN/A 2714164Sgblack@eecs.umich.edu /** Hyper privileged registers */ 2725286Sgblack@eecs.umich.edu case MISCREG_HPSTATE: 2734111Sgblack@eecs.umich.edu return (MiscReg)hpstate; 2747741Sgblack@eecs.umich.edu case MISCREG_HTSTATE: 2757741Sgblack@eecs.umich.edu return htstate[tl-1]; 2764111Sgblack@eecs.umich.edu case MISCREG_HINTP: 2774111Sgblack@eecs.umich.edu return hintp; 2784111Sgblack@eecs.umich.edu case MISCREG_HTBA: 2794111Sgblack@eecs.umich.edu return htba; 2804111Sgblack@eecs.umich.edu case MISCREG_STRAND_STS_REG: 2814111Sgblack@eecs.umich.edu return strandStatusReg; 2824111Sgblack@eecs.umich.edu case MISCREG_HSTICK_CMPR: 2834111Sgblack@eecs.umich.edu return hstick_cmpr; 2844111Sgblack@eecs.umich.edu 2854111Sgblack@eecs.umich.edu /** Floating Point Status Register */ 2864111Sgblack@eecs.umich.edu case MISCREG_FSR: 2877741Sgblack@eecs.umich.edu DPRINTF(MiscRegs, "FSR read as: %#x\n", fsr); 2885286Sgblack@eecs.umich.edu return fsr; 2895286Sgblack@eecs.umich.edu 2905286Sgblack@eecs.umich.edu case MISCREG_MMU_P_CONTEXT: 2915286Sgblack@eecs.umich.edu return priContext; 2925286Sgblack@eecs.umich.edu case MISCREG_MMU_S_CONTEXT: 2935286Sgblack@eecs.umich.edu return secContext; 2944111Sgblack@eecs.umich.edu case MISCREG_MMU_PART_ID: 2957741Sgblack@eecs.umich.edu return partId; 2964111Sgblack@eecs.umich.edu case MISCREG_MMU_LSU_CTRL: 2974111Sgblack@eecs.umich.edu return lsuCtrlReg; 2984111Sgblack@eecs.umich.edu 2994111Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R0: 3004111Sgblack@eecs.umich.edu return scratchPad[0]; 3014111Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R1: 3024111Sgblack@eecs.umich.edu return scratchPad[1]; 3034111Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R2: 3047741Sgblack@eecs.umich.edu return scratchPad[2]; 3055286Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R3: 3064111Sgblack@eecs.umich.edu return scratchPad[3]; 3074111Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R4: 3084111Sgblack@eecs.umich.edu return scratchPad[4]; 3094111Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R5: 3104111Sgblack@eecs.umich.edu return scratchPad[5]; 3114111Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R6: 3127741Sgblack@eecs.umich.edu return scratchPad[6]; 3137741Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R7: 3145286Sgblack@eecs.umich.edu return scratchPad[7]; 3155286Sgblack@eecs.umich.edu case MISCREG_QUEUE_CPU_MONDO_HEAD: 3165286Sgblack@eecs.umich.edu return cpu_mondo_head; 3175286Sgblack@eecs.umich.edu case MISCREG_QUEUE_CPU_MONDO_TAIL: 3185286Sgblack@eecs.umich.edu return cpu_mondo_tail; 3195286Sgblack@eecs.umich.edu case MISCREG_QUEUE_DEV_MONDO_HEAD: 3205286Sgblack@eecs.umich.edu return dev_mondo_head; 3215286Sgblack@eecs.umich.edu case MISCREG_QUEUE_DEV_MONDO_TAIL: 3224111Sgblack@eecs.umich.edu return dev_mondo_tail; 3235286Sgblack@eecs.umich.edu case MISCREG_QUEUE_RES_ERROR_HEAD: 3244111Sgblack@eecs.umich.edu return res_error_head; 3254111Sgblack@eecs.umich.edu case MISCREG_QUEUE_RES_ERROR_TAIL: 3265285Sgblack@eecs.umich.edu return res_error_tail; 3278601Ssteve.reinhardt@amd.com case MISCREG_QUEUE_NRES_ERROR_HEAD: 3284111Sgblack@eecs.umich.edu return nres_error_head; 3294111Sgblack@eecs.umich.edu case MISCREG_QUEUE_NRES_ERROR_TAIL: 3305286Sgblack@eecs.umich.edu return nres_error_tail; 3315286Sgblack@eecs.umich.edu default: 3325286Sgblack@eecs.umich.edu panic("Miscellaneous register %d not implemented\n", miscReg); 3335286Sgblack@eecs.umich.edu } 3345286Sgblack@eecs.umich.edu} 3355286Sgblack@eecs.umich.edu 3365286Sgblack@eecs.umich.eduMiscReg 3375286Sgblack@eecs.umich.eduISA::readMiscReg(int miscReg, ThreadContext * tc) 3385286Sgblack@eecs.umich.edu{ 3395286Sgblack@eecs.umich.edu switch (miscReg) { 3405286Sgblack@eecs.umich.edu // tick and stick are aliased to each other in niagra 3415286Sgblack@eecs.umich.edu // well store the tick data in stick and the interrupt bit in tick 3424111Sgblack@eecs.umich.edu case MISCREG_STICK: 3435941Sgblack@eecs.umich.edu case MISCREG_TICK: 3445941Sgblack@eecs.umich.edu case MISCREG_PRIVTICK: 3455941Sgblack@eecs.umich.edu // I'm not sure why legion ignores the lowest two bits, but we'll go 3465941Sgblack@eecs.umich.edu // with it 3475941Sgblack@eecs.umich.edu // change from curCycle() to instCount() until we're done with legion 3485941Sgblack@eecs.umich.edu DPRINTF(Timer, "Instruction Count when TICK read: %#X stick=%#X\n", 3495941Sgblack@eecs.umich.edu tc->getCpuPtr()->instCount(), stick); 3505941Sgblack@eecs.umich.edu return mbits(tc->getCpuPtr()->instCount() + (int64_t)stick,62,2) | 3515941Sgblack@eecs.umich.edu mbits(tick,63,63); 3525941Sgblack@eecs.umich.edu case MISCREG_FPRS: 3535941Sgblack@eecs.umich.edu // in legion if fp is enabled du and dl are set 3545941Sgblack@eecs.umich.edu return fprs | 0x3; 3554111Sgblack@eecs.umich.edu case MISCREG_PCR: 3565286Sgblack@eecs.umich.edu case MISCREG_PIC: 3575286Sgblack@eecs.umich.edu panic("Performance Instrumentation not impl\n"); 3584111Sgblack@eecs.umich.edu case MISCREG_SOFTINT_CLR: 3594111Sgblack@eecs.umich.edu case MISCREG_SOFTINT_SET: 3604111Sgblack@eecs.umich.edu panic("Can read from softint clr/set\n"); 3615285Sgblack@eecs.umich.edu case MISCREG_SOFTINT: 3625567Snate@binkert.org case MISCREG_TICK_CMPR: 3634111Sgblack@eecs.umich.edu case MISCREG_STICK_CMPR: 3647741Sgblack@eecs.umich.edu case MISCREG_HINTP: 3655286Sgblack@eecs.umich.edu case MISCREG_HTSTATE: 3668852Sandreas.hansson@arm.com case MISCREG_HTBA: 3675286Sgblack@eecs.umich.edu case MISCREG_HVER: 3684111Sgblack@eecs.umich.edu case MISCREG_STRAND_STS_REG: 3697741Sgblack@eecs.umich.edu case MISCREG_HSTICK_CMPR: 3708852Sandreas.hansson@arm.com case MISCREG_QUEUE_CPU_MONDO_HEAD: 3714111Sgblack@eecs.umich.edu case MISCREG_QUEUE_CPU_MONDO_TAIL: 3727741Sgblack@eecs.umich.edu case MISCREG_QUEUE_DEV_MONDO_HEAD: 3737741Sgblack@eecs.umich.edu case MISCREG_QUEUE_DEV_MONDO_TAIL: 3748852Sandreas.hansson@arm.com case MISCREG_QUEUE_RES_ERROR_HEAD: 3754111Sgblack@eecs.umich.edu case MISCREG_QUEUE_RES_ERROR_TAIL: 3768852Sandreas.hansson@arm.com case MISCREG_QUEUE_NRES_ERROR_HEAD: 3774111Sgblack@eecs.umich.edu case MISCREG_QUEUE_NRES_ERROR_TAIL: 3784111Sgblack@eecs.umich.edu case MISCREG_HPSTATE: 3795285Sgblack@eecs.umich.edu return readFSReg(miscReg, tc); 3807741Sgblack@eecs.umich.edu } 3815285Sgblack@eecs.umich.edu return readMiscRegNoEffect(miscReg); 3828852Sandreas.hansson@arm.com} 3835286Sgblack@eecs.umich.edu 3848852Sandreas.hansson@arm.comvoid 3855286Sgblack@eecs.umich.eduISA::setMiscRegNoEffect(int miscReg, MiscReg val) 3864111Sgblack@eecs.umich.edu{ 3874117Sgblack@eecs.umich.edu switch (miscReg) { 3884117Sgblack@eecs.umich.edu// case MISCREG_Y: 3894111Sgblack@eecs.umich.edu// y = val; 3908852Sandreas.hansson@arm.com// break; 3914111Sgblack@eecs.umich.edu// case MISCREG_CCR: 3927741Sgblack@eecs.umich.edu// ccr = val; 3937741Sgblack@eecs.umich.edu// break; 3947741Sgblack@eecs.umich.edu case MISCREG_ASI: 3954111Sgblack@eecs.umich.edu asi = val; 3965285Sgblack@eecs.umich.edu break; 3974111Sgblack@eecs.umich.edu case MISCREG_FPRS: 3985713Shsul@eecs.umich.edu fprs = val; 3997741Sgblack@eecs.umich.edu break; 4007741Sgblack@eecs.umich.edu case MISCREG_TICK: 4017741Sgblack@eecs.umich.edu tick = val; 4027741Sgblack@eecs.umich.edu break; 4035713Shsul@eecs.umich.edu case MISCREG_PCR: 4044111Sgblack@eecs.umich.edu panic("PCR not implemented\n"); 4055231Sgblack@eecs.umich.edu case MISCREG_PIC: 4065231Sgblack@eecs.umich.edu panic("PIC not implemented\n"); 4075713Shsul@eecs.umich.edu case MISCREG_GSR: 4085231Sgblack@eecs.umich.edu gsr = val; 40911389Sbrandon.potter@amd.com break; 4104111Sgblack@eecs.umich.edu case MISCREG_SOFTINT: 4117741Sgblack@eecs.umich.edu softint = val; 4124111Sgblack@eecs.umich.edu break; 4134111Sgblack@eecs.umich.edu case MISCREG_TICK_CMPR: 4144111Sgblack@eecs.umich.edu tick_cmpr = val; 4154111Sgblack@eecs.umich.edu break; 4165128Sgblack@eecs.umich.edu case MISCREG_STICK: 4175285Sgblack@eecs.umich.edu stick = val; 4185285Sgblack@eecs.umich.edu break; 4195285Sgblack@eecs.umich.edu case MISCREG_STICK_CMPR: 4205285Sgblack@eecs.umich.edu stick_cmpr = val; 4215285Sgblack@eecs.umich.edu break; 4225285Sgblack@eecs.umich.edu 4238852Sandreas.hansson@arm.com /** Privilged Registers */ 4245285Sgblack@eecs.umich.edu case MISCREG_TPC: 4258852Sandreas.hansson@arm.com tpc[tl-1] = val; 4265285Sgblack@eecs.umich.edu break; 4275285Sgblack@eecs.umich.edu case MISCREG_TNPC: 4285285Sgblack@eecs.umich.edu tnpc[tl-1] = val; 4295285Sgblack@eecs.umich.edu break; 4305285Sgblack@eecs.umich.edu case MISCREG_TSTATE: 4315285Sgblack@eecs.umich.edu tstate[tl-1] = val; 4325285Sgblack@eecs.umich.edu break; 4335285Sgblack@eecs.umich.edu case MISCREG_TT: 4345285Sgblack@eecs.umich.edu tt[tl-1] = val; 4358852Sandreas.hansson@arm.com break; 4365285Sgblack@eecs.umich.edu case MISCREG_PRIVTICK: 4378852Sandreas.hansson@arm.com panic("Priviliged access to tick regesiters not implemented\n"); 4385285Sgblack@eecs.umich.edu case MISCREG_TBA: 4395285Sgblack@eecs.umich.edu // clear lower 7 bits on writes. 4405285Sgblack@eecs.umich.edu tba = val & ULL(~0x7FFF); 4415128Sgblack@eecs.umich.edu break; 4425128Sgblack@eecs.umich.edu case MISCREG_PSTATE: 4435128Sgblack@eecs.umich.edu pstate = (val & PstateMask); 4445128Sgblack@eecs.umich.edu break; 4455128Sgblack@eecs.umich.edu case MISCREG_TL: 4465128Sgblack@eecs.umich.edu tl = val; 4475128Sgblack@eecs.umich.edu break; 4485128Sgblack@eecs.umich.edu case MISCREG_PIL: 4497741Sgblack@eecs.umich.edu pil = val; 4505128Sgblack@eecs.umich.edu break; 4515128Sgblack@eecs.umich.edu case MISCREG_CWP: 4525128Sgblack@eecs.umich.edu cwp = val; 4535128Sgblack@eecs.umich.edu break; 4547741Sgblack@eecs.umich.edu// case MISCREG_CANSAVE: 4555128Sgblack@eecs.umich.edu// cansave = val; 4565128Sgblack@eecs.umich.edu// break; 4575287Sgblack@eecs.umich.edu// case MISCREG_CANRESTORE: 4585128Sgblack@eecs.umich.edu// canrestore = val; 4598852Sandreas.hansson@arm.com// break; 4605128Sgblack@eecs.umich.edu// case MISCREG_CLEANWIN: 4615128Sgblack@eecs.umich.edu// cleanwin = val; 4625128Sgblack@eecs.umich.edu// break; 4635128Sgblack@eecs.umich.edu// case MISCREG_OTHERWIN: 4645128Sgblack@eecs.umich.edu// otherwin = val; 4655128Sgblack@eecs.umich.edu// break; 4665128Sgblack@eecs.umich.edu// case MISCREG_WSTATE: 4675128Sgblack@eecs.umich.edu// wstate = val; 4685128Sgblack@eecs.umich.edu// break; 4695128Sgblack@eecs.umich.edu case MISCREG_GL: 4705128Sgblack@eecs.umich.edu gl = val; 4715128Sgblack@eecs.umich.edu break; 4725128Sgblack@eecs.umich.edu 4735128Sgblack@eecs.umich.edu /** Hyper privileged registers */ 4745128Sgblack@eecs.umich.edu case MISCREG_HPSTATE: 4757741Sgblack@eecs.umich.edu hpstate = val; 4767741Sgblack@eecs.umich.edu break; 4775128Sgblack@eecs.umich.edu case MISCREG_HTSTATE: 4785128Sgblack@eecs.umich.edu htstate[tl-1] = val; 4795128Sgblack@eecs.umich.edu break; 4805128Sgblack@eecs.umich.edu case MISCREG_HINTP: 4815128Sgblack@eecs.umich.edu hintp = val; 4825128Sgblack@eecs.umich.edu case MISCREG_HTBA: 4835128Sgblack@eecs.umich.edu htba = val; 4847741Sgblack@eecs.umich.edu break; 4855128Sgblack@eecs.umich.edu case MISCREG_STRAND_STS_REG: 4865128Sgblack@eecs.umich.edu strandStatusReg = val; 4875128Sgblack@eecs.umich.edu break; 4885128Sgblack@eecs.umich.edu case MISCREG_HSTICK_CMPR: 4897741Sgblack@eecs.umich.edu hstick_cmpr = val; 4905128Sgblack@eecs.umich.edu break; 4915128Sgblack@eecs.umich.edu 4925128Sgblack@eecs.umich.edu /** Floating Point Status Register */ 4935128Sgblack@eecs.umich.edu case MISCREG_FSR: 4948852Sandreas.hansson@arm.com fsr = val; 4955128Sgblack@eecs.umich.edu DPRINTF(MiscRegs, "FSR written with: %#x\n", fsr); 4965128Sgblack@eecs.umich.edu break; 4975128Sgblack@eecs.umich.edu 4985128Sgblack@eecs.umich.edu case MISCREG_MMU_P_CONTEXT: 4995128Sgblack@eecs.umich.edu priContext = val; 5005128Sgblack@eecs.umich.edu break; 5015128Sgblack@eecs.umich.edu case MISCREG_MMU_S_CONTEXT: 5025128Sgblack@eecs.umich.edu secContext = val; 5035128Sgblack@eecs.umich.edu break; 5045128Sgblack@eecs.umich.edu case MISCREG_MMU_PART_ID: 5055128Sgblack@eecs.umich.edu partId = val; 5065128Sgblack@eecs.umich.edu break; 5075128Sgblack@eecs.umich.edu case MISCREG_MMU_LSU_CTRL: 5085128Sgblack@eecs.umich.edu lsuCtrlReg = val; 5095958Sgblack@eecs.umich.edu break; 5105958Sgblack@eecs.umich.edu 5116701Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R0: 5125958Sgblack@eecs.umich.edu scratchPad[0] = val; 5135958Sgblack@eecs.umich.edu break; 5146701Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R1: 5155958Sgblack@eecs.umich.edu scratchPad[1] = val; 5165958Sgblack@eecs.umich.edu break; 5175958Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R2: 5185958Sgblack@eecs.umich.edu scratchPad[2] = val; 5195958Sgblack@eecs.umich.edu break; 5205958Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R3: 5215958Sgblack@eecs.umich.edu scratchPad[3] = val; 5225958Sgblack@eecs.umich.edu break; 5235958Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R4: 5245958Sgblack@eecs.umich.edu scratchPad[4] = val; 5256701Sgblack@eecs.umich.edu break; 5265958Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R5: 5275958Sgblack@eecs.umich.edu scratchPad[5] = val; 5286701Sgblack@eecs.umich.edu break; 5295958Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R6: 5305958Sgblack@eecs.umich.edu scratchPad[6] = val; 5315958Sgblack@eecs.umich.edu break; 5325958Sgblack@eecs.umich.edu case MISCREG_SCRATCHPAD_R7: 5335958Sgblack@eecs.umich.edu scratchPad[7] = val; 5345958Sgblack@eecs.umich.edu break; 5355958Sgblack@eecs.umich.edu case MISCREG_QUEUE_CPU_MONDO_HEAD: 5365958Sgblack@eecs.umich.edu cpu_mondo_head = val; 5375958Sgblack@eecs.umich.edu break; 5385958Sgblack@eecs.umich.edu case MISCREG_QUEUE_CPU_MONDO_TAIL: 53910223Ssteve.reinhardt@amd.com cpu_mondo_tail = val; 5405958Sgblack@eecs.umich.edu break; 5415958Sgblack@eecs.umich.edu case MISCREG_QUEUE_DEV_MONDO_HEAD: 5425958Sgblack@eecs.umich.edu dev_mondo_head = val; 5435958Sgblack@eecs.umich.edu break; 5448829Sgblack@eecs.umich.edu case MISCREG_QUEUE_DEV_MONDO_TAIL: 54510223Ssteve.reinhardt@amd.com dev_mondo_tail = val; 5465958Sgblack@eecs.umich.edu break; 5475958Sgblack@eecs.umich.edu case MISCREG_QUEUE_RES_ERROR_HEAD: 54810223Ssteve.reinhardt@amd.com res_error_head = val; 54910223Ssteve.reinhardt@amd.com break; 5508829Sgblack@eecs.umich.edu case MISCREG_QUEUE_RES_ERROR_TAIL: 5515958Sgblack@eecs.umich.edu res_error_tail = val; 5525958Sgblack@eecs.umich.edu break; 5535958Sgblack@eecs.umich.edu case MISCREG_QUEUE_NRES_ERROR_HEAD: 5545958Sgblack@eecs.umich.edu nres_error_head = val; 5555958Sgblack@eecs.umich.edu break; 55610223Ssteve.reinhardt@amd.com case MISCREG_QUEUE_NRES_ERROR_TAIL: 55710223Ssteve.reinhardt@amd.com nres_error_tail = val; 5588829Sgblack@eecs.umich.edu break; 5595958Sgblack@eecs.umich.edu default: 5605958Sgblack@eecs.umich.edu panic("Miscellaneous register %d not implemented\n", miscReg); 5615958Sgblack@eecs.umich.edu } 5625958Sgblack@eecs.umich.edu} 563 564void 565ISA::setMiscReg(int miscReg, MiscReg val, ThreadContext * tc) 566{ 567 MiscReg new_val = val; 568 569 switch (miscReg) { 570 case MISCREG_ASI: 571 tc->getDecoderPtr()->setContext(val); 572 break; 573 case MISCREG_STICK: 574 case MISCREG_TICK: 575 // stick and tick are same thing on niagra 576 // use stick for offset and tick for holding intrrupt bit 577 stick = mbits(val,62,0) - tc->getCpuPtr()->instCount(); 578 tick = mbits(val,63,63); 579 DPRINTF(Timer, "Writing TICK=%#X\n", val); 580 break; 581 case MISCREG_FPRS: 582 // Configure the fpu based on the fprs 583 break; 584 case MISCREG_PCR: 585 // Set up performance counting based on pcr value 586 break; 587 case MISCREG_PSTATE: 588 pstate = val & PstateMask; 589 return; 590 case MISCREG_TL: 591 { 592 tl = val; 593 if (hpstate.tlz && tl == 0 && !hpstate.hpriv) 594 tc->getCpuPtr()->postInterrupt(IT_TRAP_LEVEL_ZERO, 0); 595 else 596 tc->getCpuPtr()->clearInterrupt(IT_TRAP_LEVEL_ZERO, 0); 597 return; 598 } 599 case MISCREG_CWP: 600 new_val = val >= NWindows ? NWindows - 1 : val; 601 if (val >= NWindows) 602 new_val = NWindows - 1; 603 604 installWindow(new_val, CurrentWindowOffset); 605 installWindow(new_val - 1, NextWindowOffset); 606 installWindow(new_val + 1, PreviousWindowOffset); 607 break; 608 case MISCREG_GL: 609 installGlobals(val, CurrentGlobalsOffset); 610 installGlobals(val, NextGlobalsOffset); 611 installGlobals(val, PreviousGlobalsOffset); 612 break; 613 case MISCREG_PIL: 614 case MISCREG_SOFTINT: 615 case MISCREG_SOFTINT_SET: 616 case MISCREG_SOFTINT_CLR: 617 case MISCREG_TICK_CMPR: 618 case MISCREG_STICK_CMPR: 619 case MISCREG_HINTP: 620 case MISCREG_HTSTATE: 621 case MISCREG_HTBA: 622 case MISCREG_HVER: 623 case MISCREG_STRAND_STS_REG: 624 case MISCREG_HSTICK_CMPR: 625 case MISCREG_QUEUE_CPU_MONDO_HEAD: 626 case MISCREG_QUEUE_CPU_MONDO_TAIL: 627 case MISCREG_QUEUE_DEV_MONDO_HEAD: 628 case MISCREG_QUEUE_DEV_MONDO_TAIL: 629 case MISCREG_QUEUE_RES_ERROR_HEAD: 630 case MISCREG_QUEUE_RES_ERROR_TAIL: 631 case MISCREG_QUEUE_NRES_ERROR_HEAD: 632 case MISCREG_QUEUE_NRES_ERROR_TAIL: 633 case MISCREG_HPSTATE: 634 setFSReg(miscReg, val, tc); 635 return; 636 } 637 setMiscRegNoEffect(miscReg, new_val); 638} 639 640void 641ISA::serialize(std::ostream &os) 642{ 643 SERIALIZE_SCALAR(asi); 644 SERIALIZE_SCALAR(tick); 645 SERIALIZE_SCALAR(fprs); 646 SERIALIZE_SCALAR(gsr); 647 SERIALIZE_SCALAR(softint); 648 SERIALIZE_SCALAR(tick_cmpr); 649 SERIALIZE_SCALAR(stick); 650 SERIALIZE_SCALAR(stick_cmpr); 651 SERIALIZE_ARRAY(tpc,MaxTL); 652 SERIALIZE_ARRAY(tnpc,MaxTL); 653 SERIALIZE_ARRAY(tstate,MaxTL); 654 SERIALIZE_ARRAY(tt,MaxTL); 655 SERIALIZE_SCALAR(tba); 656 SERIALIZE_SCALAR((uint16_t)pstate); 657 SERIALIZE_SCALAR(tl); 658 SERIALIZE_SCALAR(pil); 659 SERIALIZE_SCALAR(cwp); 660 SERIALIZE_SCALAR(gl); 661 SERIALIZE_SCALAR((uint64_t)hpstate); 662 SERIALIZE_ARRAY(htstate,MaxTL); 663 SERIALIZE_SCALAR(hintp); 664 SERIALIZE_SCALAR(htba); 665 SERIALIZE_SCALAR(hstick_cmpr); 666 SERIALIZE_SCALAR(strandStatusReg); 667 SERIALIZE_SCALAR(fsr); 668 SERIALIZE_SCALAR(priContext); 669 SERIALIZE_SCALAR(secContext); 670 SERIALIZE_SCALAR(partId); 671 SERIALIZE_SCALAR(lsuCtrlReg); 672 SERIALIZE_ARRAY(scratchPad,8); 673 SERIALIZE_SCALAR(cpu_mondo_head); 674 SERIALIZE_SCALAR(cpu_mondo_tail); 675 SERIALIZE_SCALAR(dev_mondo_head); 676 SERIALIZE_SCALAR(dev_mondo_tail); 677 SERIALIZE_SCALAR(res_error_head); 678 SERIALIZE_SCALAR(res_error_tail); 679 SERIALIZE_SCALAR(nres_error_head); 680 SERIALIZE_SCALAR(nres_error_tail); 681 Tick tick_cmp = 0, stick_cmp = 0, hstick_cmp = 0; 682 ThreadContext *tc = NULL; 683 BaseCPU *cpu = NULL; 684 int tc_num = 0; 685 bool tick_intr_sched = true; 686 687 if (tickCompare) 688 tc = tickCompare->getTC(); 689 else if (sTickCompare) 690 tc = sTickCompare->getTC(); 691 else if (hSTickCompare) 692 tc = hSTickCompare->getTC(); 693 else 694 tick_intr_sched = false; 695 696 SERIALIZE_SCALAR(tick_intr_sched); 697 698 if (tc) { 699 cpu = tc->getCpuPtr(); 700 tc_num = cpu->findContext(tc); 701 if (tickCompare && tickCompare->scheduled()) 702 tick_cmp = tickCompare->when(); 703 if (sTickCompare && sTickCompare->scheduled()) 704 stick_cmp = sTickCompare->when(); 705 if (hSTickCompare && hSTickCompare->scheduled()) 706 hstick_cmp = hSTickCompare->when(); 707 708 SERIALIZE_OBJPTR(cpu); 709 SERIALIZE_SCALAR(tc_num); 710 SERIALIZE_SCALAR(tick_cmp); 711 SERIALIZE_SCALAR(stick_cmp); 712 SERIALIZE_SCALAR(hstick_cmp); 713 } 714} 715 716void 717ISA::unserialize(Checkpoint *cp, const std::string §ion) 718{ 719 UNSERIALIZE_SCALAR(asi); 720 UNSERIALIZE_SCALAR(tick); 721 UNSERIALIZE_SCALAR(fprs); 722 UNSERIALIZE_SCALAR(gsr); 723 UNSERIALIZE_SCALAR(softint); 724 UNSERIALIZE_SCALAR(tick_cmpr); 725 UNSERIALIZE_SCALAR(stick); 726 UNSERIALIZE_SCALAR(stick_cmpr); 727 UNSERIALIZE_ARRAY(tpc,MaxTL); 728 UNSERIALIZE_ARRAY(tnpc,MaxTL); 729 UNSERIALIZE_ARRAY(tstate,MaxTL); 730 UNSERIALIZE_ARRAY(tt,MaxTL); 731 UNSERIALIZE_SCALAR(tba); 732 { 733 uint16_t pstate; 734 UNSERIALIZE_SCALAR(pstate); 735 this->pstate = pstate; 736 } 737 UNSERIALIZE_SCALAR(tl); 738 UNSERIALIZE_SCALAR(pil); 739 UNSERIALIZE_SCALAR(cwp); 740 UNSERIALIZE_SCALAR(gl); 741 reloadRegMap(); 742 { 743 uint64_t hpstate; 744 UNSERIALIZE_SCALAR(hpstate); 745 this->hpstate = hpstate; 746 } 747 UNSERIALIZE_ARRAY(htstate,MaxTL); 748 UNSERIALIZE_SCALAR(hintp); 749 UNSERIALIZE_SCALAR(htba); 750 UNSERIALIZE_SCALAR(hstick_cmpr); 751 UNSERIALIZE_SCALAR(strandStatusReg); 752 UNSERIALIZE_SCALAR(fsr); 753 UNSERIALIZE_SCALAR(priContext); 754 UNSERIALIZE_SCALAR(secContext); 755 UNSERIALIZE_SCALAR(partId); 756 UNSERIALIZE_SCALAR(lsuCtrlReg); 757 UNSERIALIZE_ARRAY(scratchPad,8); 758 UNSERIALIZE_SCALAR(cpu_mondo_head); 759 UNSERIALIZE_SCALAR(cpu_mondo_tail); 760 UNSERIALIZE_SCALAR(dev_mondo_head); 761 UNSERIALIZE_SCALAR(dev_mondo_tail); 762 UNSERIALIZE_SCALAR(res_error_head); 763 UNSERIALIZE_SCALAR(res_error_tail); 764 UNSERIALIZE_SCALAR(nres_error_head); 765 UNSERIALIZE_SCALAR(nres_error_tail); 766 767 Tick tick_cmp = 0, stick_cmp = 0, hstick_cmp = 0; 768 ThreadContext *tc = NULL; 769 BaseCPU *cpu = NULL; 770 int tc_num; 771 bool tick_intr_sched; 772 UNSERIALIZE_SCALAR(tick_intr_sched); 773 if (tick_intr_sched) { 774 UNSERIALIZE_OBJPTR(cpu); 775 if (cpu) { 776 UNSERIALIZE_SCALAR(tc_num); 777 UNSERIALIZE_SCALAR(tick_cmp); 778 UNSERIALIZE_SCALAR(stick_cmp); 779 UNSERIALIZE_SCALAR(hstick_cmp); 780 tc = cpu->getContext(tc_num); 781 782 if (tick_cmp) { 783 tickCompare = new TickCompareEvent(this, tc); 784 schedule(tickCompare, tick_cmp); 785 } 786 if (stick_cmp) { 787 sTickCompare = new STickCompareEvent(this, tc); 788 schedule(sTickCompare, stick_cmp); 789 } 790 if (hstick_cmp) { 791 hSTickCompare = new HSTickCompareEvent(this, tc); 792 schedule(hSTickCompare, hstick_cmp); 793 } 794 } 795 } 796 797} 798 799} 800 801SparcISA::ISA * 802SparcISAParams::create() 803{ 804 return new SparcISA::ISA(this); 805} 806