Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / api / pli / bin / SS_RegCompare.cc
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T2 Processor File: SS_RegCompare.cc
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
//
// The above named program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// The above named program is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this work; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
// ========== Copyright Header End ============================================
//
// @-ARCH-@_RegCompare.cc is automatically generated from
// ss/api/pli/bin/Bl_RegCompare.cc, do not modify @-ARCH-@_RegCompare.cc
// make necessary changes in ss/api/pli/bin/Bl_RegCompare.cc instead.
//
#include "@-ARCH-@_RegCompare.h"
using namespace std;
@-ARCH-@_RegCompare::@-ARCH-@_RegCompare( @-ARCH-VF-@_Strand* _strand, SS_PliSocket* _socket )/*{{{*/
:
SS_RegCompare(_strand,_socket),
strand(_strand)
{}
/*}}}*/
void @-ARCH-@_RegCompare::initialise()/*{{{*/
{
uint_t id = strand->strand_id();
SS_RegCompare::initialise();
for (RegId* c = reg_list; *c; c++)
{
RegId ci = *c;
uint64_t new_val = get(ci);
if (ci == CTR_FSR)
new_val &= ~uint64_t(0x2000);
else if (ci == CTR_HPSTATE)
new_val &= ~uint64_t(0x800);
ctr[ci] = new_val;
}
}
/*}}}*/
void @-ARCH-@_RegCompare::compare( uint32_t opc )/*{{{*/
{
char cmp[64];
uint_t id = strand->strand_id();
SS_RegCompare::compare();
for (RegId* c = reg_list; *c; c++)
{
RegId ci = *c;
uint64_t old_val = ctr[ci];
uint64_t new_val = get(ci);
if (ci == CTR_FSR)
new_val &= ~uint64_t(0x2000);
else if (ci == CTR_HPSTATE)
new_val &= ~uint64_t(0x800);
if (new_val != old_val)
{
if (cmpr_list[ci])
{
new_delta = true;
sprintf(cmp,"STEP: %d C %d %016llx ",id,ci,new_val);
socket->write(cmp);
}
ctr[ci] = new_val;
}
}
if (cmpr_list[SS_RegCompare::CTR_OPCODE])
{
new_delta = true;
sprintf(cmp,"STEP: %d C 255 %08x ",id,opc);
socket->write(cmp);
}
if (new_delta)
{
sprintf(cmp,"\n");
socket->write(cmp);
socket->flush();
}
}
/*}}}*/
void @-ARCH-@_RegCompare::dump_regs()/*{{{*/
{
SS_RegCompare::dump_regs();
int dumplist[] =
{
CTR_PC, CTR_NPC, CTR_CWP, CTR_CCR,
CTR_FPRS, CTR_FSR, CTR_PSTATE, CTR_HPSTATE,
CTR_ASI, CTR_TICK, CTR_TL, CTR_PIL,
CTR_CANSAVE, CTR_CANRESTORE, CTR_CLEANWIN, CTR_OTHERWIN,
CTR_HVER, CTR_WSTATE, CTR_GL, CTR_TBA,
CTR_HTBA, CTR_TICK_CMPR, CTR_STICK_CMPR, CTR_HSTICK_CMPR,
CTR_HINTP, CTR_SOFTINT, CTR_GSR, CTR_INTR_RECV,
CTR_TPC1, CTR_TNPC1, CTR_TSTATE1, CTR_TT1,
CTR_TPC2, CTR_TNPC2, CTR_TSTATE2, CTR_TT2,
CTR_TPC3, CTR_TNPC3, CTR_TSTATE3, CTR_TT3,
CTR_TPC4, CTR_TNPC4, CTR_TSTATE4, CTR_TT4,
CTR_TPC5, CTR_TNPC5, CTR_TSTATE5, CTR_TT5,
CTR_TPC6, CTR_TNPC6, CTR_TSTATE6, CTR_TT6,
CTR_HTSTATE1, CTR_HTSTATE2, CTR_HTSTATE3, CTR_HTSTATE4,
CTR_HTSTATE5, CTR_HTSTATE6, CTR_LSU_CONTROL, CTR_DWATCHPOINT_ADDR,
CTR_CTXT_PRIM_0, CTR_CTXT_SEC_0, CTR_CTXT_PRIM_1, CTR_CTXT_SEC_1,
CTR_I_TAG_ACC, CTR_D_TAG_ACC, CTR_D_SFAR, CTR_CTXT_Z_TSB_CFG0,
CTR_CTXT_Z_TSB_CFG1, CTR_CTXT_Z_TSB_CFG2, CTR_CTXT_Z_TSB_CFG3, CTR_CTXT_NZ_TSB_CFG0,
CTR_CTXT_NZ_TSB_CFG1, CTR_CTXT_NZ_TSB_CFG2, CTR_CTXT_NZ_TSB_CFG3
};
int size = sizeof(dumplist)/sizeof(dumplist[0]);
int i = 0;
while (i < size)
{
// title
int ii = i;
fprintf(stdout, " ");
for (int j = 0; j < 4 && ii < size; j++)
{
fprintf(stdout, " %16s", reg_name[dumplist[ii]]);
ii++;
}
fprintf(stdout, "\n");
// value
ii = i;
fprintf(stdout, " ");
for (int j = 0; j < 4 && ii < size; j++)
{
fprintf(stdout, " %016llx", get((RegId)dumplist[ii]));
ii++;
}
fprintf(stdout, "\n");
i = ii;
}
}
/*}}}*/
uint64_t @-ARCH-@_RegCompare::get( RegId id )/*{{{*/
{
// Internal we keep the pc, npc, tpc, and tnpc values
// at 64 bits for detecting cases where we fall into the va-hole.
// However, @-ARCH-@ "externally" only implements 48 bits (well 46)
// of the address, so when we read those pc values we sign extend
// the 48 bit value to 64 bit.
uint_t sft;
uint64_t value = 0;
switch (id)
{
case CTR_PC:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->pc()) << sft) >> sft;
break;
case CTR_NPC:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->npc()) << sft) >> sft;
break;
case CTR_Y:
value = strand->y();
break;
case CTR_CCR:
value = strand->ccr();
break;
case CTR_FPRS:
value = strand->fprs();
break;
case CTR_FSR:
strand->get_fsr();
value = strand->fsr();
break;
case CTR_ASI:
value = strand->asi();
break;
case CTR_GSR:
value = strand->gsr();
break;
case CTR_TICK_CMPR:
value = strand->tick_cmpr();
break;
case CTR_STICK_CMPR:
value = strand->stick_cmpr();
break;
case CTR_PSTATE:
value = strand->pstate();
break;
case CTR_TL:
value = strand->tl();
break;
case CTR_PIL:
value = strand->pil();
break;
case CTR_TPC1:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[1].pc) << sft) >> sft;
break;
case CTR_TPC2:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[2].pc) << sft) >> sft;
break;
case CTR_TPC3:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[3].pc) << sft) >> sft;
break;
case CTR_TPC4:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[4].pc) << sft) >> sft;
break;
case CTR_TPC5:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[5].pc) << sft) >> sft;
break;
case CTR_TPC6:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[6].pc) << sft) >> sft;
break;
case CTR_TNPC1:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[1].npc) << sft) >> sft;
break;
case CTR_TNPC2:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[2].npc) << sft) >> sft;
break;
case CTR_TNPC3:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[3].npc) << sft) >> sft;
break;
case CTR_TNPC4:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[4].npc) << sft) >> sft;
break;
case CTR_TNPC5:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[5].npc) << sft) >> sft;
break;
case CTR_TNPC6:
sft = 64 - strand->va_bits();
value = (SS_Vaddr(strand->trap_state[6].npc) << sft) >> sft;
break;
case CTR_TSTATE1:
value = strand->trap_state[1].tstate;
break;
case CTR_TSTATE2:
value = strand->trap_state[2].tstate;
break;
case CTR_TSTATE3:
value = strand->trap_state[3].tstate;
break;
case CTR_TSTATE4:
value = strand->trap_state[4].tstate;
break;
case CTR_TSTATE5:
value = strand->trap_state[5].tstate;
break;
case CTR_TSTATE6:
value = strand->trap_state[6].tstate;
break;
case CTR_TT1:
value = strand->trap_state[1].tt;
break;
case CTR_TT2:
value = strand->trap_state[2].tt;
break;
case CTR_TT3:
value = strand->trap_state[3].tt;
break;
case CTR_TT4:
value = strand->trap_state[4].tt;
break;
case CTR_TT5:
value = strand->trap_state[5].tt;
break;
case CTR_TT6:
value = strand->trap_state[6].tt;
break;
case CTR_TBA:
value = strand->tba();
break;
case CTR_HVER:
value = strand->hver();
break;
case CTR_CWP:
value = strand->cwp();
break;
case CTR_CANSAVE:
value = strand->cansave();
break;
case CTR_CANRESTORE:
value = strand->canrestore();
break;
case CTR_OTHERWIN:
value = strand->otherwin();
break;
case CTR_WSTATE:
value = strand->wstate();
break;
case CTR_CLEANWIN:
value = strand->cleanwin();
break;
case CTR_SOFTINT:
value = strand->softint();
break;
case CTR_INTR_RECV:
value = strand->intr_recv;
break;
case CTR_GL:
value = strand->gl();
break;
case CTR_HPSTATE:
value = strand->hpstate();
break;
case CTR_HTSTATE1:
value = strand->trap_state[1].htstate;
break;
case CTR_HTSTATE2:
value = strand->trap_state[2].htstate;
break;
case CTR_HTSTATE3:
value = strand->trap_state[3].htstate;
break;
case CTR_HTSTATE4:
value = strand->trap_state[4].htstate;
break;
case CTR_HTSTATE5:
value = strand->trap_state[5].htstate;
break;
case CTR_HTSTATE6:
value = strand->trap_state[6].htstate;
break;
case CTR_HTBA:
value = strand->htba();
break;
case CTR_HINTP:
value = strand->hintp();
break;
case CTR_HSTICK_CMPR:
value = strand->hstick_cmpr();
break;
case CTR_D_SFAR:
value = strand->data_sfar();
break;
case CTR_CTXT_PRIM_0:
value = strand->primary_context[0]();
break;
case CTR_CTXT_SEC_0:
value = strand->secondary_context[0]();
break;
case CTR_CTXT_PRIM_1:
value = strand->primary_context[1]();
break;
case CTR_CTXT_SEC_1:
value = strand->secondary_context[1]();
break;
case CTR_LSU_CONTROL:
value = strand->lsu_ctr();
break;
case CTR_I_TAG_ACC:
value = strand->inst_tag_access();
break;
case CTR_CTXT_Z_TSB_CFG0:
value = strand->nucleus_tsb_config[0]();
break;
case CTR_CTXT_Z_TSB_CFG1:
value = strand->nucleus_tsb_config[1]();
break;
case CTR_CTXT_Z_TSB_CFG2:
value = strand->nucleus_tsb_config[2]();
break;
case CTR_CTXT_Z_TSB_CFG3:
value = strand->nucleus_tsb_config[3]();
break;
case CTR_CTXT_NZ_TSB_CFG0:
value = strand->non_nucleus_tsb_config[0]();
break;
case CTR_CTXT_NZ_TSB_CFG1:
value = strand->non_nucleus_tsb_config[1]();
break;
case CTR_CTXT_NZ_TSB_CFG2:
value = strand->non_nucleus_tsb_config[2]();
break;
case CTR_CTXT_NZ_TSB_CFG3:
value = strand->non_nucleus_tsb_config[3]();
break;
case CTR_D_TAG_ACC:
value = strand->data_tag_access();
break;
case CTR_DWATCHPOINT_ADDR:
value = strand->data_wp();
break;
default:
value = 0;
break;
}
return value;
}
/*}}}*/
int @-ARCH-@_RegCompare::name_2_index( string name )/*{{{*/
{
if (name == "G")
return SS_RegCompare::CTR_G;
else if (name == "W")
return SS_RegCompare::CTR_W;
else if (name == "F")
return SS_RegCompare::CTR_F;
else if (name == "INSTR")
return SS_RegCompare::CTR_INSTR;
else if (name == "OPCODE")
return SS_RegCompare::CTR_OPCODE;
else
{
int ii = -1;
for (int i = CTR_PC; i < CTR_TOTAL; i++)
if (reg_name[i] == name)
return i;
// no match, this is an error
fprintf(stdout, "ERROR: name_2_index(): no match for %s\n", name.c_str());
return -1;
}
}
/*}}}*/
@-ARCH-@_RegCompare::RegId @-ARCH-@_RegCompare::reg_list[] =/*{{{*/
{
@-ARCH-@_RegCompare::CTR_PC
, @-ARCH-@_RegCompare::CTR_NPC
, @-ARCH-@_RegCompare::CTR_Y
, @-ARCH-@_RegCompare::CTR_CCR
, @-ARCH-@_RegCompare::CTR_FPRS
, @-ARCH-@_RegCompare::CTR_FSR
, @-ARCH-@_RegCompare::CTR_ASI
, @-ARCH-@_RegCompare::CTR_GSR
, @-ARCH-@_RegCompare::CTR_TICK_CMPR
, @-ARCH-@_RegCompare::CTR_STICK_CMPR
, @-ARCH-@_RegCompare::CTR_PSTATE
, @-ARCH-@_RegCompare::CTR_TL
, @-ARCH-@_RegCompare::CTR_PIL
, @-ARCH-@_RegCompare::CTR_TPC1
, @-ARCH-@_RegCompare::CTR_TPC2
, @-ARCH-@_RegCompare::CTR_TPC3
, @-ARCH-@_RegCompare::CTR_TPC4
, @-ARCH-@_RegCompare::CTR_TPC5
, @-ARCH-@_RegCompare::CTR_TPC6
, @-ARCH-@_RegCompare::CTR_TNPC1
, @-ARCH-@_RegCompare::CTR_TNPC2
, @-ARCH-@_RegCompare::CTR_TNPC3
, @-ARCH-@_RegCompare::CTR_TNPC4
, @-ARCH-@_RegCompare::CTR_TNPC5
, @-ARCH-@_RegCompare::CTR_TNPC6
, @-ARCH-@_RegCompare::CTR_TSTATE1
, @-ARCH-@_RegCompare::CTR_TSTATE2
, @-ARCH-@_RegCompare::CTR_TSTATE3
, @-ARCH-@_RegCompare::CTR_TSTATE4
, @-ARCH-@_RegCompare::CTR_TSTATE5
, @-ARCH-@_RegCompare::CTR_TSTATE6
, @-ARCH-@_RegCompare::CTR_TT1
, @-ARCH-@_RegCompare::CTR_TT2
, @-ARCH-@_RegCompare::CTR_TT3
, @-ARCH-@_RegCompare::CTR_TT4
, @-ARCH-@_RegCompare::CTR_TT5
, @-ARCH-@_RegCompare::CTR_TT6
, @-ARCH-@_RegCompare::CTR_TBA
, @-ARCH-@_RegCompare::CTR_HVER
, @-ARCH-@_RegCompare::CTR_CWP
, @-ARCH-@_RegCompare::CTR_CANSAVE
, @-ARCH-@_RegCompare::CTR_CANRESTORE
, @-ARCH-@_RegCompare::CTR_OTHERWIN
, @-ARCH-@_RegCompare::CTR_WSTATE
, @-ARCH-@_RegCompare::CTR_CLEANWIN
, @-ARCH-@_RegCompare::CTR_SOFTINT
, @-ARCH-@_RegCompare::CTR_INTR_RECV
, @-ARCH-@_RegCompare::CTR_GL
, @-ARCH-@_RegCompare::CTR_HPSTATE
, @-ARCH-@_RegCompare::CTR_HTSTATE1
, @-ARCH-@_RegCompare::CTR_HTSTATE2
, @-ARCH-@_RegCompare::CTR_HTSTATE3
, @-ARCH-@_RegCompare::CTR_HTSTATE4
, @-ARCH-@_RegCompare::CTR_HTSTATE5
, @-ARCH-@_RegCompare::CTR_HTSTATE6
, @-ARCH-@_RegCompare::CTR_HTBA
, @-ARCH-@_RegCompare::CTR_HINTP
, @-ARCH-@_RegCompare::CTR_HSTICK_CMPR
, @-ARCH-@_RegCompare::CTR_D_SFAR // ToDo is this used or not?
, @-ARCH-@_RegCompare::CTR_CTXT_PRIM_0
, @-ARCH-@_RegCompare::CTR_CTXT_SEC_0
, @-ARCH-@_RegCompare::CTR_CTXT_PRIM_1
, @-ARCH-@_RegCompare::CTR_CTXT_SEC_1
, @-ARCH-@_RegCompare::CTR_LSU_CONTROL
, @-ARCH-@_RegCompare::CTR_I_TAG_ACC
, @-ARCH-@_RegCompare::CTR_CTXT_Z_TSB_CFG0
, @-ARCH-@_RegCompare::CTR_CTXT_Z_TSB_CFG1
, @-ARCH-@_RegCompare::CTR_CTXT_Z_TSB_CFG2
, @-ARCH-@_RegCompare::CTR_CTXT_Z_TSB_CFG3
, @-ARCH-@_RegCompare::CTR_CTXT_NZ_TSB_CFG0
, @-ARCH-@_RegCompare::CTR_CTXT_NZ_TSB_CFG1
, @-ARCH-@_RegCompare::CTR_CTXT_NZ_TSB_CFG2
, @-ARCH-@_RegCompare::CTR_CTXT_NZ_TSB_CFG3
, @-ARCH-@_RegCompare::CTR_D_TAG_ACC
, @-ARCH-@_RegCompare::CTR_DWATCHPOINT_ADDR
, @-ARCH-@_RegCompare::RegId(0)
};
/*}}}*/
const char* @-ARCH-@_RegCompare::reg_name[] = /*{{{*/
{
"G0", // 0
"G1", // 1
"G2", // 2
"G3", // 3
"G4", // 4
"G5", // 5
"G6", // 6
"G7", // 7
"O0", // 8
"O1", // 9
"O2", // 10
"O3", // 11
"O4", // 12
"O5", // 13
"O6", // 14
"O7", // 15
"L0", // 16
"L1", // 17
"L2", // 18
"L3", // 19
"L4", // 20
"L5", // 21
"L6", // 22
"L7", // 23
"I0", // 24
"I1", // 25
"I2", // 26
"I3", // 27
"I4", // 28
"I5", // 29
"I6", // 30
"I7", // 31
"PC", // 32
"NPC", // 33
"Y", // 34
"CCR", // 35
"FPRS", // 36
"FSR", // 37
"ASI", // 38
"TICK", // 39
"GSR", // 40
"TICK_CMPR", // 41
"STICK", // 42
"STICK_CMPR", // 43
"PSTATE", // 44
"TL", // 45
"PIL", // 46
"TPC1", // 47
"TPC2", // 48
"TPC3", // 49
"TPC4", // 50
"TPC5", // 51
"TPC6", // 52
"?TPC7?", // 53
"?TPC8?", // 54
"?TPC9?", // 55
"?TPC10?", // 56
"TNPC1", // 57
"TNPC2", // 58
"TNPC3", // 59
"TNPC4", // 60
"TNPC5", // 61
"TNPC6", // 62
"?TNPC7?", // 63
"?TNPC8?", // 64
"?TNPC9?", // 65
"?TNPC10?", // 66
"TSTATE1", // 67
"TSTATE2", // 68
"TSTATE3", // 69
"TSTATE4", // 70
"TSTATE5", // 71
"TSTATE6", // 72
"?TSTATE7?", // 73
"?TSTATE8?", // 74
"?TSTATE9?", // 75
"?TSTATE10?", // 76
"TT1", // 77
"TT2", // 78
"TT3", // 79
"TT4", // 80
"TT5", // 81
"TT6", // 82
"?TT7?", // 83
"?TT8?", // 84
"?TT9?", // 85
"?TT10?", // 86
"TBA", // 87
"VER", // 88
"CWP", // 89
"CANSAVE", // 90
"CANRESTORE", // 91
"OTHERWIN", // 92
"WSTATE", // 93
"CLEANWIN", // 94
"SOFTINT", // 95
"ECACHE_error_ENABLE", // 96
"ASYNCHRONOUS_FAULT_STATUS", // 97
"ASYNCHRONOUS_FAULT_ADDRESS", // 98
"OUT_INTR_DATA0", // 99
"OUT_INTR_DATA1", // 100
"OUT_INTR_DATA2", // 101
"INTR_DISPATCH_STATUS", // 102
"IN_INTR_DATA0", // 103
"IN_INTR_DATA1", // 104
"IN_INTR_DATA2", // 105
"INTR_RECV", // 106
"GL", // 107
"HPSTATE", // 108
"HTSTATE1", // 109
"HTSTATE2", // 110
"HTSTATE3", // 111
"HTSTATE4", // 112
"HTSTATE5", // 113
"HTSTATE6", // 114
"HTSTATE7", // 115
"HTSTATE8", // 116
"HTSTATE9", // 117
"HTSTATE10", // 118
"HTBA", // 119
"HINTP", // 120
"HSTICK_CMPR", // 121
"MID", // 122
"I_SFSR", // 123
"D_SFSR", // 124
"D_SFAR", // 125
"CTXT_PRIM_0", // 126
"CTXT_SEC_0", // 127
"CTXT_PRIM_1", // 128
"CTXT_SEC_1", // 129
"LSU_CONTROL", // 130
"I_TAG_ACC", // 131
"CTXT_Z_TSB_CFG0", // 132
"CTXT_Z_TSB_CFG1", // 133
"CTXT_Z_TSB_CFG2", // 134
"CTXT_Z_TSB_CFG3", // 135
"CTXT_NZ_TSB_CFG0", // 136
"CTXT_NZ_TSB_CFG1", // 137
"CTXT_NZ_TSB_CFG2", // 138
"CTXT_NZ_TSB_CFG3", // 139
"I_DATA_IN", // 140
"D_TAG_ACC", // 141
"DWATCHPOINT_ADDR", // 142
"D_DATA_IN", // 143
"I_TAG_TARGET", // 144
"D_TAG_TARGET", // 145
"I_TSB_PTR0", // 146
"I_TSB_PTR1", // 147
"I_TSB_PTR2", // 148
"I_TSB_PTR3", // 149
"D_TSB_PTR0", // 150
"D_TSB_PTR1", // 151
"D_TSB_PTR2", // 152
"D_TSB_PTR3", // 153
"I_MASK_0", // 154
"I_MASK_1", // 155
"I_WATCHPOINT_0", // 156
"I_WATCHPOINT_1", // 157
"SPU_CWQ_CSR", // 158
"SPU_CWQ_SYNC", // 159
};
/*}}}*/