Commit 74b9decc473177f16cb84b3504ad8169f13ec147
1 parent
8eba209e
Use MMU globals for some MMU traps
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4918 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
19 additions
and
4 deletions
target-sparc/cpu.h
| @@ -61,12 +61,13 @@ | @@ -61,12 +61,13 @@ | ||
| 61 | #define TT_DIV_ZERO 0x28 | 61 | #define TT_DIV_ZERO 0x28 |
| 62 | #define TT_DFAULT 0x30 | 62 | #define TT_DFAULT 0x30 |
| 63 | #define TT_DATA_ACCESS 0x32 | 63 | #define TT_DATA_ACCESS 0x32 |
| 64 | -#define TT_DPROT 0x33 | ||
| 65 | #define TT_UNALIGNED 0x34 | 64 | #define TT_UNALIGNED 0x34 |
| 66 | #define TT_PRIV_ACT 0x37 | 65 | #define TT_PRIV_ACT 0x37 |
| 67 | #define TT_EXTINT 0x40 | 66 | #define TT_EXTINT 0x40 |
| 67 | +#define TT_IVEC 0x60 | ||
| 68 | #define TT_TMISS 0x64 | 68 | #define TT_TMISS 0x64 |
| 69 | #define TT_DMISS 0x68 | 69 | #define TT_DMISS 0x68 |
| 70 | +#define TT_DPROT 0x6c | ||
| 70 | #define TT_SPILL 0x80 | 71 | #define TT_SPILL 0x80 |
| 71 | #define TT_FILL 0xc0 | 72 | #define TT_FILL 0xc0 |
| 72 | #define TT_WOTHER 0x10 | 73 | #define TT_WOTHER 0x10 |
target-sparc/helper.c
| @@ -758,9 +758,23 @@ void do_interrupt(CPUState *env) | @@ -758,9 +758,23 @@ void do_interrupt(CPUState *env) | ||
| 758 | env->tsptr->tpc = env->pc; | 758 | env->tsptr->tpc = env->pc; |
| 759 | env->tsptr->tnpc = env->npc; | 759 | env->tsptr->tnpc = env->npc; |
| 760 | env->tsptr->tt = intno; | 760 | env->tsptr->tt = intno; |
| 761 | - if (!(env->features & CPU_FEATURE_GL)) | ||
| 762 | - change_pstate(PS_PEF | PS_PRIV | PS_AG); | ||
| 763 | - | 761 | + if (!(env->features & CPU_FEATURE_GL)) { |
| 762 | + switch (intno) { | ||
| 763 | + case TT_IVEC: | ||
| 764 | + change_pstate(PS_PEF | PS_PRIV | PS_IG); | ||
| 765 | + break; | ||
| 766 | + case TT_TFAULT: | ||
| 767 | + case TT_TMISS: | ||
| 768 | + case TT_DFAULT: | ||
| 769 | + case TT_DMISS: | ||
| 770 | + case TT_DPROT: | ||
| 771 | + change_pstate(PS_PEF | PS_PRIV | PS_MG); | ||
| 772 | + break; | ||
| 773 | + default: | ||
| 774 | + change_pstate(PS_PEF | PS_PRIV | PS_AG); | ||
| 775 | + break; | ||
| 776 | + } | ||
| 777 | + } | ||
| 764 | if (intno == TT_CLRWIN) | 778 | if (intno == TT_CLRWIN) |
| 765 | cpu_set_cwp(env, cpu_cwp_dec(env, env->cwp - 1)); | 779 | cpu_set_cwp(env, cpu_cwp_dec(env, env->cwp - 1)); |
| 766 | else if ((intno & 0x1c0) == TT_SPILL) | 780 | else if ((intno & 0x1c0) == TT_SPILL) |