diff options
author | Richard Henderson <rth@twiddle.net> | 2011-05-20 14:04:57 -0700 |
---|---|---|
committer | Richard Henderson <rth@anchor.twiddle.net> | 2011-05-31 10:18:05 -0700 |
commit | 07b6c13b09d2e00a95e83fa76630d7c0d16c10b3 (patch) | |
tree | 06ad245067f6dcf104d0b59a7f1ceb2b8695123b /target-alpha | |
parent | b758aca1f6cdb175634812b79f5560c36c902d00 (diff) | |
download | qemu-07b6c13b09d2e00a95e83fa76630d7c0d16c10b3.zip qemu-07b6c13b09d2e00a95e83fa76630d7c0d16c10b3.tar.gz qemu-07b6c13b09d2e00a95e83fa76630d7c0d16c10b3.tar.bz2 |
target-alpha: Tidy exception constants.
There's no need to attempt to match EXCP_* values with PALcode entry
point offsets. Instead, compress all the values to make for more
efficient switch statements within QEMU.
We will be doing TLB fill within QEMU proper, not within the PALcode,
so all of the ITB/DTB miss, double fault, and access exceptions can
be compressed to EXCP_MMFAULT.
Compress all of the EXCP_CALL_PAL exceptions into one.
Use env->error_code to store the specific entry point.
Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'target-alpha')
-rw-r--r-- | target-alpha/cpu.h | 34 | ||||
-rw-r--r-- | target-alpha/helper.c | 5 | ||||
-rw-r--r-- | target-alpha/translate.c | 4 |
3 files changed, 17 insertions, 26 deletions
diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h index be7d151..01e3741 100644 --- a/target-alpha/cpu.h +++ b/target-alpha/cpu.h @@ -289,26 +289,20 @@ enum { }; enum { - EXCP_RESET = 0x0000, - EXCP_MCHK = 0x0020, - EXCP_ARITH = 0x0060, - EXCP_HW_INTERRUPT = 0x00E0, - EXCP_DFAULT = 0x01E0, - EXCP_DTB_MISS_PAL = 0x09E0, - EXCP_ITB_MISS = 0x03E0, - EXCP_ITB_ACV = 0x07E0, - EXCP_DTB_MISS_NATIVE = 0x08E0, - EXCP_UNALIGN = 0x11E0, - EXCP_OPCDEC = 0x13E0, - EXCP_FEN = 0x17E0, - EXCP_CALL_PAL = 0x2000, - EXCP_CALL_PALP = 0x3000, - EXCP_CALL_PALE = 0x4000, - /* Pseudo exception for console */ - EXCP_CONSOLE_DISPATCH = 0x4001, - EXCP_CONSOLE_FIXUP = 0x4002, - EXCP_STL_C = 0x4003, - EXCP_STQ_C = 0x4004, + EXCP_RESET, + EXCP_MCHK, + EXCP_SMP_INTERRUPT, + EXCP_CLK_INTERRUPT, + EXCP_DEV_INTERRUPT, + EXCP_MMFAULT, + EXCP_UNALIGN, + EXCP_OPCDEC, + EXCP_ARITH, + EXCP_FEN, + EXCP_CALL_PAL, + /* For Usermode emulation. */ + EXCP_STL_C, + EXCP_STQ_C, }; /* Arithmetic exception */ diff --git a/target-alpha/helper.c b/target-alpha/helper.c index 5c3263b..c5479fd 100644 --- a/target-alpha/helper.c +++ b/target-alpha/helper.c @@ -164,10 +164,7 @@ void cpu_alpha_store_fpcr (CPUState *env, uint64_t val) int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw, int mmu_idx, int is_softmmu) { - if (rw == 2) - env->exception_index = EXCP_ITB_MISS; - else - env->exception_index = EXCP_DFAULT; + env->exception_index = EXCP_MMFAULT; env->trap_arg0 = address; return 1; } diff --git a/target-alpha/translate.c b/target-alpha/translate.c index fe0ae96..5f40d34 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -1516,7 +1516,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) #endif if (palcode >= 0x80 && palcode < 0xC0) { /* Unprivileged PAL call */ - ret = gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x3F) << 6), 0); + ret = gen_excp(ctx, EXCP_CALL_PAL, palcode & 0xBF); break; } #ifndef CONFIG_USER_ONLY @@ -1525,7 +1525,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) if (ctx->mem_idx != MMU_KERNEL_IDX) { goto invalid_opc; } - ret = gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x3F) << 6), 0); + ret = gen_excp(ctx, EXCP_CALL_PAL, palcode & 0x3F); } #endif /* Invalid PAL call */ |