Commit 64adab3fcbab7cd3a1d7fff327640f8128de6e86
1 parent
e2eb2798
target-ppc: convert exceptions generation to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5772 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
8 changed files
with
76 additions
and
66 deletions
cpu-exec.c
| ... | ... | @@ -918,7 +918,7 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address, |
| 918 | 918 | /* we restore the process signal mask as the sigreturn should |
| 919 | 919 | do it (XXX: use sigsetjmp) */ |
| 920 | 920 | sigprocmask(SIG_SETMASK, old_set, NULL); |
| 921 | - do_raise_exception_err(env->exception_index, env->error_code); | |
| 921 | + raise_exception_err(env, env->exception_index, env->error_code); | |
| 922 | 922 | } else { |
| 923 | 923 | /* activate soft MMU for this block */ |
| 924 | 924 | cpu_resume_from_signal(env, puc); | ... | ... |
target-ppc/exec.h
| ... | ... | @@ -94,8 +94,8 @@ static always_inline target_ulong rotl64 (target_ulong i, int n) |
| 94 | 94 | #include "softmmu_exec.h" |
| 95 | 95 | #endif /* !defined(CONFIG_USER_ONLY) */ |
| 96 | 96 | |
| 97 | -void do_raise_exception_err (uint32_t exception, int error_code); | |
| 98 | -void do_raise_exception (uint32_t exception); | |
| 97 | +void raise_exception_err (CPUState *env, int exception, int error_code); | |
| 98 | +void raise_exception (CPUState *env, int exception); | |
| 99 | 99 | |
| 100 | 100 | int get_physical_address (CPUState *env, mmu_ctx_t *ctx, target_ulong vaddr, |
| 101 | 101 | int rw, int access_type); | ... | ... |
target-ppc/helper.c
| ... | ... | @@ -40,6 +40,24 @@ |
| 40 | 40 | //#define FLUSH_ALL_TLBS |
| 41 | 41 | |
| 42 | 42 | /*****************************************************************************/ |
| 43 | +/* Exceptions processing */ | |
| 44 | + | |
| 45 | +void raise_exception_err (CPUState *env, int exception, int error_code) | |
| 46 | +{ | |
| 47 | +#if 0 | |
| 48 | + printf("Raise exception %3x code : %d\n", exception, error_code); | |
| 49 | +#endif | |
| 50 | + env->exception_index = exception; | |
| 51 | + env->error_code = error_code; | |
| 52 | + cpu_loop_exit(); | |
| 53 | +} | |
| 54 | + | |
| 55 | +void raise_exception (CPUState *env, int exception) | |
| 56 | +{ | |
| 57 | + helper_raise_exception_err(exception, 0); | |
| 58 | +} | |
| 59 | + | |
| 60 | +/*****************************************************************************/ | |
| 43 | 61 | /* PowerPC MMU emulation */ |
| 44 | 62 | |
| 45 | 63 | #if defined(CONFIG_USER_ONLY) | ... | ... |
target-ppc/helper.h
target-ppc/op.c
| ... | ... | @@ -26,17 +26,6 @@ |
| 26 | 26 | #include "helper_regs.h" |
| 27 | 27 | #include "op_helper.h" |
| 28 | 28 | |
| 29 | -/* Generate exceptions */ | |
| 30 | -void OPPROTO op_raise_exception_err (void) | |
| 31 | -{ | |
| 32 | - do_raise_exception_err(PARAM1, PARAM2); | |
| 33 | -} | |
| 34 | - | |
| 35 | -void OPPROTO op_debug (void) | |
| 36 | -{ | |
| 37 | - do_raise_exception(EXCP_DEBUG); | |
| 38 | -} | |
| 39 | - | |
| 40 | 29 | #if !defined(CONFIG_USER_ONLY) |
| 41 | 30 | /* Segment registers load and store */ |
| 42 | 31 | void OPPROTO op_load_sr (void) | ... | ... |
target-ppc/op_helper.c
| ... | ... | @@ -46,21 +46,17 @@ |
| 46 | 46 | /*****************************************************************************/ |
| 47 | 47 | /* Exceptions processing helpers */ |
| 48 | 48 | |
| 49 | -void do_raise_exception_err (uint32_t exception, int error_code) | |
| 49 | +void helper_raise_exception_err (uint32_t exception, uint32_t error_code) | |
| 50 | 50 | { |
| 51 | -#if 0 | |
| 52 | - printf("Raise exception %3x code : %d\n", exception, error_code); | |
| 53 | -#endif | |
| 54 | - env->exception_index = exception; | |
| 55 | - env->error_code = error_code; | |
| 56 | - cpu_loop_exit(); | |
| 51 | + raise_exception_err(env, exception, error_code); | |
| 57 | 52 | } |
| 58 | 53 | |
| 59 | -void do_raise_exception (uint32_t exception) | |
| 54 | +void helper_raise_debug (void) | |
| 60 | 55 | { |
| 61 | - do_raise_exception_err(exception, 0); | |
| 56 | + raise_exception(env, EXCP_DEBUG); | |
| 62 | 57 | } |
| 63 | 58 | |
| 59 | + | |
| 64 | 60 | /*****************************************************************************/ |
| 65 | 61 | /* Registers load and stores */ |
| 66 | 62 | target_ulong helper_load_cr (void) |
| ... | ... | @@ -430,7 +426,7 @@ static always_inline uint64_t fload_invalid_op_excp (int op) |
| 430 | 426 | /* Update the floating-point enabled exception summary */ |
| 431 | 427 | env->fpscr |= 1 << FPSCR_FEX; |
| 432 | 428 | if (msr_fe0 != 0 || msr_fe1 != 0) |
| 433 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, POWERPC_EXCP_FP | op); | |
| 429 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, POWERPC_EXCP_FP | op); | |
| 434 | 430 | } |
| 435 | 431 | return ret; |
| 436 | 432 | } |
| ... | ... | @@ -445,8 +441,8 @@ static always_inline uint64_t float_zero_divide_excp (uint64_t arg1, uint64_t ar |
| 445 | 441 | /* Update the floating-point enabled exception summary */ |
| 446 | 442 | env->fpscr |= 1 << FPSCR_FEX; |
| 447 | 443 | if (msr_fe0 != 0 || msr_fe1 != 0) { |
| 448 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, | |
| 449 | - POWERPC_EXCP_FP | POWERPC_EXCP_FP_ZX); | |
| 444 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, | |
| 445 | + POWERPC_EXCP_FP | POWERPC_EXCP_FP_ZX); | |
| 450 | 446 | } |
| 451 | 447 | } else { |
| 452 | 448 | /* Set the result to infinity */ |
| ... | ... | @@ -686,7 +682,7 @@ void helper_float_check_status (void) |
| 686 | 682 | (env->error_code & POWERPC_EXCP_FP)) { |
| 687 | 683 | /* Differred floating-point exception after target FPR update */ |
| 688 | 684 | if (msr_fe0 != 0 || msr_fe1 != 0) |
| 689 | - do_raise_exception_err(env->exception_index, env->error_code); | |
| 685 | + raise_exception_err(env, env->exception_index, env->error_code); | |
| 690 | 686 | } else if (env->fp_status.float_exception_flags & float_flag_overflow) { |
| 691 | 687 | float_overflow_excp(); |
| 692 | 688 | } else if (env->fp_status.float_exception_flags & float_flag_underflow) { |
| ... | ... | @@ -699,7 +695,7 @@ void helper_float_check_status (void) |
| 699 | 695 | (env->error_code & POWERPC_EXCP_FP)) { |
| 700 | 696 | /* Differred floating-point exception after target FPR update */ |
| 701 | 697 | if (msr_fe0 != 0 || msr_fe1 != 0) |
| 702 | - do_raise_exception_err(env->exception_index, env->error_code); | |
| 698 | + raise_exception_err(env, env->exception_index, env->error_code); | |
| 703 | 699 | } |
| 704 | 700 | RETURN(); |
| 705 | 701 | #endif |
| ... | ... | @@ -1356,7 +1352,7 @@ void do_store_msr (void) |
| 1356 | 1352 | T0 = hreg_store_msr(env, T0, 0); |
| 1357 | 1353 | if (T0 != 0) { |
| 1358 | 1354 | env->interrupt_request |= CPU_INTERRUPT_EXITTB; |
| 1359 | - do_raise_exception(T0); | |
| 1355 | + raise_exception(env, T0); | |
| 1360 | 1356 | } |
| 1361 | 1357 | } |
| 1362 | 1358 | |
| ... | ... | @@ -1417,7 +1413,7 @@ void do_tw (int flags) |
| 1417 | 1413 | ((int32_t)T0 == (int32_t)T1 && (flags & 0x04)) || |
| 1418 | 1414 | ((uint32_t)T0 < (uint32_t)T1 && (flags & 0x02)) || |
| 1419 | 1415 | ((uint32_t)T0 > (uint32_t)T1 && (flags & 0x01))))) { |
| 1420 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP); | |
| 1416 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP); | |
| 1421 | 1417 | } |
| 1422 | 1418 | } |
| 1423 | 1419 | |
| ... | ... | @@ -1429,7 +1425,7 @@ void do_td (int flags) |
| 1429 | 1425 | ((int64_t)T0 == (int64_t)T1 && (flags & 0x04)) || |
| 1430 | 1426 | ((uint64_t)T0 < (uint64_t)T1 && (flags & 0x02)) || |
| 1431 | 1427 | ((uint64_t)T0 > (uint64_t)T1 && (flags & 0x01))))) |
| 1432 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP); | |
| 1428 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP); | |
| 1433 | 1429 | } |
| 1434 | 1430 | #endif |
| 1435 | 1431 | |
| ... | ... | @@ -1670,14 +1666,14 @@ void do_load_dcr (void) |
| 1670 | 1666 | if (loglevel != 0) { |
| 1671 | 1667 | fprintf(logfile, "No DCR environment\n"); |
| 1672 | 1668 | } |
| 1673 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, | |
| 1674 | - POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL); | |
| 1669 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, | |
| 1670 | + POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL); | |
| 1675 | 1671 | } else if (unlikely(ppc_dcr_read(env->dcr_env, T0, &val) != 0)) { |
| 1676 | 1672 | if (loglevel != 0) { |
| 1677 | 1673 | fprintf(logfile, "DCR read error %d %03x\n", (int)T0, (int)T0); |
| 1678 | 1674 | } |
| 1679 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, | |
| 1680 | - POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); | |
| 1675 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, | |
| 1676 | + POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); | |
| 1681 | 1677 | } else { |
| 1682 | 1678 | T0 = val; |
| 1683 | 1679 | } |
| ... | ... | @@ -1689,14 +1685,14 @@ void do_store_dcr (void) |
| 1689 | 1685 | if (loglevel != 0) { |
| 1690 | 1686 | fprintf(logfile, "No DCR environment\n"); |
| 1691 | 1687 | } |
| 1692 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, | |
| 1693 | - POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL); | |
| 1688 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, | |
| 1689 | + POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL); | |
| 1694 | 1690 | } else if (unlikely(ppc_dcr_write(env->dcr_env, T0, T1) != 0)) { |
| 1695 | 1691 | if (loglevel != 0) { |
| 1696 | 1692 | fprintf(logfile, "DCR write error %d %03x\n", (int)T0, (int)T0); |
| 1697 | 1693 | } |
| 1698 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, | |
| 1699 | - POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); | |
| 1694 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, | |
| 1695 | + POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); | |
| 1700 | 1696 | } |
| 1701 | 1697 | } |
| 1702 | 1698 | |
| ... | ... | @@ -2454,7 +2450,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) |
| 2454 | 2450 | cpu_restore_state(tb, env, pc, NULL); |
| 2455 | 2451 | } |
| 2456 | 2452 | } |
| 2457 | - do_raise_exception_err(env->exception_index, env->error_code); | |
| 2453 | + raise_exception_err(env, env->exception_index, env->error_code); | |
| 2458 | 2454 | } |
| 2459 | 2455 | env = saved_env; |
| 2460 | 2456 | } | ... | ... |
target-ppc/op_mem.h
| ... | ... | @@ -103,9 +103,9 @@ void OPPROTO glue(op_lswx, MEMSUFFIX) (void) |
| 103 | 103 | if (likely(T1 != 0)) { |
| 104 | 104 | if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) || |
| 105 | 105 | (PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) { |
| 106 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, | |
| 107 | - POWERPC_EXCP_INVAL | | |
| 108 | - POWERPC_EXCP_INVAL_LSWX); | |
| 106 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, | |
| 107 | + POWERPC_EXCP_INVAL | | |
| 108 | + POWERPC_EXCP_INVAL_LSWX); | |
| 109 | 109 | } else { |
| 110 | 110 | glue(do_lsw, MEMSUFFIX)(PARAM1); |
| 111 | 111 | } |
| ... | ... | @@ -120,9 +120,9 @@ void OPPROTO glue(op_lswx_64, MEMSUFFIX) (void) |
| 120 | 120 | if (likely(T1 != 0)) { |
| 121 | 121 | if (unlikely((PARAM1 < PARAM2 && (PARAM1 + T1) > PARAM2) || |
| 122 | 122 | (PARAM1 < PARAM3 && (PARAM1 + T1) > PARAM3))) { |
| 123 | - do_raise_exception_err(POWERPC_EXCP_PROGRAM, | |
| 124 | - POWERPC_EXCP_INVAL | | |
| 125 | - POWERPC_EXCP_INVAL_LSWX); | |
| 123 | + raise_exception_err(env, POWERPC_EXCP_PROGRAM, | |
| 124 | + POWERPC_EXCP_INVAL | | |
| 125 | + POWERPC_EXCP_INVAL_LSWX); | |
| 126 | 126 | } else { |
| 127 | 127 | glue(do_lsw_64, MEMSUFFIX)(PARAM1); |
| 128 | 128 | } |
| ... | ... | @@ -282,7 +282,7 @@ PPC_LDF_OP_64(fs_le, ldfsr); |
| 282 | 282 | void OPPROTO glue(op_lwarx, MEMSUFFIX) (void) |
| 283 | 283 | { |
| 284 | 284 | if (unlikely(T0 & 0x03)) { |
| 285 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 285 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 286 | 286 | } else { |
| 287 | 287 | T1 = glue(ldu32, MEMSUFFIX)((uint32_t)T0); |
| 288 | 288 | env->reserve = (uint32_t)T0; |
| ... | ... | @@ -294,7 +294,7 @@ void OPPROTO glue(op_lwarx, MEMSUFFIX) (void) |
| 294 | 294 | void OPPROTO glue(op_lwarx_64, MEMSUFFIX) (void) |
| 295 | 295 | { |
| 296 | 296 | if (unlikely(T0 & 0x03)) { |
| 297 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 297 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 298 | 298 | } else { |
| 299 | 299 | T1 = glue(ldu32, MEMSUFFIX)((uint64_t)T0); |
| 300 | 300 | env->reserve = (uint64_t)T0; |
| ... | ... | @@ -305,7 +305,7 @@ void OPPROTO glue(op_lwarx_64, MEMSUFFIX) (void) |
| 305 | 305 | void OPPROTO glue(op_ldarx, MEMSUFFIX) (void) |
| 306 | 306 | { |
| 307 | 307 | if (unlikely(T0 & 0x03)) { |
| 308 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 308 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 309 | 309 | } else { |
| 310 | 310 | T1 = glue(ldu64, MEMSUFFIX)((uint32_t)T0); |
| 311 | 311 | env->reserve = (uint32_t)T0; |
| ... | ... | @@ -316,7 +316,7 @@ void OPPROTO glue(op_ldarx, MEMSUFFIX) (void) |
| 316 | 316 | void OPPROTO glue(op_ldarx_64, MEMSUFFIX) (void) |
| 317 | 317 | { |
| 318 | 318 | if (unlikely(T0 & 0x03)) { |
| 319 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 319 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 320 | 320 | } else { |
| 321 | 321 | T1 = glue(ldu64, MEMSUFFIX)((uint64_t)T0); |
| 322 | 322 | env->reserve = (uint64_t)T0; |
| ... | ... | @@ -328,7 +328,7 @@ void OPPROTO glue(op_ldarx_64, MEMSUFFIX) (void) |
| 328 | 328 | void OPPROTO glue(op_lwarx_le, MEMSUFFIX) (void) |
| 329 | 329 | { |
| 330 | 330 | if (unlikely(T0 & 0x03)) { |
| 331 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 331 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 332 | 332 | } else { |
| 333 | 333 | T1 = glue(ldu32r, MEMSUFFIX)((uint32_t)T0); |
| 334 | 334 | env->reserve = (uint32_t)T0; |
| ... | ... | @@ -340,7 +340,7 @@ void OPPROTO glue(op_lwarx_le, MEMSUFFIX) (void) |
| 340 | 340 | void OPPROTO glue(op_lwarx_le_64, MEMSUFFIX) (void) |
| 341 | 341 | { |
| 342 | 342 | if (unlikely(T0 & 0x03)) { |
| 343 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 343 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 344 | 344 | } else { |
| 345 | 345 | T1 = glue(ldu32r, MEMSUFFIX)((uint64_t)T0); |
| 346 | 346 | env->reserve = (uint64_t)T0; |
| ... | ... | @@ -351,7 +351,7 @@ void OPPROTO glue(op_lwarx_le_64, MEMSUFFIX) (void) |
| 351 | 351 | void OPPROTO glue(op_ldarx_le, MEMSUFFIX) (void) |
| 352 | 352 | { |
| 353 | 353 | if (unlikely(T0 & 0x03)) { |
| 354 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 354 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 355 | 355 | } else { |
| 356 | 356 | T1 = glue(ldu64r, MEMSUFFIX)((uint32_t)T0); |
| 357 | 357 | env->reserve = (uint32_t)T0; |
| ... | ... | @@ -362,7 +362,7 @@ void OPPROTO glue(op_ldarx_le, MEMSUFFIX) (void) |
| 362 | 362 | void OPPROTO glue(op_ldarx_le_64, MEMSUFFIX) (void) |
| 363 | 363 | { |
| 364 | 364 | if (unlikely(T0 & 0x03)) { |
| 365 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 365 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 366 | 366 | } else { |
| 367 | 367 | T1 = glue(ldu64r, MEMSUFFIX)((uint64_t)T0); |
| 368 | 368 | env->reserve = (uint64_t)T0; |
| ... | ... | @@ -375,7 +375,7 @@ void OPPROTO glue(op_ldarx_le_64, MEMSUFFIX) (void) |
| 375 | 375 | void OPPROTO glue(op_stwcx, MEMSUFFIX) (void) |
| 376 | 376 | { |
| 377 | 377 | if (unlikely(T0 & 0x03)) { |
| 378 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 378 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 379 | 379 | } else { |
| 380 | 380 | if (unlikely(env->reserve != (uint32_t)T0)) { |
| 381 | 381 | env->crf[0] = xer_so; |
| ... | ... | @@ -392,7 +392,7 @@ void OPPROTO glue(op_stwcx, MEMSUFFIX) (void) |
| 392 | 392 | void OPPROTO glue(op_stwcx_64, MEMSUFFIX) (void) |
| 393 | 393 | { |
| 394 | 394 | if (unlikely(T0 & 0x03)) { |
| 395 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 395 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 396 | 396 | } else { |
| 397 | 397 | if (unlikely(env->reserve != (uint64_t)T0)) { |
| 398 | 398 | env->crf[0] = xer_so; |
| ... | ... | @@ -408,7 +408,7 @@ void OPPROTO glue(op_stwcx_64, MEMSUFFIX) (void) |
| 408 | 408 | void OPPROTO glue(op_stdcx, MEMSUFFIX) (void) |
| 409 | 409 | { |
| 410 | 410 | if (unlikely(T0 & 0x03)) { |
| 411 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 411 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 412 | 412 | } else { |
| 413 | 413 | if (unlikely(env->reserve != (uint32_t)T0)) { |
| 414 | 414 | env->crf[0] = xer_so; |
| ... | ... | @@ -424,7 +424,7 @@ void OPPROTO glue(op_stdcx, MEMSUFFIX) (void) |
| 424 | 424 | void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void) |
| 425 | 425 | { |
| 426 | 426 | if (unlikely(T0 & 0x03)) { |
| 427 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 427 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 428 | 428 | } else { |
| 429 | 429 | if (unlikely(env->reserve != (uint64_t)T0)) { |
| 430 | 430 | env->crf[0] = xer_so; |
| ... | ... | @@ -441,7 +441,7 @@ void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void) |
| 441 | 441 | void OPPROTO glue(op_stwcx_le, MEMSUFFIX) (void) |
| 442 | 442 | { |
| 443 | 443 | if (unlikely(T0 & 0x03)) { |
| 444 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 444 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 445 | 445 | } else { |
| 446 | 446 | if (unlikely(env->reserve != (uint32_t)T0)) { |
| 447 | 447 | env->crf[0] = xer_so; |
| ... | ... | @@ -458,7 +458,7 @@ void OPPROTO glue(op_stwcx_le, MEMSUFFIX) (void) |
| 458 | 458 | void OPPROTO glue(op_stwcx_le_64, MEMSUFFIX) (void) |
| 459 | 459 | { |
| 460 | 460 | if (unlikely(T0 & 0x03)) { |
| 461 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 461 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 462 | 462 | } else { |
| 463 | 463 | if (unlikely(env->reserve != (uint64_t)T0)) { |
| 464 | 464 | env->crf[0] = xer_so; |
| ... | ... | @@ -474,7 +474,7 @@ void OPPROTO glue(op_stwcx_le_64, MEMSUFFIX) (void) |
| 474 | 474 | void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void) |
| 475 | 475 | { |
| 476 | 476 | if (unlikely(T0 & 0x03)) { |
| 477 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 477 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 478 | 478 | } else { |
| 479 | 479 | if (unlikely(env->reserve != (uint32_t)T0)) { |
| 480 | 480 | env->crf[0] = xer_so; |
| ... | ... | @@ -490,7 +490,7 @@ void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void) |
| 490 | 490 | void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) |
| 491 | 491 | { |
| 492 | 492 | if (unlikely(T0 & 0x03)) { |
| 493 | - do_raise_exception(POWERPC_EXCP_ALIGN); | |
| 493 | + raise_exception(env, POWERPC_EXCP_ALIGN); | |
| 494 | 494 | } else { |
| 495 | 495 | if (unlikely(env->reserve != (uint64_t)T0)) { |
| 496 | 496 | env->crf[0] = xer_so; | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -293,10 +293,14 @@ static always_inline void gen_update_nip (DisasContext *ctx, target_ulong nip) |
| 293 | 293 | |
| 294 | 294 | #define GEN_EXCP(ctx, excp, error) \ |
| 295 | 295 | do { \ |
| 296 | + TCGv_i32 t0 = tcg_const_i32(excp); \ | |
| 297 | + TCGv_i32 t1 = tcg_const_i32(error); \ | |
| 296 | 298 | if ((ctx)->exception == POWERPC_EXCP_NONE) { \ |
| 297 | 299 | gen_update_nip(ctx, (ctx)->nip); \ |
| 298 | 300 | } \ |
| 299 | - gen_op_raise_exception_err((excp), (error)); \ | |
| 301 | + gen_helper_raise_exception_err(t0, t1); \ | |
| 302 | + tcg_temp_free_i32(t0); \ | |
| 303 | + tcg_temp_free_i32(t1); \ | |
| 300 | 304 | ctx->exception = (excp); \ |
| 301 | 305 | } while (0) |
| 302 | 306 | |
| ... | ... | @@ -3470,7 +3474,7 @@ static always_inline void gen_goto_tb (DisasContext *ctx, int n, |
| 3470 | 3474 | } |
| 3471 | 3475 | if (ctx->singlestep_enabled & GDBSTUB_SINGLE_STEP) { |
| 3472 | 3476 | gen_update_nip(ctx, dest); |
| 3473 | - gen_op_debug(); | |
| 3477 | + gen_helper_raise_debug(); | |
| 3474 | 3478 | } |
| 3475 | 3479 | } |
| 3476 | 3480 | tcg_gen_exit_tb(0); |
| ... | ... | @@ -7233,7 +7237,7 @@ static always_inline void gen_intermediate_code_internal (CPUState *env, |
| 7233 | 7237 | for (bp = env->breakpoints; bp != NULL; bp = bp->next) { |
| 7234 | 7238 | if (bp->pc == ctx.nip) { |
| 7235 | 7239 | gen_update_nip(&ctx, ctx.nip); |
| 7236 | - gen_op_debug(); | |
| 7240 | + gen_helper_raise_debug(); | |
| 7237 | 7241 | break; |
| 7238 | 7242 | } |
| 7239 | 7243 | } |
| ... | ... | @@ -7344,7 +7348,7 @@ static always_inline void gen_intermediate_code_internal (CPUState *env, |
| 7344 | 7348 | } else if (ctx.exception != POWERPC_EXCP_BRANCH) { |
| 7345 | 7349 | if (unlikely(env->singlestep_enabled)) { |
| 7346 | 7350 | gen_update_nip(&ctx, ctx.nip); |
| 7347 | - gen_op_debug(); | |
| 7351 | + gen_helper_raise_debug(); | |
| 7348 | 7352 | } |
| 7349 | 7353 | /* Generate the return instruction */ |
| 7350 | 7354 | tcg_gen_exit_tb(0); | ... | ... |