diff options
author | Blue Swirl <blauwirbel@gmail.com> | 2012-05-30 04:23:23 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2012-06-24 01:04:40 +0200 |
commit | e5f17ac633fa7ac7a0936846c505a3c2d2b5687c (patch) | |
tree | 2ada6f3ac30488e425a340599d8a6618d532909e /target-ppc/excp_helper.c | |
parent | ad71ed68117c2a740f82ab297581d7dd8fa21aef (diff) |
ppc: Avoid AREG0 for exception helpers
Add an explicit CPUPPCState parameter instead of relying on AREG0.
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-ppc/excp_helper.c')
-rw-r--r-- | target-ppc/excp_helper.c | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/target-ppc/excp_helper.c b/target-ppc/excp_helper.c index f03f7384cf..c153f4ac92 100644 --- a/target-ppc/excp_helper.c +++ b/target-ppc/excp_helper.c @@ -17,7 +17,6 @@ * License along with this library; if not, see <http://www.gnu.org/licenses/>. */ #include "cpu.h" -#include "dyngen-exec.h" #include "helper.h" #include "helper_regs.h" @@ -28,7 +27,8 @@ /*****************************************************************************/ /* Exceptions processing helpers */ -void helper_raise_exception_err(uint32_t exception, uint32_t error_code) +void helper_raise_exception_err(CPUPPCState *env, uint32_t exception, + uint32_t error_code) { #if 0 printf("Raise exception %3x code : %d\n", exception, error_code); @@ -38,22 +38,22 @@ void helper_raise_exception_err(uint32_t exception, uint32_t error_code) cpu_loop_exit(env); } -void helper_raise_exception(uint32_t exception) +void helper_raise_exception(CPUPPCState *env, uint32_t exception) { - helper_raise_exception_err(exception, 0); + helper_raise_exception_err(env, exception, 0); } #if !defined(CONFIG_USER_ONLY) -void helper_store_msr(target_ulong val) +void helper_store_msr(CPUPPCState *env, target_ulong val) { val = hreg_store_msr(env, val, 0); if (val != 0) { env->interrupt_request |= CPU_INTERRUPT_EXITTB; - helper_raise_exception(val); + helper_raise_exception(env, val); } } -static inline void do_rfi(target_ulong nip, target_ulong msr, +static inline void do_rfi(CPUPPCState *env, target_ulong nip, target_ulong msr, target_ulong msrm, int keep_msrh) { #if defined(TARGET_PPC64) @@ -83,73 +83,77 @@ static inline void do_rfi(target_ulong nip, target_ulong msr, env->interrupt_request |= CPU_INTERRUPT_EXITTB; } -void helper_rfi(void) +void helper_rfi(CPUPPCState *env) { - do_rfi(env->spr[SPR_SRR0], env->spr[SPR_SRR1], + do_rfi(env, env->spr[SPR_SRR0], env->spr[SPR_SRR1], ~((target_ulong)0x783F0000), 1); } #if defined(TARGET_PPC64) -void helper_rfid(void) +void helper_rfid(CPUPPCState *env) { - do_rfi(env->spr[SPR_SRR0], env->spr[SPR_SRR1], + do_rfi(env, env->spr[SPR_SRR0], env->spr[SPR_SRR1], ~((target_ulong)0x783F0000), 0); } -void helper_hrfid(void) +void helper_hrfid(CPUPPCState *env) { - do_rfi(env->spr[SPR_HSRR0], env->spr[SPR_HSRR1], + do_rfi(env, env->spr[SPR_HSRR0], env->spr[SPR_HSRR1], ~((target_ulong)0x783F0000), 0); } #endif /*****************************************************************************/ /* Embedded PowerPC specific helpers */ -void helper_40x_rfci(void) +void helper_40x_rfci(CPUPPCState *env) { - do_rfi(env->spr[SPR_40x_SRR2], env->spr[SPR_40x_SRR3], + do_rfi(env, env->spr[SPR_40x_SRR2], env->spr[SPR_40x_SRR3], ~((target_ulong)0xFFFF0000), 0); } -void helper_rfci(void) +void helper_rfci(CPUPPCState *env) { - do_rfi(env->spr[SPR_BOOKE_CSRR0], SPR_BOOKE_CSRR1, + do_rfi(env, env->spr[SPR_BOOKE_CSRR0], SPR_BOOKE_CSRR1, ~((target_ulong)0x3FFF0000), 0); } -void helper_rfdi(void) +void helper_rfdi(CPUPPCState *env) { - do_rfi(env->spr[SPR_BOOKE_DSRR0], SPR_BOOKE_DSRR1, + do_rfi(env, env->spr[SPR_BOOKE_DSRR0], SPR_BOOKE_DSRR1, ~((target_ulong)0x3FFF0000), 0); } -void helper_rfmci(void) +void helper_rfmci(CPUPPCState *env) { - do_rfi(env->spr[SPR_BOOKE_MCSRR0], SPR_BOOKE_MCSRR1, + do_rfi(env, env->spr[SPR_BOOKE_MCSRR0], SPR_BOOKE_MCSRR1, ~((target_ulong)0x3FFF0000), 0); } #endif -void helper_tw(target_ulong arg1, target_ulong arg2, uint32_t flags) +void helper_tw(CPUPPCState *env, target_ulong arg1, target_ulong arg2, + uint32_t flags) { if (!likely(!(((int32_t)arg1 < (int32_t)arg2 && (flags & 0x10)) || ((int32_t)arg1 > (int32_t)arg2 && (flags & 0x08)) || ((int32_t)arg1 == (int32_t)arg2 && (flags & 0x04)) || ((uint32_t)arg1 < (uint32_t)arg2 && (flags & 0x02)) || ((uint32_t)arg1 > (uint32_t)arg2 && (flags & 0x01))))) { - helper_raise_exception_err(POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP); + helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, + POWERPC_EXCP_TRAP); } } #if defined(TARGET_PPC64) -void helper_td(target_ulong arg1, target_ulong arg2, uint32_t flags) +void helper_td(CPUPPCState *env, target_ulong arg1, target_ulong arg2, + uint32_t flags) { if (!likely(!(((int64_t)arg1 < (int64_t)arg2 && (flags & 0x10)) || ((int64_t)arg1 > (int64_t)arg2 && (flags & 0x08)) || ((int64_t)arg1 == (int64_t)arg2 && (flags & 0x04)) || ((uint64_t)arg1 < (uint64_t)arg2 && (flags & 0x02)) || ((uint64_t)arg1 > (uint64_t)arg2 && (flags & 0x01))))) { - helper_raise_exception_err(POWERPC_EXCP_PROGRAM, POWERPC_EXCP_TRAP); + helper_raise_exception_err(env, POWERPC_EXCP_PROGRAM, + POWERPC_EXCP_TRAP); } } #endif @@ -158,9 +162,9 @@ void helper_td(target_ulong arg1, target_ulong arg2, uint32_t flags) /*****************************************************************************/ /* PowerPC 601 specific instructions (POWER bridge) */ -void helper_rfsvc(void) +void helper_rfsvc(CPUPPCState *env) { - do_rfi(env->lr, env->ctr, 0x0000FFFF, 0); + do_rfi(env, env->lr, env->ctr, 0x0000FFFF, 0); } /* Embedded.Processor Control */ @@ -187,7 +191,7 @@ static int dbell2irq(target_ulong rb) return irq; } -void helper_msgclr(target_ulong rb) +void helper_msgclr(CPUPPCState *env, target_ulong rb) { int irq = dbell2irq(rb); |