SYSENTER/SYSEXIT IA-32e implementation
PATCH 3/3 SYSENTER/SYSEXIT IA-32e implementation
On Intel CPUs, sysenter and sysexit are valid in 64-bit mode. This patch makes both 64-bit aware and enables them for Intel CPUs.
Signed-off-by Alexander Graf <[email protected]>
qemu/target-i386/cpu.h +2 -2
@@ -542,8 +555,8 @@ typedef struct CPUX86State {/* sysenter registers */ uint32_t sysenter_cs; -uint32_t sysenter_esp; -uint32_t sysenter_eip; +target_ulong sysenter_esp; +target_ulong sysenter_eip;uint64_t efer;uint64_t star;
qemu/target-i386/helper.h +1 -1
@@ -55,7 +55,7 @@ DEF_HELPER(void, helper_enter_level, (int level, int data32, target_ulong t1)) DEF_HELPER(void, helper_enter64_level, (int level, int data64, target_ulong t1))#endif DEF_HELPER(void, helper_sysenter, (void)) -DEF_HELPER(void, helper_sysexit, (void)) +DEF_HELPER(void, helper_sysexit, (int dflag)) #ifdef TARGET_X86_64 DEF_HELPER(void, helper_syscall, (int next_eip_addend)) DEF_HELPER(void, helper_sysret, (int dflag))
qemu/target-i386/op_helper.c +44 -16
78 lines not on this page · raw message
qemu/target-i386/translate.c +5 -3
@@ -6401,7 +6401,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)tcg_gen_helper_0_0 (helper_rdpmc);break ;case 0x134 :/* sysenter */ -if (CODE64 (s)) +/* For Intel SYSENTER is valid on 64-bit */ +if (CODE64 (s) && cpu_single_env->cpuid_vendor1 !=CPUID_VENDOR_INTEL_1 ) goto illegal_op;if (!s->pe) {gen_exception (s,EXCP0D_GPF , pc_start - s->cs_base);
@@ -6416,7 +6417,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) }break ;case 0x135 :/* sysexit */ -if (CODE64 (s)) +/* For Intel SYSEXIT is valid on 64-bit */ +if (CODE64 (s) && cpu_single_env->cpuid_vendor1 !=CPUID_VENDOR_INTEL_1 ) goto illegal_op;if (!s->pe) {gen_exception (s,EXCP0D_GPF , pc_start - s->cs_base);
@@ -6426,7 +6428,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) s->cc_op =CC_OP_DYNAMIC ; }gen_jmp_im (pc_start - s->cs_base); -tcg_gen_helper_0_0 (helper_sysexit); +tcg_gen_helper_0_1 (helper_sysexit,tcg_const_i32 (dflag));gen_eob (s); }break ;