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
This commit is contained in:
parent
6527f6ea9c
commit
06dca6a7c1
@ -181,4 +181,7 @@ DEF_HELPER_2(divo, tl, tl, tl)
|
||||
DEF_HELPER_2(divs, tl, tl, tl)
|
||||
DEF_HELPER_2(divso, tl, tl, tl)
|
||||
|
||||
DEF_HELPER_1(load_dcr, tl, tl);
|
||||
DEF_HELPER_2(store_dcr, void, tl, tl);
|
||||
|
||||
#include "def-helper.h"
|
||||
|
@ -349,18 +349,6 @@ void OPPROTO op_POWER_mfsri (void)
|
||||
#endif
|
||||
|
||||
/* PowerPC 4xx specific micro-ops */
|
||||
void OPPROTO op_load_dcr (void)
|
||||
{
|
||||
do_load_dcr();
|
||||
RETURN();
|
||||
}
|
||||
|
||||
void OPPROTO op_store_dcr (void)
|
||||
{
|
||||
do_store_dcr();
|
||||
RETURN();
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void OPPROTO op_440_tlbre (void)
|
||||
{
|
||||
|
@ -1756,9 +1756,9 @@ target_ulong helper_602_mfrom (target_ulong arg)
|
||||
/* Embedded PowerPC specific helpers */
|
||||
|
||||
/* XXX: to be improved to check access rights when in user-mode */
|
||||
void do_load_dcr (void)
|
||||
target_ulong helper_load_dcr (target_ulong dcrn)
|
||||
{
|
||||
target_ulong val;
|
||||
target_ulong val = 0;
|
||||
|
||||
if (unlikely(env->dcr_env == NULL)) {
|
||||
if (loglevel != 0) {
|
||||
@ -1766,18 +1766,17 @@ void do_load_dcr (void)
|
||||
}
|
||||
raise_exception_err(env, POWERPC_EXCP_PROGRAM,
|
||||
POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL);
|
||||
} else if (unlikely(ppc_dcr_read(env->dcr_env, T0, &val) != 0)) {
|
||||
} else if (unlikely(ppc_dcr_read(env->dcr_env, dcrn, &val) != 0)) {
|
||||
if (loglevel != 0) {
|
||||
fprintf(logfile, "DCR read error %d %03x\n", (int)T0, (int)T0);
|
||||
}
|
||||
raise_exception_err(env, POWERPC_EXCP_PROGRAM,
|
||||
POWERPC_EXCP_INVAL | POWERPC_EXCP_PRIV_REG);
|
||||
} else {
|
||||
T0 = val;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
void do_store_dcr (void)
|
||||
void helper_store_dcr (target_ulong dcrn, target_ulong val)
|
||||
{
|
||||
if (unlikely(env->dcr_env == NULL)) {
|
||||
if (loglevel != 0) {
|
||||
@ -1785,7 +1784,7 @@ void do_store_dcr (void)
|
||||
}
|
||||
raise_exception_err(env, POWERPC_EXCP_PROGRAM,
|
||||
POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL);
|
||||
} else if (unlikely(ppc_dcr_write(env->dcr_env, T0, T1) != 0)) {
|
||||
} else if (unlikely(ppc_dcr_write(env->dcr_env, dcrn, val) != 0)) {
|
||||
if (loglevel != 0) {
|
||||
fprintf(logfile, "DCR write error %d %03x\n", (int)T0, (int)T0);
|
||||
}
|
||||
|
@ -41,8 +41,6 @@ void do_440_tlbwe (int word);
|
||||
#endif
|
||||
|
||||
/* PowerPC 4xx specific helpers */
|
||||
void do_load_dcr (void);
|
||||
void do_store_dcr (void);
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void do_4xx_tlbre_lo (void);
|
||||
void do_4xx_tlbre_hi (void);
|
||||
|
@ -5625,15 +5625,16 @@ GEN_HANDLER(mfdcr, 0x1F, 0x03, 0x0A, 0x00000001, PPC_DCR)
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
GEN_EXCP_PRIVREG(ctx);
|
||||
#else
|
||||
uint32_t dcrn = SPR(ctx->opcode);
|
||||
|
||||
TCGv dcrn;
|
||||
if (unlikely(!ctx->supervisor)) {
|
||||
GEN_EXCP_PRIVREG(ctx);
|
||||
return;
|
||||
}
|
||||
tcg_gen_movi_tl(cpu_T[0], dcrn);
|
||||
gen_op_load_dcr();
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]);
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
dcrn = tcg_const_tl(SPR(ctx->opcode));
|
||||
gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], dcrn);
|
||||
tcg_temp_free(dcrn);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -5643,15 +5644,16 @@ GEN_HANDLER(mtdcr, 0x1F, 0x03, 0x0E, 0x00000001, PPC_DCR)
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
GEN_EXCP_PRIVREG(ctx);
|
||||
#else
|
||||
uint32_t dcrn = SPR(ctx->opcode);
|
||||
|
||||
TCGv dcrn;
|
||||
if (unlikely(!ctx->supervisor)) {
|
||||
GEN_EXCP_PRIVREG(ctx);
|
||||
return;
|
||||
}
|
||||
tcg_gen_movi_tl(cpu_T[0], dcrn);
|
||||
tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rS(ctx->opcode)]);
|
||||
gen_op_store_dcr();
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
dcrn = tcg_const_tl(SPR(ctx->opcode));
|
||||
gen_helper_store_dcr(dcrn, cpu_gpr[rS(ctx->opcode)]);
|
||||
tcg_temp_free(dcrn);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -5666,9 +5668,9 @@ GEN_HANDLER(mfdcrx, 0x1F, 0x03, 0x08, 0x00000000, PPC_DCRX)
|
||||
GEN_EXCP_PRIVREG(ctx);
|
||||
return;
|
||||
}
|
||||
tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]);
|
||||
gen_op_load_dcr();
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]);
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]);
|
||||
/* Note: Rc update flag set leads to undefined state of Rc0 */
|
||||
#endif
|
||||
}
|
||||
@ -5684,9 +5686,9 @@ GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000000, PPC_DCRX)
|
||||
GEN_EXCP_PRIVREG(ctx);
|
||||
return;
|
||||
}
|
||||
tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]);
|
||||
tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rS(ctx->opcode)]);
|
||||
gen_op_store_dcr();
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
gen_helper_store_dcr(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
|
||||
/* Note: Rc update flag set leads to undefined state of Rc0 */
|
||||
#endif
|
||||
}
|
||||
@ -5694,18 +5696,18 @@ GEN_HANDLER(mtdcrx, 0x1F, 0x03, 0x0C, 0x00000000, PPC_DCRX)
|
||||
/* mfdcrux (PPC 460) : user-mode access to DCR */
|
||||
GEN_HANDLER(mfdcrux, 0x1F, 0x03, 0x09, 0x00000000, PPC_DCRUX)
|
||||
{
|
||||
tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]);
|
||||
gen_op_load_dcr();
|
||||
tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_T[0]);
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]);
|
||||
/* Note: Rc update flag set leads to undefined state of Rc0 */
|
||||
}
|
||||
|
||||
/* mtdcrux (PPC 460) : user-mode access to DCR */
|
||||
GEN_HANDLER(mtdcrux, 0x1F, 0x03, 0x0D, 0x00000000, PPC_DCRUX)
|
||||
{
|
||||
tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rA(ctx->opcode)]);
|
||||
tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rS(ctx->opcode)]);
|
||||
gen_op_store_dcr();
|
||||
/* NIP cannot be restored if the memory exception comes from an helper */
|
||||
gen_update_nip(ctx, ctx->nip - 4);
|
||||
gen_helper_store_dcr(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)]);
|
||||
/* Note: Rc update flag set leads to undefined state of Rc0 */
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user