Revision 375ee38b
b/linux-user/main.c | ||
---|---|---|
680 | 680 |
if (trapnr == TT_DFAULT) |
681 | 681 |
info._sifields._sigfault._addr = env->dmmuregs[4]; |
682 | 682 |
else |
683 |
info._sifields._sigfault._addr = env->tpc[env->tl];
|
|
683 |
info._sifields._sigfault._addr = env->tsptr->tpc;
|
|
684 | 684 |
queue_signal(info.si_signo, &info); |
685 | 685 |
} |
686 | 686 |
break; |
b/target-sparc/cpu.h | ||
---|---|---|
169 | 169 |
#define NB_MMU_MODES 2 |
170 | 170 |
#else |
171 | 171 |
#define NB_MMU_MODES 3 |
172 |
typedef struct trap_state { |
|
173 |
uint64_t tpc; |
|
174 |
uint64_t tnpc; |
|
175 |
uint64_t tstate; |
|
176 |
uint32_t tt; |
|
177 |
} trap_state; |
|
172 | 178 |
#endif |
173 | 179 |
|
174 | 180 |
typedef struct CPUSPARCState { |
... | ... | |
234 | 240 |
#if defined(TARGET_SPARC64) |
235 | 241 |
#define MAXTL 4 |
236 | 242 |
uint64_t t0, t1, t2; |
237 |
uint64_t tpc[MAXTL]; |
|
238 |
uint64_t tnpc[MAXTL]; |
|
239 |
uint64_t tstate[MAXTL]; |
|
240 |
uint32_t tt[MAXTL]; |
|
243 |
trap_state *tsptr; |
|
244 |
trap_state ts[MAXTL]; |
|
241 | 245 |
uint32_t xcc; /* Extended integer condition codes */ |
242 | 246 |
uint32_t asi; |
243 | 247 |
uint32_t pstate; |
b/target-sparc/op.c | ||
---|---|---|
805 | 805 |
PUT_CCR(env, T0); |
806 | 806 |
} |
807 | 807 |
|
808 |
void OPPROTO op_rdtpc(void) |
|
809 |
{ |
|
810 |
T0 = env->tpc[env->tl]; |
|
811 |
} |
|
812 |
|
|
813 |
void OPPROTO op_wrtpc(void) |
|
814 |
{ |
|
815 |
env->tpc[env->tl] = T0; |
|
816 |
} |
|
817 |
|
|
818 |
void OPPROTO op_rdtnpc(void) |
|
819 |
{ |
|
820 |
T0 = env->tnpc[env->tl]; |
|
821 |
} |
|
822 |
|
|
823 |
void OPPROTO op_wrtnpc(void) |
|
824 |
{ |
|
825 |
env->tnpc[env->tl] = T0; |
|
826 |
} |
|
827 |
|
|
828 |
void OPPROTO op_rdtstate(void) |
|
829 |
{ |
|
830 |
T0 = env->tstate[env->tl]; |
|
831 |
} |
|
832 |
|
|
833 |
void OPPROTO op_wrtstate(void) |
|
834 |
{ |
|
835 |
env->tstate[env->tl] = T0; |
|
836 |
} |
|
837 |
|
|
838 |
void OPPROTO op_rdtt(void) |
|
839 |
{ |
|
840 |
T0 = env->tt[env->tl]; |
|
841 |
} |
|
842 |
|
|
843 |
void OPPROTO op_wrtt(void) |
|
844 |
{ |
|
845 |
env->tt[env->tl] = T0; |
|
846 |
} |
|
847 |
|
|
848 | 808 |
// CWP handling is reversed in V9, but we still use the V8 register |
849 | 809 |
// order. |
850 | 810 |
void OPPROTO op_rdcwp(void) |
b/target-sparc/op_helper.c | ||
---|---|---|
1675 | 1675 |
void helper_done(void) |
1676 | 1676 |
{ |
1677 | 1677 |
env->tl--; |
1678 |
env->pc = env->tnpc[env->tl]; |
|
1679 |
env->npc = env->tnpc[env->tl] + 4; |
|
1680 |
PUT_CCR(env, env->tstate[env->tl] >> 32); |
|
1681 |
env->asi = (env->tstate[env->tl] >> 24) & 0xff; |
|
1682 |
change_pstate((env->tstate[env->tl] >> 8) & 0xf3f); |
|
1683 |
PUT_CWP64(env, env->tstate[env->tl] & 0xff); |
|
1678 |
env->tsptr = &env->ts[env->tl]; |
|
1679 |
env->pc = env->tsptr->tpc; |
|
1680 |
env->npc = env->tsptr->tnpc + 4; |
|
1681 |
PUT_CCR(env, env->tsptr->tstate >> 32); |
|
1682 |
env->asi = (env->tsptr->tstate >> 24) & 0xff; |
|
1683 |
change_pstate((env->tsptr->tstate >> 8) & 0xf3f); |
|
1684 |
PUT_CWP64(env, env->tsptr->tstate & 0xff); |
|
1684 | 1685 |
} |
1685 | 1686 |
|
1686 | 1687 |
void helper_retry(void) |
1687 | 1688 |
{ |
1688 | 1689 |
env->tl--; |
1689 |
env->pc = env->tpc[env->tl]; |
|
1690 |
env->npc = env->tnpc[env->tl]; |
|
1691 |
PUT_CCR(env, env->tstate[env->tl] >> 32); |
|
1692 |
env->asi = (env->tstate[env->tl] >> 24) & 0xff; |
|
1693 |
change_pstate((env->tstate[env->tl] >> 8) & 0xf3f); |
|
1694 |
PUT_CWP64(env, env->tstate[env->tl] & 0xff); |
|
1690 |
env->tsptr = &env->ts[env->tl]; |
|
1691 |
env->pc = env->tsptr->tpc; |
|
1692 |
env->npc = env->tsptr->tnpc; |
|
1693 |
PUT_CCR(env, env->tsptr->tstate >> 32); |
|
1694 |
env->asi = (env->tsptr->tstate >> 24) & 0xff; |
|
1695 |
change_pstate((env->tsptr->tstate >> 8) & 0xf3f); |
|
1696 |
PUT_CWP64(env, env->tsptr->tstate & 0xff); |
|
1695 | 1697 |
} |
1696 | 1698 |
#endif |
1697 | 1699 |
|
... | ... | |
1813 | 1815 |
return; |
1814 | 1816 |
} |
1815 | 1817 |
#endif |
1816 |
env->tstate[env->tl] = ((uint64_t)GET_CCR(env) << 32) | ((env->asi & 0xff) << 24) | |
|
1817 |
((env->pstate & 0xf3f) << 8) | GET_CWP64(env); |
|
1818 |
env->tpc[env->tl] = env->pc; |
|
1819 |
env->tnpc[env->tl] = env->npc; |
|
1820 |
env->tt[env->tl] = intno; |
|
1818 |
env->tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) | |
|
1819 |
((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) | |
|
1820 |
GET_CWP64(env); |
|
1821 |
env->tsptr->tpc = env->pc; |
|
1822 |
env->tsptr->tnpc = env->npc; |
|
1823 |
env->tsptr->tt = intno; |
|
1821 | 1824 |
change_pstate(PS_PEF | PS_PRIV | PS_AG); |
1822 | 1825 |
|
1823 | 1826 |
if (intno == TT_CLRWIN) |
... | ... | |
1835 | 1838 |
if (env->tl != MAXTL) |
1836 | 1839 |
env->tl++; |
1837 | 1840 |
} |
1841 |
env->tsptr = &env->ts[env->tl]; |
|
1838 | 1842 |
env->pc = env->tbr; |
1839 | 1843 |
env->npc = env->pc + 4; |
1840 | 1844 |
env->exception_index = 0; |
b/target-sparc/translate.c | ||
---|---|---|
1386 | 1386 |
rs1 = GET_FIELD(insn, 13, 17); |
1387 | 1387 |
switch (rs1) { |
1388 | 1388 |
case 0: // tpc |
1389 |
gen_op_rdtpc(); |
|
1389 |
{ |
|
1390 |
TCGv r_tsptr; |
|
1391 |
|
|
1392 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
1393 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
1394 |
offsetof(CPUState, tsptr)); |
|
1395 |
tcg_gen_ld_tl(cpu_T[0], r_tsptr, |
|
1396 |
offsetof(trap_state, tpc)); |
|
1397 |
} |
|
1390 | 1398 |
break; |
1391 | 1399 |
case 1: // tnpc |
1392 |
gen_op_rdtnpc(); |
|
1400 |
{ |
|
1401 |
TCGv r_tsptr; |
|
1402 |
|
|
1403 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
1404 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
1405 |
offsetof(CPUState, tsptr)); |
|
1406 |
tcg_gen_ld_tl(cpu_T[0], r_tsptr, |
|
1407 |
offsetof(trap_state, tnpc)); |
|
1408 |
} |
|
1393 | 1409 |
break; |
1394 | 1410 |
case 2: // tstate |
1395 |
gen_op_rdtstate(); |
|
1411 |
{ |
|
1412 |
TCGv r_tsptr; |
|
1413 |
|
|
1414 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
1415 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
1416 |
offsetof(CPUState, tsptr)); |
|
1417 |
tcg_gen_ld_tl(cpu_T[0], r_tsptr, |
|
1418 |
offsetof(trap_state, tstate)); |
|
1419 |
} |
|
1396 | 1420 |
break; |
1397 | 1421 |
case 3: // tt |
1398 |
gen_op_rdtt(); |
|
1422 |
{ |
|
1423 |
TCGv r_tsptr; |
|
1424 |
|
|
1425 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
1426 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
1427 |
offsetof(CPUState, tsptr)); |
|
1428 |
tcg_gen_ld_i32(cpu_T[0], r_tsptr, |
|
1429 |
offsetof(trap_state, tt)); |
|
1430 |
} |
|
1399 | 1431 |
break; |
1400 | 1432 |
case 4: // tick |
1401 | 1433 |
{ |
... | ... | |
2536 | 2568 |
#ifdef TARGET_SPARC64 |
2537 | 2569 |
switch (rd) { |
2538 | 2570 |
case 0: // tpc |
2539 |
gen_op_wrtpc(); |
|
2571 |
{ |
|
2572 |
TCGv r_tsptr; |
|
2573 |
|
|
2574 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
2575 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
2576 |
offsetof(CPUState, tsptr)); |
|
2577 |
tcg_gen_st_tl(cpu_T[0], r_tsptr, |
|
2578 |
offsetof(trap_state, tpc)); |
|
2579 |
} |
|
2540 | 2580 |
break; |
2541 | 2581 |
case 1: // tnpc |
2542 |
gen_op_wrtnpc(); |
|
2582 |
{ |
|
2583 |
TCGv r_tsptr; |
|
2584 |
|
|
2585 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
2586 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
2587 |
offsetof(CPUState, tsptr)); |
|
2588 |
tcg_gen_st_tl(cpu_T[0], r_tsptr, |
|
2589 |
offsetof(trap_state, tnpc)); |
|
2590 |
} |
|
2543 | 2591 |
break; |
2544 | 2592 |
case 2: // tstate |
2545 |
gen_op_wrtstate(); |
|
2593 |
{ |
|
2594 |
TCGv r_tsptr; |
|
2595 |
|
|
2596 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
2597 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
2598 |
offsetof(CPUState, tsptr)); |
|
2599 |
tcg_gen_st_tl(cpu_T[0], r_tsptr, |
|
2600 |
offsetof(trap_state, tstate)); |
|
2601 |
} |
|
2546 | 2602 |
break; |
2547 | 2603 |
case 3: // tt |
2548 |
gen_op_wrtt(); |
|
2604 |
{ |
|
2605 |
TCGv r_tsptr; |
|
2606 |
|
|
2607 |
r_tsptr = tcg_temp_new(TCG_TYPE_PTR); |
|
2608 |
tcg_gen_ld_ptr(r_tsptr, cpu_env, |
|
2609 |
offsetof(CPUState, tsptr)); |
|
2610 |
tcg_gen_st_i32(cpu_T[0], r_tsptr, |
|
2611 |
offsetof(trap_state, tt)); |
|
2612 |
} |
|
2549 | 2613 |
break; |
2550 | 2614 |
case 4: // tick |
2551 | 2615 |
{ |
... | ... | |
3921 | 3985 |
env->pstate = PS_PRIV; |
3922 | 3986 |
env->hpstate = HS_PRIV; |
3923 | 3987 |
env->pc = 0x1fff0000000ULL; |
3988 |
env->tsptr = &env->ts[env->tl]; |
|
3924 | 3989 |
#else |
3925 | 3990 |
env->pc = 0; |
3926 | 3991 |
env->mmuregs[0] &= ~(MMU_E | MMU_NF); |
Also available in: Unified diff