|
@@ -977,6 +977,7 @@ static void do_interrupt64(CPUX86State *env, int intno, int is_int,
|
|
e2);
|
|
e2);
|
|
env->eip = offset;
|
|
env->eip = offset;
|
|
}
|
|
}
|
|
|
|
+#endif /* TARGET_X86_64 */
|
|
|
|
|
|
void helper_sysret(CPUX86State *env, int dflag)
|
|
void helper_sysret(CPUX86State *env, int dflag)
|
|
{
|
|
{
|
|
@@ -990,6 +991,7 @@ void helper_sysret(CPUX86State *env, int dflag)
|
|
raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC());
|
|
raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC());
|
|
}
|
|
}
|
|
selector = (env->star >> 48) & 0xffff;
|
|
selector = (env->star >> 48) & 0xffff;
|
|
|
|
+#ifdef TARGET_X86_64
|
|
if (env->hflags & HF_LMA_MASK) {
|
|
if (env->hflags & HF_LMA_MASK) {
|
|
cpu_load_eflags(env, (uint32_t)(env->regs[11]), TF_MASK | AC_MASK
|
|
cpu_load_eflags(env, (uint32_t)(env->regs[11]), TF_MASK | AC_MASK
|
|
| ID_MASK | IF_MASK | IOPL_MASK | VM_MASK | RF_MASK |
|
|
| ID_MASK | IF_MASK | IOPL_MASK | VM_MASK | RF_MASK |
|
|
@@ -1015,7 +1017,9 @@ void helper_sysret(CPUX86State *env, int dflag)
|
|
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
|
|
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
|
|
DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
|
|
DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
|
|
DESC_W_MASK | DESC_A_MASK);
|
|
DESC_W_MASK | DESC_A_MASK);
|
|
- } else {
|
|
|
|
|
|
+ } else
|
|
|
|
+#endif
|
|
|
|
+ {
|
|
env->eflags |= IF_MASK;
|
|
env->eflags |= IF_MASK;
|
|
cpu_x86_load_seg_cache(env, R_CS, selector | 3,
|
|
cpu_x86_load_seg_cache(env, R_CS, selector | 3,
|
|
0, 0xffffffff,
|
|
0, 0xffffffff,
|
|
@@ -1030,7 +1034,6 @@ void helper_sysret(CPUX86State *env, int dflag)
|
|
DESC_W_MASK | DESC_A_MASK);
|
|
DESC_W_MASK | DESC_A_MASK);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-#endif /* TARGET_X86_64 */
|
|
|
|
|
|
|
|
/* real mode interrupt */
|
|
/* real mode interrupt */
|
|
static void do_interrupt_real(CPUX86State *env, int intno, int is_int,
|
|
static void do_interrupt_real(CPUX86State *env, int intno, int is_int,
|