eflags update
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@56 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
9c605cb135
commit
fc2b4c4879
34
cpu-i386.h
34
cpu-i386.h
|
@ -48,6 +48,7 @@
|
||||||
#define R_FS 4
|
#define R_FS 4
|
||||||
#define R_GS 5
|
#define R_GS 5
|
||||||
|
|
||||||
|
/* eflags masks */
|
||||||
#define CC_C 0x0001
|
#define CC_C 0x0001
|
||||||
#define CC_P 0x0004
|
#define CC_P 0x0004
|
||||||
#define CC_A 0x0010
|
#define CC_A 0x0010
|
||||||
|
@ -55,15 +56,17 @@
|
||||||
#define CC_S 0x0080
|
#define CC_S 0x0080
|
||||||
#define CC_O 0x0800
|
#define CC_O 0x0800
|
||||||
|
|
||||||
#define TRAP_FLAG 0x0100
|
#define TF_MASK 0x00000100
|
||||||
#define INTERRUPT_FLAG 0x0200
|
#define IF_MASK 0x00000200
|
||||||
#define DIRECTION_FLAG 0x0400
|
#define DF_MASK 0x00000400
|
||||||
#define IOPL_FLAG_MASK 0x3000
|
#define IOPL_MASK 0x00003000
|
||||||
#define NESTED_FLAG 0x4000
|
#define NT_MASK 0x00004000
|
||||||
#define BYTE_FL 0x8000 /* Intel reserved! */
|
#define RF_MASK 0x00010000
|
||||||
#define RF_FLAG 0x10000
|
#define VM_MASK 0x00020000
|
||||||
#define VM_FLAG 0x20000
|
#define AC_MASK 0x00040000
|
||||||
/* AC 0x40000 */
|
#define VIF_MASK 0x00080000
|
||||||
|
#define VIP_MASK 0x00100000
|
||||||
|
#define ID_MASK 0x00200000
|
||||||
|
|
||||||
#define EXCP00_DIVZ 1
|
#define EXCP00_DIVZ 1
|
||||||
#define EXCP01_SSTP 2
|
#define EXCP01_SSTP 2
|
||||||
|
@ -158,7 +161,9 @@ typedef struct CPUX86State {
|
||||||
/* standard registers */
|
/* standard registers */
|
||||||
uint32_t regs[8];
|
uint32_t regs[8];
|
||||||
uint32_t eip;
|
uint32_t eip;
|
||||||
uint32_t eflags;
|
uint32_t eflags; /* eflags register. During CPU emulation, CC
|
||||||
|
flags and DF are set to zero because they are
|
||||||
|
store elsewhere */
|
||||||
|
|
||||||
/* emulator internal eflags handling */
|
/* emulator internal eflags handling */
|
||||||
uint32_t cc_src;
|
uint32_t cc_src;
|
||||||
|
@ -183,13 +188,13 @@ typedef struct CPUX86State {
|
||||||
SegmentDescriptorTable ldt;
|
SegmentDescriptorTable ldt;
|
||||||
SegmentDescriptorTable idt;
|
SegmentDescriptorTable idt;
|
||||||
|
|
||||||
/* various CPU modes */
|
|
||||||
int vm86;
|
|
||||||
|
|
||||||
/* exception/interrupt handling */
|
/* exception/interrupt handling */
|
||||||
jmp_buf jmp_env;
|
jmp_buf jmp_env;
|
||||||
int exception_index;
|
int exception_index;
|
||||||
int interrupt_request;
|
int interrupt_request;
|
||||||
|
|
||||||
|
/* user data */
|
||||||
|
void *opaque;
|
||||||
} CPUX86State;
|
} CPUX86State;
|
||||||
|
|
||||||
/* all CPU memory access use these macros */
|
/* all CPU memory access use these macros */
|
||||||
|
@ -418,7 +423,8 @@ int cpu_x86_signal_handler(int host_signum, struct siginfo *info,
|
||||||
#define GEN_FLAG_CODE32_SHIFT 0
|
#define GEN_FLAG_CODE32_SHIFT 0
|
||||||
#define GEN_FLAG_ADDSEG_SHIFT 1
|
#define GEN_FLAG_ADDSEG_SHIFT 1
|
||||||
#define GEN_FLAG_SS32_SHIFT 2
|
#define GEN_FLAG_SS32_SHIFT 2
|
||||||
#define GEN_FLAG_ST_SHIFT 3
|
#define GEN_FLAG_VM_SHIFT 3
|
||||||
|
#define GEN_FLAG_ST_SHIFT 4
|
||||||
|
|
||||||
int cpu_x86_gen_code(uint8_t *gen_code_buf, int max_code_size,
|
int cpu_x86_gen_code(uint8_t *gen_code_buf, int max_code_size,
|
||||||
int *gen_code_size_ptr,
|
int *gen_code_size_ptr,
|
||||||
|
|
11
exec-i386.c
11
exec-i386.c
|
@ -330,9 +330,10 @@ int cpu_x86_exec(CPUX86State *env1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* put eflags in CPU temporary format */
|
/* put eflags in CPU temporary format */
|
||||||
T0 = env->eflags;
|
CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
|
||||||
op_movl_eflags_T0();
|
DF = 1 - (2 * ((env->eflags >> 10) & 1));
|
||||||
CC_OP = CC_OP_EFLAGS;
|
CC_OP = CC_OP_EFLAGS;
|
||||||
|
env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
|
||||||
env->interrupt_request = 0;
|
env->interrupt_request = 0;
|
||||||
|
|
||||||
/* prepare setjmp context for exception handling */
|
/* prepare setjmp context for exception handling */
|
||||||
|
@ -354,6 +355,7 @@ int cpu_x86_exec(CPUX86State *env1)
|
||||||
(unsigned long)env->seg_cache[R_ES].base |
|
(unsigned long)env->seg_cache[R_ES].base |
|
||||||
(unsigned long)env->seg_cache[R_SS].base) != 0) <<
|
(unsigned long)env->seg_cache[R_SS].base) != 0) <<
|
||||||
GEN_FLAG_ADDSEG_SHIFT;
|
GEN_FLAG_ADDSEG_SHIFT;
|
||||||
|
flags |= (env->eflags & VM_MASK) >> (17 - GEN_FLAG_VM_SHIFT);
|
||||||
cs_base = env->seg_cache[R_CS].base;
|
cs_base = env->seg_cache[R_CS].base;
|
||||||
pc = cs_base + env->eip;
|
pc = cs_base + env->eip;
|
||||||
tb = tb_find(&ptb, (unsigned long)pc, (unsigned long)cs_base,
|
tb = tb_find(&ptb, (unsigned long)pc, (unsigned long)cs_base,
|
||||||
|
@ -390,8 +392,7 @@ int cpu_x86_exec(CPUX86State *env1)
|
||||||
ret = env->exception_index;
|
ret = env->exception_index;
|
||||||
|
|
||||||
/* restore flags in standard format */
|
/* restore flags in standard format */
|
||||||
op_movl_T0_eflags();
|
env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK);
|
||||||
env->eflags = T0;
|
|
||||||
|
|
||||||
/* restore global registers */
|
/* restore global registers */
|
||||||
#ifdef reg_EAX
|
#ifdef reg_EAX
|
||||||
|
@ -489,7 +490,7 @@ int cpu_x86_signal_handler(int host_signum, struct siginfo *info,
|
||||||
/* for glibc 2.1 */
|
/* for glibc 2.1 */
|
||||||
#define REG_EIP EIP
|
#define REG_EIP EIP
|
||||||
#endif
|
#endif
|
||||||
pc = uc->uc_mcontext.gregs[EIP];
|
pc = uc->uc_mcontext.gregs[REG_EIP];
|
||||||
pold_set = &uc->uc_sigmask;
|
pold_set = &uc->uc_sigmask;
|
||||||
return handle_cpu_signal(pc, pold_set);
|
return handle_cpu_signal(pc, pold_set);
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in New Issue