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 &section)
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