Commit 06dca6a7c1acd2301cbf5fe06d6cda2833c958be
1 parent
6527f6ea
target-ppc: convert dcr load/store to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5893 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
33 additions
and
43 deletions
target-ppc/helper.h
target-ppc/op.c
| ... | ... | @@ -349,18 +349,6 @@ void OPPROTO op_POWER_mfsri (void) |
| 349 | 349 | #endif |
| 350 | 350 | |
| 351 | 351 | /* PowerPC 4xx specific micro-ops */ |
| 352 | -void OPPROTO op_load_dcr (void) | |
| 353 | -{ | |
| 354 | - do_load_dcr(); | |
| 355 | - RETURN(); | |
| 356 | -} | |
| 357 | - | |
| 358 | -void OPPROTO op_store_dcr (void) | |
| 359 | -{ | |
| 360 | - do_store_dcr(); | |
| 361 | - RETURN(); | |
| 362 | -} | |
| 363 | - | |
| 364 | 352 | #if !defined(CONFIG_USER_ONLY) |
| 365 | 353 | void OPPROTO op_440_tlbre (void) |
| 366 | 354 | { | ... | ... |
target-ppc/op_helper.c
| ... | ... | @@ -1756,9 +1756,9 @@ target_ulong helper_602_mfrom (target_ulong arg) |
| 1756 | 1756 | /* Embedded PowerPC specific helpers */ |
| 1757 | 1757 | |
| 1758 | 1758 | /* XXX: to be improved to check access rights when in user-mode */ |
| 1759 | -void do_load_dcr (void) | |
| 1759 | +target_ulong helper_load_dcr (target_ulong dcrn) | |
| 1760 | 1760 | { |
| 1761 | - target_ulong val; | |
| 1761 | + target_ulong val = 0; | |
| 1762 | 1762 | |
| 1763 | 1763 | if (unlikely(env->dcr_env == NULL)) { |
| 1764 | 1764 | if (loglevel != 0) { |
| ... | ... | @@ -1766,18 +1766,17 @@ void do_load_dcr (void) |
| 1766 | 1766 | } |
| 1767 | 1767 | raise_exception_err(env, POWERPC_EXCP_PROGRAM, |
| 1768 | 1768 | POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL); |
| 1769 | - } else if (unlikely(ppc_dcr_read(env->dcr_env, T0, &val) != 0)) { | |
| 1769 | + } else if (unlikely(ppc_dcr_read(env->dcr_env, dcrn, &val) != 0)) { | |
| 1770 | 1770 | if (loglevel != 0) { |
| 1771 | 1771 | fprintf(logfile, "DCR read error %d %03x\n", (int)T0, (int)T0); |
| 1772 | 1772 | } |
| 1773 | 1773 | raise_exception_err(env, POWERPC_EXCP_PROGRAM, |
| 1774 | 1774 | POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG); |
| 1775 | - } else { | |
| 1776 | - T0 = val; | |
| 1777 | 1775 | } |
| 1776 | + return val; | |
| 1778 | 1777 | } |
| 1779 | 1778 | |
| 1780 | -void do_store_dcr (void) | |
| 1779 | +void helper_store_dcr (target_ulong dcrn, target_ulong val) | |
| 1781 | 1780 | { |
| 1782 | 1781 | if (unlikely(env->dcr_env == NULL)) { |
| 1783 | 1782 | if (loglevel != 0) { |
| ... | ... | @@ -1785,7 +1784,7 @@ void do_store_dcr (void) |
| 1785 | 1784 | } |
| 1786 | 1785 | raise_exception_err(env, POWERPC_EXCP_PROGRAM, |
| 1787 | 1786 | POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL); |
| 1788 | - } else if (unlikely(ppc_dcr_write(env->dcr_env, T0, T1) != 0)) { | |
| 1787 | + } else if (unlikely(ppc_dcr_write(env->dcr_env, dcrn, val) != 0)) { | |
| 1789 | 1788 | if (loglevel != 0) { |
| 1790 | 1789 | fprintf(logfile, "DCR write error %d %03x\n", (int)T0, (int)T0); |
| 1791 | 1790 | } | ... | ... |
target-ppc/op_helper.h
target-ppc/translate.c
| ... | ... | @@ -5625,15 +5625,16 @@ GEN_HANDLER(mfdcr, 0x1F, 0x03, 0x0A, 0x00000001, PPC_DCR) |
| 5625 | 5625 | #if defined(CONFIG_USER_ONLY) |
| 5626 | 5626 | GEN_EXCP_PRIVREG(ctx); |
| 5627 | 5627 | #else |
| 5628 | - uint32_t dcrn = SPR(ctx->opcode); | |
| 5629 | - | |
| 5628 | + TCGv dcrn; | |
| 5630 | 5629 | if (unlikely(!ctx->supervisor)) { |
| 5631 | 5630 | GEN_EXCP_PRIVREG(ctx); |
| 5632 | 5631 | return; |
| 5633 | 5632 | } |
| 5634 | - tcg_gen_movi_tl(cpu_T[0], dcrn); | |
| 5635 | - gen_op_load_dcr(); | |
| 5636 | - tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); | |
| 5633 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 5634 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 5635 | + dcrn = tcg_const_tl(SPR(ctx->opcode)); | |
| 5636 | + gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], dcrn); | |
| 5637 | + tcg_temp_free(dcrn); | |
| 5637 | 5638 | #endif |
| 5638 | 5639 | } |
| 5639 | 5640 | |
| ... | ... | @@ -5643,15 +5644,16 @@ GEN_HANDLER(mtdcr, 0x1F, 0x03, 0x0E, 0x00000001, PPC_DCR) |
| 5643 | 5644 | #if defined(CONFIG_USER_ONLY) |
| 5644 | 5645 | GEN_EXCP_PRIVREG(ctx); |
| 5645 | 5646 | #else |
| 5646 | - uint32_t dcrn = SPR(ctx->opcode); | |
| 5647 | - | |
| 5647 | + TCGv dcrn; | |
| 5648 | 5648 | if (unlikely(!ctx->supervisor)) { |
| 5649 | 5649 | GEN_EXCP_PRIVREG(ctx); |
| 5650 | 5650 | return; |
| 5651 | 5651 | } |
| 5652 | - tcg_gen_movi_tl(cpu_T[0], dcrn); | |
| 5653 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rS(ctx->opcode)]); | |
| 5654 | - gen_op_store_dcr(); | |
| 5652 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 5653 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 5654 | + dcrn = tcg_const_tl(SPR(ctx->opcode)); | |
| 5655 | + gen_helper_store_dcr(dcrn, cpu_gpr[rS(ctx->opcode)]); | |
| 5656 | + tcg_temp_free(dcrn); | |
| 5655 | 5657 | #endif |
| 5656 | 5658 | } |
| 5657 | 5659 | |
| ... | ... | @@ -5666,9 +5668,9 @@ GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000000, PPC_DCRX) |
| 5666 | 5668 | GEN_EXCP_PRIVREG(ctx); |
| 5667 | 5669 | return; |
| 5668 | 5670 | } |
| 5669 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); | |
| 5670 | - gen_op_load_dcr(); | |
| 5671 | - tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); | |
| 5671 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 5672 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 5673 | + gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]); | |
| 5672 | 5674 | /* Note: Rc update flag set leads to undefined state of Rc0 */ |
| 5673 | 5675 | #endif |
| 5674 | 5676 | } |
| ... | ... | @@ -5684,9 +5686,9 @@ GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000000, PPC_DCRX) |
| 5684 | 5686 | GEN_EXCP_PRIVREG(ctx); |
| 5685 | 5687 | return; |
| 5686 | 5688 | } |
| 5687 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); | |
| 5688 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rS(ctx->opcode)]); | |
| 5689 | - gen_op_store_dcr(); | |
| 5689 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 5690 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 5691 | + gen_helper_store_dcr(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]); | |
| 5690 | 5692 | /* Note: Rc update flag set leads to undefined state of Rc0 */ |
| 5691 | 5693 | #endif |
| 5692 | 5694 | } |
| ... | ... | @@ -5694,18 +5696,18 @@ GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000000, PPC_DCRX) |
| 5694 | 5696 | /* mfdcrux (PPC 460) : user-mode access to DCR */ |
| 5695 | 5697 | GEN_HANDLER(mfdcrux, 0x1F, 0x03, 0x09, 0x00000000, PPC_DCRUX) |
| 5696 | 5698 | { |
| 5697 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); | |
| 5698 | - gen_op_load_dcr(); | |
| 5699 | - tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]); | |
| 5699 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 5700 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 5701 | + gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]); | |
| 5700 | 5702 | /* Note: Rc update flag set leads to undefined state of Rc0 */ |
| 5701 | 5703 | } |
| 5702 | 5704 | |
| 5703 | 5705 | /* mtdcrux (PPC 460) : user-mode access to DCR */ |
| 5704 | 5706 | GEN_HANDLER(mtdcrux, 0x1F, 0x03, 0x0D, 0x00000000, PPC_DCRUX) |
| 5705 | 5707 | { |
| 5706 | - tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]); | |
| 5707 | - tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rS(ctx->opcode)]); | |
| 5708 | - gen_op_store_dcr(); | |
| 5708 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 5709 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 5710 | + gen_helper_store_dcr(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]); | |
| 5709 | 5711 | /* Note: Rc update flag set leads to undefined state of Rc0 */ |
| 5710 | 5712 | } |
| 5711 | 5713 | ... | ... |