diff --git a/cpu-defs.h b/cpu-defs.h index c308253813c9ac05db7deac07ea15a0185b0da8d..e095f8566f6b8c631049ec3f178747230020c0f9 100644 --- a/cpu-defs.h +++ b/cpu-defs.h @@ -74,7 +74,7 @@ typedef unsigned long ram_addr_t; #define EXCP_INTERRUPT 0x10000 /* async interruption */ #define EXCP_HLT 0x10001 /* hlt instruction reached */ #define EXCP_DEBUG 0x10002 /* cpu stopped after a breakpoint or singlestep */ - +#define EXCP_HALTED 0x10003 /* cpu is halted (waiting for external event) */ #define MAX_BREAKPOINTS 32 #define TB_JMP_CACHE_BITS 12 @@ -96,7 +96,6 @@ typedef struct CPUTLBEntry { #define CPU_COMMON \ struct TranslationBlock *current_tb; /* currently executing TB */ \ - int cpu_halted; /* TRUE if cpu is halted (sleep mode) */ \ /* soft mmu support */ \ /* in order to avoid passing too many arguments to the memory \ write helpers, we store some rarely used information in the CPU \ diff --git a/cpu-exec.c b/cpu-exec.c index 72e32684a1b2c03f96f5399ec7eb8b81b744cafb..de1fff212245b7f92fa24a11593412e588e8d3e7 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -251,6 +251,19 @@ int cpu_exec(CPUState *env1) TranslationBlock *tb; uint8_t *tc_ptr; +#if defined(TARGET_I386) + /* handle exit of HALTED state */ + 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; + } + } +#endif + cpu_single_env = env1; /* first we save global registers */