qemu: per-arch cpu_has_work (Marcelo Tosatti)

Blue Swirl: fix Sparc32 breakage

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7238 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
aliguori 2009-04-24 18:03:20 +00:00
parent e5d355d12e
commit 6a4955a813
11 changed files with 72 additions and 12 deletions

View File

@ -775,6 +775,8 @@ void cpu_reset_interrupt(CPUState *env, int mask);
void cpu_exit(CPUState *s);
int qemu_cpu_has_work(CPUState *env);
/* Breakpoint/watchpoint flags */
#define BP_MEM_READ 0x01
#define BP_MEM_WRITE 0x02

View File

@ -50,6 +50,11 @@ int tb_invalidated_flag;
//#define DEBUG_EXEC
//#define DEBUG_SIGNAL
int qemu_cpu_has_work(CPUState *env)
{
return cpu_has_work(env);
}
void cpu_loop_exit(void)
{
/* NOTE: the register at this point must be saved by hand because

View File

@ -48,10 +48,15 @@ static always_inline void regs_to_env(void)
{
}
static always_inline int cpu_has_work(CPUState *env)
{
return (env->interrupt_request & CPU_INTERRUPT_HARD);
}
static always_inline int cpu_halted(CPUState *env) {
if (!env->halted)
return 0;
if (env->interrupt_request & CPU_INTERRUPT_HARD) {
if (cpu_has_work(env)) {
env->halted = 0;
return 0;
}

View File

@ -37,14 +37,19 @@ static inline void regs_to_env(void)
{
}
static inline int cpu_has_work(CPUState *env)
{
return (env->interrupt_request &
(CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD | CPU_INTERRUPT_EXITTB));
}
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)) {
if (cpu_has_work(env)) {
env->halted = 0;
return 0;
}

View File

@ -40,6 +40,11 @@ static inline void regs_to_env(void)
void cpu_cris_flush_flags(CPUCRISState *env, int cc_op);
void helper_movec(CPUCRISState *env, int reg, uint32_t val);
static inline int cpu_has_work(CPUState *env)
{
return (env->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI));
}
static inline int cpu_halted(CPUState *env) {
if (!env->halted)
return 0;

View File

@ -338,14 +338,23 @@ static inline void regs_to_env(void)
#endif
}
static inline int cpu_has_work(CPUState *env)
{
int work;
work = (env->interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK);
work |= env->interrupt_request & CPU_INTERRUPT_NMI;
return work;
}
static inline int cpu_halted(CPUState *env) {
/* handle exit of HALTED state */
if (!env->halted)
return 0;
/* disable halt condition */
if (((env->interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK)) ||
(env->interrupt_request & CPU_INTERRUPT_NMI)) {
if (cpu_has_work(env)) {
env->halted = 0;
return 0;
}

View File

@ -41,10 +41,15 @@ static inline void regs_to_env(void)
#include "softmmu_exec.h"
#endif
static inline int cpu_has_work(CPUState *env)
{
return (env->interrupt_request & (CPU_INTERRUPT_HARD));
}
static inline int cpu_halted(CPUState *env) {
if (!env->halted)
return 0;
if (env->interrupt_request & CPU_INTERRUPT_HARD) {
if (cpu_has_work(env)) {
env->halted = 0;
return 0;
}

View File

@ -33,12 +33,18 @@ static inline void regs_to_env(void)
{
}
static inline int cpu_has_work(CPUState *env)
{
return (env->interrupt_request &
(CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER));
}
static inline int cpu_halted(CPUState *env)
{
if (!env->halted)
return 0;
if (env->interrupt_request &
(CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER)) {
if (cpu_has_work(env)) {
env->halted = 0;
return 0;
}

View File

@ -44,11 +44,17 @@ static always_inline void regs_to_env (void)
{
}
static always_inline int cpu_has_work(CPUState *env)
{
return (msr_ee && (env->interrupt_request & CPU_INTERRUPT_HARD));
}
static always_inline int cpu_halted (CPUState *env)
{
if (!env->halted)
return 0;
if (msr_ee && (env->interrupt_request & CPU_INTERRUPT_HARD)) {
if (cpu_has_work(env)) {
env->halted = 0;
return 0;
}

View File

@ -28,10 +28,15 @@ register struct CPUSH4State *env asm(AREG0);
#include "cpu.h"
#include "exec-all.h"
static inline int cpu_has_work(CPUState *env)
{
return (env->interrupt_request & CPU_INTERRUPT_HARD);
}
static inline int cpu_halted(CPUState *env) {
if (!env->halted)
return 0;
if (env->interrupt_request & CPU_INTERRUPT_HARD) {
if (cpu_has_work(env)) {
env->halted = 0;
env->intr_at_halt = 1;
return 0;

View File

@ -24,10 +24,17 @@ static inline void regs_to_env(void)
/* op_helper.c */
void do_interrupt(CPUState *env);
static inline int cpu_has_work(CPUState *env1)
{
return (env1->interrupt_request & CPU_INTERRUPT_HARD) &&
(env1->psret != 0);
}
static inline int cpu_halted(CPUState *env1) {
if (!env1->halted)
return 0;
if ((env1->interrupt_request & CPU_INTERRUPT_HARD) && (env1->psret != 0)) {
if (cpu_has_work(env1)) {
env1->halted = 0;
return 0;
}