Clean up of some target specifics in exec.c/cpu-exec.c.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2936 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
08ab123c2d
commit
bfed01fc79
69
cpu-exec.c
69
cpu-exec.c
@ -40,14 +40,14 @@ int tb_invalidated_flag;
|
|||||||
//#define DEBUG_EXEC
|
//#define DEBUG_EXEC
|
||||||
//#define DEBUG_SIGNAL
|
//#define DEBUG_SIGNAL
|
||||||
|
|
||||||
#if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_M68K) || \
|
|
||||||
defined(TARGET_ALPHA)
|
|
||||||
/* XXX: unify with i386 target */
|
|
||||||
void cpu_loop_exit(void)
|
void cpu_loop_exit(void)
|
||||||
{
|
{
|
||||||
|
/* NOTE: the register at this point must be saved by hand because
|
||||||
|
longjmp restore them */
|
||||||
|
regs_to_env();
|
||||||
longjmp(env->jmp_env, 1);
|
longjmp(env->jmp_env, 1);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#if !(defined(TARGET_SPARC) || defined(TARGET_SH4) || defined(TARGET_M68K))
|
#if !(defined(TARGET_SPARC) || defined(TARGET_SH4) || defined(TARGET_M68K))
|
||||||
#define reg_T2
|
#define reg_T2
|
||||||
#endif
|
#endif
|
||||||
@ -249,65 +249,8 @@ int cpu_exec(CPUState *env1)
|
|||||||
TranslationBlock *tb;
|
TranslationBlock *tb;
|
||||||
uint8_t *tc_ptr;
|
uint8_t *tc_ptr;
|
||||||
|
|
||||||
#if defined(TARGET_I386)
|
if (cpu_halted(env1) == EXCP_HALTED)
|
||||||
/* handle exit of HALTED state */
|
return EXCP_HALTED;
|
||||||
if (env1->hflags & HF_HALTED_MASK) {
|
|
||||||
/* disable halt condition */
|
|
||||||
if ((env1->interrupt_request & CPU_INTERRUPT_HARD) &&
|
|
||||||
(env1->eflags & IF_MASK)) {
|
|
||||||
env1->hflags &= ~HF_HALTED_MASK;
|
|
||||||
} else {
|
|
||||||
return EXCP_HALTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(TARGET_PPC)
|
|
||||||
if (env1->halted) {
|
|
||||||
if (env1->msr[MSR_EE] &&
|
|
||||||
(env1->interrupt_request & CPU_INTERRUPT_HARD)) {
|
|
||||||
env1->halted = 0;
|
|
||||||
} else {
|
|
||||||
return EXCP_HALTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(TARGET_SPARC)
|
|
||||||
if (env1->halted) {
|
|
||||||
if ((env1->interrupt_request & CPU_INTERRUPT_HARD) &&
|
|
||||||
(env1->psret != 0)) {
|
|
||||||
env1->halted = 0;
|
|
||||||
} else {
|
|
||||||
return EXCP_HALTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(TARGET_ARM)
|
|
||||||
if (env1->halted) {
|
|
||||||
/* An interrupt wakes the CPU even if the I and F CPSR bits are
|
|
||||||
set. We use EXITTB to silently wake CPU without causing an
|
|
||||||
actual interrupt. */
|
|
||||||
if (env1->interrupt_request &
|
|
||||||
(CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD | CPU_INTERRUPT_EXITTB)) {
|
|
||||||
env1->halted = 0;
|
|
||||||
} else {
|
|
||||||
return EXCP_HALTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(TARGET_MIPS)
|
|
||||||
if (env1->halted) {
|
|
||||||
if (env1->interrupt_request &
|
|
||||||
(CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER)) {
|
|
||||||
env1->halted = 0;
|
|
||||||
} else {
|
|
||||||
return EXCP_HALTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(TARGET_ALPHA) || defined(TARGET_M68K)
|
|
||||||
if (env1->halted) {
|
|
||||||
if (env1->interrupt_request & CPU_INTERRUPT_HARD) {
|
|
||||||
env1->halted = 0;
|
|
||||||
} else {
|
|
||||||
return EXCP_HALTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cpu_single_env = env1;
|
cpu_single_env = env1;
|
||||||
|
|
||||||
|
@ -79,4 +79,14 @@ int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp);
|
|||||||
|
|
||||||
void do_interrupt (CPUState *env);
|
void do_interrupt (CPUState *env);
|
||||||
|
|
||||||
|
static inline int cpu_halted(CPUState *env) {
|
||||||
|
if (!env->halted)
|
||||||
|
return 0;
|
||||||
|
if (env->interrupt_request & CPU_INTERRUPT_HARD) {
|
||||||
|
env->halted = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return EXCP_HALTED;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !defined (__ALPHA_EXEC_H__) */
|
#endif /* !defined (__ALPHA_EXEC_H__) */
|
||||||
|
@ -48,6 +48,20 @@ static inline void regs_to_env(void)
|
|||||||
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int is_user, int is_softmmu);
|
int is_user, int is_softmmu);
|
||||||
|
|
||||||
|
static inline int cpu_halted(CPUState *env) {
|
||||||
|
if (!env->halted)
|
||||||
|
return 0;
|
||||||
|
/* An interrupt wakes the CPU even if the I and F CPSR bits are
|
||||||
|
set. We use EXITTB to silently wake CPU without causing an
|
||||||
|
actual interrupt. */
|
||||||
|
if (env->interrupt_request &
|
||||||
|
(CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD | CPU_INTERRUPT_EXITTB)) {
|
||||||
|
env->halted = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return EXCP_HALTED;
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
#include "softmmu_exec.h"
|
#include "softmmu_exec.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -575,3 +575,16 @@ static inline void regs_to_env(void)
|
|||||||
env->regs[R_EDI] = EDI;
|
env->regs[R_EDI] = EDI;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int cpu_halted(CPUState *env) {
|
||||||
|
/* handle exit of HALTED state */
|
||||||
|
if (env->hflags & HF_HALTED_MASK)
|
||||||
|
return 0;
|
||||||
|
/* disable halt condition */
|
||||||
|
if ((env->interrupt_request & CPU_INTERRUPT_HARD) &&
|
||||||
|
(env->eflags & IF_MASK)) {
|
||||||
|
env->hflags &= ~HF_HALTED_MASK;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return EXCP_HALTED;
|
||||||
|
}
|
||||||
|
@ -106,14 +106,6 @@ void cpu_unlock(void)
|
|||||||
spin_unlock(&global_cpu_lock);
|
spin_unlock(&global_cpu_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cpu_loop_exit(void)
|
|
||||||
{
|
|
||||||
/* NOTE: the register at this point must be saved by hand because
|
|
||||||
longjmp restore them */
|
|
||||||
regs_to_env();
|
|
||||||
longjmp(env->jmp_env, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return non zero if error */
|
/* return non zero if error */
|
||||||
static inline int load_segment(uint32_t *e1_ptr, uint32_t *e2_ptr,
|
static inline int load_segment(uint32_t *e1_ptr, uint32_t *e2_ptr,
|
||||||
int selector)
|
int selector)
|
||||||
|
@ -49,3 +49,13 @@ float64 helper_sub_cmpf64(CPUM68KState *env, float64 src0, float64 src1);
|
|||||||
void helper_movec(CPUM68KState *env, int reg, uint32_t val);
|
void helper_movec(CPUM68KState *env, int reg, uint32_t val);
|
||||||
|
|
||||||
void cpu_loop_exit(void);
|
void cpu_loop_exit(void);
|
||||||
|
|
||||||
|
static inline int cpu_halted(CPUState *env) {
|
||||||
|
if (!env->halted)
|
||||||
|
return 0;
|
||||||
|
if (env->interrupt_request & CPU_INTERRUPT_HARD) {
|
||||||
|
env->halted = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return EXCP_HALTED;
|
||||||
|
}
|
||||||
|
@ -56,14 +56,6 @@ register target_ulong T2 asm(AREG3);
|
|||||||
#include "softmmu_exec.h"
|
#include "softmmu_exec.h"
|
||||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||||
|
|
||||||
static inline void env_to_regs(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void regs_to_env(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TARGET_MIPS64
|
#ifdef TARGET_MIPS64
|
||||||
#if TARGET_LONG_BITS > HOST_LONG_BITS
|
#if TARGET_LONG_BITS > HOST_LONG_BITS
|
||||||
void do_dsll (void);
|
void do_dsll (void);
|
||||||
@ -240,4 +232,23 @@ FOP_PROTO(le)
|
|||||||
FOP_PROTO(ngt)
|
FOP_PROTO(ngt)
|
||||||
#undef FOP_PROTO
|
#undef FOP_PROTO
|
||||||
|
|
||||||
|
static inline void env_to_regs(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void regs_to_env(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int cpu_halted(CPUState *env) {
|
||||||
|
if (!env->halted)
|
||||||
|
return 0;
|
||||||
|
if (env->interrupt_request &
|
||||||
|
(CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER)) {
|
||||||
|
env->halted = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return EXCP_HALTED;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !defined(__QEMU_MIPS_EXEC_H__) */
|
#endif /* !defined(__QEMU_MIPS_EXEC_H__) */
|
||||||
|
@ -24,10 +24,6 @@
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Exceptions processing helpers */
|
/* Exceptions processing helpers */
|
||||||
void cpu_loop_exit(void)
|
|
||||||
{
|
|
||||||
longjmp(env->jmp_env, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_raise_exception_err (uint32_t exception, int error_code)
|
void do_raise_exception_err (uint32_t exception, int error_code)
|
||||||
{
|
{
|
||||||
|
@ -122,4 +122,14 @@ static inline void regs_to_env(void)
|
|||||||
int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int is_user, int is_softmmu);
|
int is_user, int is_softmmu);
|
||||||
|
|
||||||
|
static inline int cpu_halted(CPUState *env) {
|
||||||
|
if (!env->halted)
|
||||||
|
return 0;
|
||||||
|
if (env->msr[MSR_EE] && (env->interrupt_request & CPU_INTERRUPT_HARD)) {
|
||||||
|
env->halted = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return EXCP_HALTED;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !defined (__PPC_H__) */
|
#endif /* !defined (__PPC_H__) */
|
||||||
|
@ -40,10 +40,6 @@
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Exceptions processing helpers */
|
/* Exceptions processing helpers */
|
||||||
void cpu_loop_exit (void)
|
|
||||||
{
|
|
||||||
longjmp(env->jmp_env, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_raise_exception_err (uint32_t exception, int error_code)
|
void do_raise_exception_err (uint32_t exception, int error_code)
|
||||||
{
|
{
|
||||||
|
@ -20,11 +20,6 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "exec.h"
|
#include "exec.h"
|
||||||
|
|
||||||
void cpu_loop_exit(void)
|
|
||||||
{
|
|
||||||
longjmp(env->jmp_env, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_raise_exception(void)
|
void do_raise_exception(void)
|
||||||
{
|
{
|
||||||
cpu_loop_exit();
|
cpu_loop_exit();
|
||||||
|
@ -115,4 +115,14 @@ static inline void regs_to_env(void)
|
|||||||
int cpu_sparc_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int cpu_sparc_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int is_user, int is_softmmu);
|
int is_user, int is_softmmu);
|
||||||
|
|
||||||
|
static inline int cpu_halted(CPUState *env) {
|
||||||
|
if (!env->halted)
|
||||||
|
return 0;
|
||||||
|
if ((env->interrupt_request & CPU_INTERRUPT_HARD) && (env->psret != 0)) {
|
||||||
|
env->halted = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return EXCP_HALTED;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user