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 | ... | ... |