2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
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.
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.
32 #include "arch/sparc/asi.hh"
33 #include "arch/sparc/miscregfile.hh"
34 #include "base/bitfield.hh"
35 #include "base/trace.hh"
36 #include "config/full_system.hh"
37 #include "cpu/base.hh"
38 #include "cpu/thread_context.hh"
40 using namespace SparcISA
;
45 //These functions map register indices to names
46 string
SparcISA::getMiscRegName(RegIndex index
)
48 static::string miscRegName
[NumMiscRegs
] =
49 {/*"y", "ccr",*/ "asi", "tick", "fprs", "pcr", "pic",
50 "gsr", "softint_set", "softint_clr", "softint", "tick_cmpr",
51 "stick", "stick_cmpr",
52 "tpc", "tnpc", "tstate", "tt", "privtick", "tba", "pstate", "tl",
53 "pil", "cwp", /*"cansave", "canrestore", "cleanwin", "otherwin",
55 "hpstate", "htstate", "hintp", "htba", "hver", "strand_sts_reg",
57 "fsr", "prictx", "secctx", "partId", "lsuCtrlReg", "itbTsbC0Ps0",
58 "itbTsbC0Ps1", "iTlbC0Cnfg", "itbTsbCXPs0", "itbTsbCXPs1",
59 "iTlbCXCnfg","iTlbSfsr", "iTlbTagAcs", "dtbTsbC0Ps0",
60 "dtbTsbC0Ps1", "dTlbC0Cnfg", "dtbTsbCXPs0", "dtbTsbCXPs1",
61 "dTlbCXCnfg","dTlbSfsr", "dTlbSfar", "dTlbTagAcs",
62 "scratch0", "scratch1", "scratch2", "scratch3", "scratch4",
63 "scratch5", "scratch6", "scratch7", "cpuMondoHead", "cpuMondoTail",
64 "devMondoHead", "devMondoTail", "resErrorHead", "resErrorTail",
65 "nresErrorHead", "nresErrorTail", "TlbData" };
67 return miscRegName
[index
];
72 PSTATE_MASK
= (((1 << 4) - 1) << 1) | (((1 << 4) - 1) << 6) | (1 << 12)
75 void MiscRegFile::clear()
87 memset(tpc
, 0, sizeof(tpc
));
88 memset(tnpc
, 0, sizeof(tnpc
));
89 memset(tstate
, 0, sizeof(tstate
));
90 memset(tt
, 0, sizeof(tt
));
101 //In a T1, bit 11 is apparently always 1
103 memset(htstate
, 0, sizeof(htstate
));
107 //This is set this way in Legion for some reason
108 strandStatusReg
= 0x50000;
135 memset(scratchPad
, 0, sizeof(scratchPad
));
139 hSTickCompare
= NULL
;
143 MiscReg
MiscRegFile::readRegNoEffect(int miscReg
)
146 // The three miscRegs are moved up from the switch statement
147 // due to more frequent calls.
149 if (miscReg
== MISCREG_GL
)
151 if (miscReg
== MISCREG_CWP
)
153 if (miscReg
== MISCREG_TLB_DATA
) {
154 /* Package up all the data for the tlb:
155 * 6666555555555544444444443333333333222222222211111111110000000000
156 * 3210987654321098765432109876543210987654321098765432109876543210
157 * secContext | priContext | |tl|partid| |||||^hpriv
164 return bits((uint64_t)hpstate
,2,2) |
165 bits((uint64_t)hpstate
,5,5) << 1 |
166 bits((uint64_t)pstate
,3,2) << 2 |
167 bits((uint64_t)lsuCtrlReg
,3,2) << 4 |
168 bits((uint64_t)partId
,7,0) << 8 |
169 bits((uint64_t)tl
,2,0) << 16 |
170 (uint64_t)priContext
<< 32 |
171 (uint64_t)secContext
<< 48;
175 //case MISCREG_TLB_DATA:
176 // [original contents see above]
188 panic("PCR not implemented\n");
190 panic("PIC not implemented\n");
193 case MISCREG_SOFTINT
:
195 case MISCREG_TICK_CMPR
:
199 case MISCREG_STICK_CMPR
:
202 /** Privilged Registers */
211 case MISCREG_PRIVTICK
:
212 panic("Priviliged access to tick registers not implemented\n");
224 //case MISCREG_CANSAVE:
226 //case MISCREG_CANRESTORE:
227 // return canrestore;
228 //case MISCREG_CLEANWIN:
230 //case MISCREG_OTHERWIN:
232 //case MISCREG_WSTATE:
237 /** Hyper privileged registers */
238 case MISCREG_HPSTATE
:
240 case MISCREG_HTSTATE
:
241 return htstate
[tl
-1];
246 case MISCREG_STRAND_STS_REG
:
247 return strandStatusReg
;
248 case MISCREG_HSTICK_CMPR
:
251 /** Floating Point Status Register */
253 DPRINTF(Sparc
, "FSR read as: %#x\n", fsr
);
256 case MISCREG_MMU_P_CONTEXT
:
258 case MISCREG_MMU_S_CONTEXT
:
260 case MISCREG_MMU_PART_ID
:
262 case MISCREG_MMU_LSU_CTRL
:
265 case MISCREG_MMU_ITLB_C0_TSB_PS0
:
267 case MISCREG_MMU_ITLB_C0_TSB_PS1
:
269 case MISCREG_MMU_ITLB_C0_CONFIG
:
271 case MISCREG_MMU_ITLB_CX_TSB_PS0
:
273 case MISCREG_MMU_ITLB_CX_TSB_PS1
:
275 case MISCREG_MMU_ITLB_CX_CONFIG
:
277 case MISCREG_MMU_ITLB_SFSR
:
279 case MISCREG_MMU_ITLB_TAG_ACCESS
:
280 return iTlbTagAccess
;
282 case MISCREG_MMU_DTLB_C0_TSB_PS0
:
284 case MISCREG_MMU_DTLB_C0_TSB_PS1
:
286 case MISCREG_MMU_DTLB_C0_CONFIG
:
288 case MISCREG_MMU_DTLB_CX_TSB_PS0
:
290 case MISCREG_MMU_DTLB_CX_TSB_PS1
:
292 case MISCREG_MMU_DTLB_CX_CONFIG
:
294 case MISCREG_MMU_DTLB_SFSR
:
296 case MISCREG_MMU_DTLB_SFAR
:
298 case MISCREG_MMU_DTLB_TAG_ACCESS
:
299 return dTlbTagAccess
;
301 case MISCREG_SCRATCHPAD_R0
:
302 return scratchPad
[0];
303 case MISCREG_SCRATCHPAD_R1
:
304 return scratchPad
[1];
305 case MISCREG_SCRATCHPAD_R2
:
306 return scratchPad
[2];
307 case MISCREG_SCRATCHPAD_R3
:
308 return scratchPad
[3];
309 case MISCREG_SCRATCHPAD_R4
:
310 return scratchPad
[4];
311 case MISCREG_SCRATCHPAD_R5
:
312 return scratchPad
[5];
313 case MISCREG_SCRATCHPAD_R6
:
314 return scratchPad
[6];
315 case MISCREG_SCRATCHPAD_R7
:
316 return scratchPad
[7];
317 case MISCREG_QUEUE_CPU_MONDO_HEAD
:
318 return cpu_mondo_head
;
319 case MISCREG_QUEUE_CPU_MONDO_TAIL
:
320 return cpu_mondo_tail
;
321 case MISCREG_QUEUE_DEV_MONDO_HEAD
:
322 return dev_mondo_head
;
323 case MISCREG_QUEUE_DEV_MONDO_TAIL
:
324 return dev_mondo_tail
;
325 case MISCREG_QUEUE_RES_ERROR_HEAD
:
326 return res_error_head
;
327 case MISCREG_QUEUE_RES_ERROR_TAIL
:
328 return res_error_tail
;
329 case MISCREG_QUEUE_NRES_ERROR_HEAD
:
330 return nres_error_head
;
331 case MISCREG_QUEUE_NRES_ERROR_TAIL
:
332 return nres_error_tail
;
334 panic("Miscellaneous register %d not implemented\n", miscReg
);
338 MiscReg
MiscRegFile::readReg(int miscReg
, ThreadContext
* tc
)
341 // tick and stick are aliased to each other in niagra
342 // well store the tick data in stick and the interrupt bit in tick
345 case MISCREG_PRIVTICK
:
346 // I'm not sure why legion ignores the lowest two bits, but we'll go
348 // change from curCycle() to instCount() until we're done with legion
349 DPRINTF(Timer
, "Instruction Count when TICK read: %#X stick=%#X\n",
350 tc
->getCpuPtr()->instCount(), stick
);
351 return mbits(tc
->getCpuPtr()->instCount() + (int64_t)stick
,62,2) |
354 // in legion if fp is enabled du and dl are set
358 panic("Performance Instrumentation not impl\n");
359 case MISCREG_SOFTINT_CLR
:
360 case MISCREG_SOFTINT_SET
:
361 panic("Can read from softint clr/set\n");
362 case MISCREG_SOFTINT
:
363 case MISCREG_TICK_CMPR
:
364 case MISCREG_STICK_CMPR
:
366 case MISCREG_HTSTATE
:
369 case MISCREG_STRAND_STS_REG
:
370 case MISCREG_HSTICK_CMPR
:
371 case MISCREG_QUEUE_CPU_MONDO_HEAD
:
372 case MISCREG_QUEUE_CPU_MONDO_TAIL
:
373 case MISCREG_QUEUE_DEV_MONDO_HEAD
:
374 case MISCREG_QUEUE_DEV_MONDO_TAIL
:
375 case MISCREG_QUEUE_RES_ERROR_HEAD
:
376 case MISCREG_QUEUE_RES_ERROR_TAIL
:
377 case MISCREG_QUEUE_NRES_ERROR_HEAD
:
378 case MISCREG_QUEUE_NRES_ERROR_TAIL
:
380 case MISCREG_HPSTATE
:
381 return readFSReg(miscReg
, tc
);
383 case MISCREG_HPSTATE
:
384 //HPSTATE is special because because sometimes in privilege checks for instructions
385 //it will read HPSTATE to make sure the priv. level is ok
386 //So, we'll just have to tell it it isn't, instead of panicing.
389 panic("Accessing Fullsystem register %s in SE mode\n",getMiscRegName(miscReg
));
393 return readRegNoEffect(miscReg
);
396 void MiscRegFile::setRegNoEffect(int miscReg
, const MiscReg
&val
)
415 panic("PCR not implemented\n");
417 panic("PIC not implemented\n");
421 case MISCREG_SOFTINT
:
424 case MISCREG_TICK_CMPR
:
430 case MISCREG_STICK_CMPR
:
434 /** Privilged Registers */
447 case MISCREG_PRIVTICK
:
448 panic("Priviliged access to tick regesiters not implemented\n");
450 // clear lower 7 bits on writes.
451 tba
= val
& ULL(~0x7FFF);
454 pstate
= (val
& PSTATE_MASK
);
465 // case MISCREG_CANSAVE:
468 // case MISCREG_CANRESTORE:
471 // case MISCREG_CLEANWIN:
474 // case MISCREG_OTHERWIN:
477 // case MISCREG_WSTATE:
484 /** Hyper privileged registers */
485 case MISCREG_HPSTATE
:
488 case MISCREG_HTSTATE
:
496 case MISCREG_STRAND_STS_REG
:
497 strandStatusReg
= val
;
499 case MISCREG_HSTICK_CMPR
:
503 /** Floating Point Status Register */
506 DPRINTF(Sparc
, "FSR written with: %#x\n", fsr
);
509 case MISCREG_MMU_P_CONTEXT
:
512 case MISCREG_MMU_S_CONTEXT
:
515 case MISCREG_MMU_PART_ID
:
518 case MISCREG_MMU_LSU_CTRL
:
522 case MISCREG_MMU_ITLB_C0_TSB_PS0
:
525 case MISCREG_MMU_ITLB_C0_TSB_PS1
:
528 case MISCREG_MMU_ITLB_C0_CONFIG
:
531 case MISCREG_MMU_ITLB_CX_TSB_PS0
:
534 case MISCREG_MMU_ITLB_CX_TSB_PS1
:
537 case MISCREG_MMU_ITLB_CX_CONFIG
:
540 case MISCREG_MMU_ITLB_SFSR
:
543 case MISCREG_MMU_ITLB_TAG_ACCESS
:
547 case MISCREG_MMU_DTLB_C0_TSB_PS0
:
550 case MISCREG_MMU_DTLB_C0_TSB_PS1
:
553 case MISCREG_MMU_DTLB_C0_CONFIG
:
556 case MISCREG_MMU_DTLB_CX_TSB_PS0
:
559 case MISCREG_MMU_DTLB_CX_TSB_PS1
:
562 case MISCREG_MMU_DTLB_CX_CONFIG
:
565 case MISCREG_MMU_DTLB_SFSR
:
568 case MISCREG_MMU_DTLB_SFAR
:
571 case MISCREG_MMU_DTLB_TAG_ACCESS
:
575 case MISCREG_SCRATCHPAD_R0
:
578 case MISCREG_SCRATCHPAD_R1
:
581 case MISCREG_SCRATCHPAD_R2
:
584 case MISCREG_SCRATCHPAD_R3
:
587 case MISCREG_SCRATCHPAD_R4
:
590 case MISCREG_SCRATCHPAD_R5
:
593 case MISCREG_SCRATCHPAD_R6
:
596 case MISCREG_SCRATCHPAD_R7
:
599 case MISCREG_QUEUE_CPU_MONDO_HEAD
:
600 cpu_mondo_head
= val
;
602 case MISCREG_QUEUE_CPU_MONDO_TAIL
:
603 cpu_mondo_tail
= val
;
605 case MISCREG_QUEUE_DEV_MONDO_HEAD
:
606 dev_mondo_head
= val
;
608 case MISCREG_QUEUE_DEV_MONDO_TAIL
:
609 dev_mondo_tail
= val
;
611 case MISCREG_QUEUE_RES_ERROR_HEAD
:
612 res_error_head
= val
;
614 case MISCREG_QUEUE_RES_ERROR_TAIL
:
615 res_error_tail
= val
;
617 case MISCREG_QUEUE_NRES_ERROR_HEAD
:
618 nres_error_head
= val
;
620 case MISCREG_QUEUE_NRES_ERROR_TAIL
:
621 nres_error_tail
= val
;
624 panic("Miscellaneous register %d not implemented\n", miscReg
);
628 void MiscRegFile::setReg(int miscReg
,
629 const MiscReg
&val
, ThreadContext
* tc
)
631 MiscReg new_val
= val
;
636 // stick and tick are same thing on niagra
637 // use stick for offset and tick for holding intrrupt bit
638 stick
= mbits(val
,62,0) - tc
->getCpuPtr()->instCount();
639 tick
= mbits(val
,63,63);
640 DPRINTF(Timer
, "Writing TICK=%#X\n", val
);
643 //Configure the fpu based on the fprs
646 //Set up performance counting based on pcr value
649 pstate
= val
& PSTATE_MASK
;
654 if (hpstate
& HPSTATE::tlz
&& tl
== 0 && !(hpstate
& HPSTATE::hpriv
))
655 tc
->getCpuPtr()->post_interrupt(IT_TRAP_LEVEL_ZERO
,0);
657 tc
->getCpuPtr()->clear_interrupt(IT_TRAP_LEVEL_ZERO
,0);
661 new_val
= val
>= NWindows
? NWindows
- 1 : val
;
663 new_val
= NWindows
- 1;
665 tc
->changeRegFileContext(CONTEXT_CWP
, new_val
);
668 tc
->changeRegFileContext(CONTEXT_GLOBALS
, val
);
671 case MISCREG_SOFTINT
:
672 case MISCREG_SOFTINT_SET
:
673 case MISCREG_SOFTINT_CLR
:
674 case MISCREG_TICK_CMPR
:
675 case MISCREG_STICK_CMPR
:
677 case MISCREG_HTSTATE
:
680 case MISCREG_STRAND_STS_REG
:
681 case MISCREG_HSTICK_CMPR
:
682 case MISCREG_QUEUE_CPU_MONDO_HEAD
:
683 case MISCREG_QUEUE_CPU_MONDO_TAIL
:
684 case MISCREG_QUEUE_DEV_MONDO_HEAD
:
685 case MISCREG_QUEUE_DEV_MONDO_TAIL
:
686 case MISCREG_QUEUE_RES_ERROR_HEAD
:
687 case MISCREG_QUEUE_RES_ERROR_TAIL
:
688 case MISCREG_QUEUE_NRES_ERROR_HEAD
:
689 case MISCREG_QUEUE_NRES_ERROR_TAIL
:
691 case MISCREG_HPSTATE
:
692 setFSReg(miscReg
, val
, tc
);
695 case MISCREG_HPSTATE
:
696 //HPSTATE is special because normal trap processing saves HPSTATE when
697 //it goes into a trap, and restores it when it returns.
699 panic("Accessing Fullsystem register %s to %#x in SE mode\n", getMiscRegName(miscReg
), val
);
702 setRegNoEffect(miscReg
, new_val
);
705 void MiscRegFile::serialize(std::ostream
& os
)
707 SERIALIZE_SCALAR(asi
);
708 SERIALIZE_SCALAR(tick
);
709 SERIALIZE_SCALAR(fprs
);
710 SERIALIZE_SCALAR(gsr
);
711 SERIALIZE_SCALAR(softint
);
712 SERIALIZE_SCALAR(tick_cmpr
);
713 SERIALIZE_SCALAR(stick
);
714 SERIALIZE_SCALAR(stick_cmpr
);
715 SERIALIZE_ARRAY(tpc
,MaxTL
);
716 SERIALIZE_ARRAY(tnpc
,MaxTL
);
717 SERIALIZE_ARRAY(tstate
,MaxTL
);
718 SERIALIZE_ARRAY(tt
,MaxTL
);
719 SERIALIZE_SCALAR(tba
);
720 SERIALIZE_SCALAR(pstate
);
721 SERIALIZE_SCALAR(tl
);
722 SERIALIZE_SCALAR(pil
);
723 SERIALIZE_SCALAR(cwp
);
724 SERIALIZE_SCALAR(gl
);
725 SERIALIZE_SCALAR(hpstate
);
726 SERIALIZE_ARRAY(htstate
,MaxTL
);
727 SERIALIZE_SCALAR(hintp
);
728 SERIALIZE_SCALAR(htba
);
729 SERIALIZE_SCALAR(hstick_cmpr
);
730 SERIALIZE_SCALAR(strandStatusReg
);
731 SERIALIZE_SCALAR(fsr
);
732 SERIALIZE_SCALAR(priContext
);
733 SERIALIZE_SCALAR(secContext
);
734 SERIALIZE_SCALAR(partId
);
735 SERIALIZE_SCALAR(lsuCtrlReg
);
736 SERIALIZE_SCALAR(iTlbC0TsbPs0
);
737 SERIALIZE_SCALAR(iTlbC0TsbPs1
);
738 SERIALIZE_SCALAR(iTlbC0Config
);
739 SERIALIZE_SCALAR(iTlbCXTsbPs0
);
740 SERIALIZE_SCALAR(iTlbCXTsbPs1
);
741 SERIALIZE_SCALAR(iTlbCXConfig
);
742 SERIALIZE_SCALAR(iTlbSfsr
);
743 SERIALIZE_SCALAR(iTlbTagAccess
);
744 SERIALIZE_SCALAR(dTlbC0TsbPs0
);
745 SERIALIZE_SCALAR(dTlbC0TsbPs1
);
746 SERIALIZE_SCALAR(dTlbC0Config
);
747 SERIALIZE_SCALAR(dTlbCXTsbPs0
);
748 SERIALIZE_SCALAR(dTlbCXTsbPs1
);
749 SERIALIZE_SCALAR(dTlbCXConfig
);
750 SERIALIZE_SCALAR(dTlbSfsr
);
751 SERIALIZE_SCALAR(dTlbSfar
);
752 SERIALIZE_SCALAR(dTlbTagAccess
);
753 SERIALIZE_ARRAY(scratchPad
,8);
754 SERIALIZE_SCALAR(cpu_mondo_head
);
755 SERIALIZE_SCALAR(cpu_mondo_tail
);
756 SERIALIZE_SCALAR(dev_mondo_head
);
757 SERIALIZE_SCALAR(dev_mondo_tail
);
758 SERIALIZE_SCALAR(res_error_head
);
759 SERIALIZE_SCALAR(res_error_tail
);
760 SERIALIZE_SCALAR(nres_error_head
);
761 SERIALIZE_SCALAR(nres_error_tail
);
763 Tick tick_cmp
= 0, stick_cmp
= 0, hstick_cmp
= 0;
764 ThreadContext
*tc
= NULL
;
767 bool tick_intr_sched
= true;
770 tc
= tickCompare
->getTC();
771 else if (sTickCompare
)
772 tc
= sTickCompare
->getTC();
773 else if (hSTickCompare
)
774 tc
= hSTickCompare
->getTC();
776 tick_intr_sched
= false;
778 SERIALIZE_SCALAR(tick_intr_sched
);
781 cpu
= tc
->getCpuPtr();
782 tc_num
= cpu
->findContext(tc
);
783 if (tickCompare
&& tickCompare
->scheduled())
784 tick_cmp
= tickCompare
->when();
785 if (sTickCompare
&& sTickCompare
->scheduled())
786 stick_cmp
= sTickCompare
->when();
787 if (hSTickCompare
&& hSTickCompare
->scheduled())
788 hstick_cmp
= hSTickCompare
->when();
790 SERIALIZE_OBJPTR(cpu
);
791 SERIALIZE_SCALAR(tc_num
);
792 SERIALIZE_SCALAR(tick_cmp
);
793 SERIALIZE_SCALAR(stick_cmp
);
794 SERIALIZE_SCALAR(hstick_cmp
);
799 void MiscRegFile::unserialize(Checkpoint
* cp
, const std::string
& section
)
801 UNSERIALIZE_SCALAR(asi
);
802 UNSERIALIZE_SCALAR(tick
);
803 UNSERIALIZE_SCALAR(fprs
);
804 UNSERIALIZE_SCALAR(gsr
);
805 UNSERIALIZE_SCALAR(softint
);
806 UNSERIALIZE_SCALAR(tick_cmpr
);
807 UNSERIALIZE_SCALAR(stick
);
808 UNSERIALIZE_SCALAR(stick_cmpr
);
809 UNSERIALIZE_ARRAY(tpc
,MaxTL
);
810 UNSERIALIZE_ARRAY(tnpc
,MaxTL
);
811 UNSERIALIZE_ARRAY(tstate
,MaxTL
);
812 UNSERIALIZE_ARRAY(tt
,MaxTL
);
813 UNSERIALIZE_SCALAR(tba
);
814 UNSERIALIZE_SCALAR(pstate
);
815 UNSERIALIZE_SCALAR(tl
);
816 UNSERIALIZE_SCALAR(pil
);
817 UNSERIALIZE_SCALAR(cwp
);
818 UNSERIALIZE_SCALAR(gl
);
819 UNSERIALIZE_SCALAR(hpstate
);
820 UNSERIALIZE_ARRAY(htstate
,MaxTL
);
821 UNSERIALIZE_SCALAR(hintp
);
822 UNSERIALIZE_SCALAR(htba
);
823 UNSERIALIZE_SCALAR(hstick_cmpr
);
824 UNSERIALIZE_SCALAR(strandStatusReg
);
825 UNSERIALIZE_SCALAR(fsr
);
826 UNSERIALIZE_SCALAR(priContext
);
827 UNSERIALIZE_SCALAR(secContext
);
828 UNSERIALIZE_SCALAR(partId
);
829 UNSERIALIZE_SCALAR(lsuCtrlReg
);
830 UNSERIALIZE_SCALAR(iTlbC0TsbPs0
);
831 UNSERIALIZE_SCALAR(iTlbC0TsbPs1
);
832 UNSERIALIZE_SCALAR(iTlbC0Config
);
833 UNSERIALIZE_SCALAR(iTlbCXTsbPs0
);
834 UNSERIALIZE_SCALAR(iTlbCXTsbPs1
);
835 UNSERIALIZE_SCALAR(iTlbCXConfig
);
836 UNSERIALIZE_SCALAR(iTlbSfsr
);
837 UNSERIALIZE_SCALAR(iTlbTagAccess
);
838 UNSERIALIZE_SCALAR(dTlbC0TsbPs0
);
839 UNSERIALIZE_SCALAR(dTlbC0TsbPs1
);
840 UNSERIALIZE_SCALAR(dTlbC0Config
);
841 UNSERIALIZE_SCALAR(dTlbCXTsbPs0
);
842 UNSERIALIZE_SCALAR(dTlbCXTsbPs1
);
843 UNSERIALIZE_SCALAR(dTlbCXConfig
);
844 UNSERIALIZE_SCALAR(dTlbSfsr
);
845 UNSERIALIZE_SCALAR(dTlbSfar
);
846 UNSERIALIZE_SCALAR(dTlbTagAccess
);
847 UNSERIALIZE_ARRAY(scratchPad
,8);
848 UNSERIALIZE_SCALAR(cpu_mondo_head
);
849 UNSERIALIZE_SCALAR(cpu_mondo_tail
);
850 UNSERIALIZE_SCALAR(dev_mondo_head
);
851 UNSERIALIZE_SCALAR(dev_mondo_tail
);
852 UNSERIALIZE_SCALAR(res_error_head
);
853 UNSERIALIZE_SCALAR(res_error_tail
);
854 UNSERIALIZE_SCALAR(nres_error_head
);
855 UNSERIALIZE_SCALAR(nres_error_tail
);
858 Tick tick_cmp
= 0, stick_cmp
= 0, hstick_cmp
= 0;
859 ThreadContext
*tc
= NULL
;
862 bool tick_intr_sched
;
863 UNSERIALIZE_SCALAR(tick_intr_sched
);
864 if (tick_intr_sched
) {
865 UNSERIALIZE_OBJPTR(cpu
);
867 UNSERIALIZE_SCALAR(tc_num
);
868 UNSERIALIZE_SCALAR(tick_cmp
);
869 UNSERIALIZE_SCALAR(stick_cmp
);
870 UNSERIALIZE_SCALAR(hstick_cmp
);
871 tc
= cpu
->getContext(tc_num
);
874 tickCompare
= new TickCompareEvent(this, tc
);
875 tickCompare
->schedule(tick_cmp
);
878 sTickCompare
= new STickCompareEvent(this, tc
);
879 sTickCompare
->schedule(stick_cmp
);
882 hSTickCompare
= new HSTickCompareEvent(this, tc
);
883 hSTickCompare
->schedule(hstick_cmp
);