@ -2919,11 +2919,23 @@ void helper_sysenter(void)
}
env - > eflags & = ~ ( VM_MASK | IF_MASK | RF_MASK ) ;
cpu_x86_set_cpl ( env , 0 ) ;
cpu_x86_load_seg_cache ( env , R_CS , env - > sysenter_cs & 0xfffc ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK |
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK ) ;
# ifdef TARGET_X86_64
if ( env - > hflags & HF_LMA_MASK ) {
cpu_x86_load_seg_cache ( env , R_CS , env - > sysenter_cs & 0xfffc ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK |
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | DESC_L_MASK ) ;
} else
# endif
{
cpu_x86_load_seg_cache ( env , R_CS , env - > sysenter_cs & 0xfffc ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK |
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK ) ;
}
cpu_x86_load_seg_cache ( env , R_SS , ( env - > sysenter_cs + 8 ) & 0xfffc ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
@ -2933,7 +2945,7 @@ void helper_sysenter(void)
EIP = env - > sysenter_eip ;
}
void helper_sysexit ( vo id)
void helper_sysexit ( int dflag )
{
int cpl ;
@ -2942,16 +2954,32 @@ void helper_sysexit(void)
raise_exception_err ( EXCP0D_GPF , 0 ) ;
}
cpu_x86_set_cpl ( env , 3 ) ;
cpu_x86_load_seg_cache ( env , R_CS , ( ( env - > sysenter_cs + 16 ) & 0xfffc ) | 3 ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK | ( 3 < < DESC_DPL_SHIFT ) |
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK ) ;
cpu_x86_load_seg_cache ( env , R_SS , ( ( env - > sysenter_cs + 24 ) & 0xfffc ) | 3 ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK | ( 3 < < DESC_DPL_SHIFT ) |
DESC_W_MASK | DESC_A_MASK ) ;
# ifdef TARGET_X86_64
if ( dflag = = 2 ) {
cpu_x86_load_seg_cache ( env , R_CS , ( ( env - > sysenter_cs + 32 ) & 0xfffc ) | 3 ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK | ( 3 < < DESC_DPL_SHIFT ) |
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | DESC_L_MASK ) ;
cpu_x86_load_seg_cache ( env , R_SS , ( ( env - > sysenter_cs + 40 ) & 0xfffc ) | 3 ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK | ( 3 < < DESC_DPL_SHIFT ) |
DESC_W_MASK | DESC_A_MASK ) ;
} else
# endif
{
cpu_x86_load_seg_cache ( env , R_CS , ( ( env - > sysenter_cs + 16 ) & 0xfffc ) | 3 ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK | ( 3 < < DESC_DPL_SHIFT ) |
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK ) ;
cpu_x86_load_seg_cache ( env , R_SS , ( ( env - > sysenter_cs + 24 ) & 0xfffc ) | 3 ,
0 , 0xffffffff ,
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
DESC_S_MASK | ( 3 < < DESC_DPL_SHIFT ) |
DESC_W_MASK | DESC_A_MASK ) ;
}
ESP = ECX ;
EIP = EDX ;
# ifdef USE_KQEMU