64 bit syscall fixes - more logical mwait/monitor ECX test
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2374 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
0499e4a02a
commit
d80c7d1c47
@ -977,7 +977,7 @@ void helper_syscall(int next_eip_addend)
|
|||||||
cpu_x86_set_cpl(env, 0);
|
cpu_x86_set_cpl(env, 0);
|
||||||
cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc,
|
cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc,
|
||||||
0, 0xffffffff,
|
0, 0xffffffff,
|
||||||
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
|
DESC_G_MASK | DESC_P_MASK |
|
||||||
DESC_S_MASK |
|
DESC_S_MASK |
|
||||||
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | DESC_L_MASK);
|
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | DESC_L_MASK);
|
||||||
cpu_x86_load_seg_cache(env, R_SS, (selector + 8) & 0xfffc,
|
cpu_x86_load_seg_cache(env, R_SS, (selector + 8) & 0xfffc,
|
||||||
@ -1028,7 +1028,7 @@ void helper_sysret(int dflag)
|
|||||||
if (dflag == 2) {
|
if (dflag == 2) {
|
||||||
cpu_x86_load_seg_cache(env, R_CS, (selector + 16) | 3,
|
cpu_x86_load_seg_cache(env, R_CS, (selector + 16) | 3,
|
||||||
0, 0xffffffff,
|
0, 0xffffffff,
|
||||||
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
|
DESC_G_MASK | DESC_P_MASK |
|
||||||
DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
|
DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
|
||||||
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK |
|
DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK |
|
||||||
DESC_L_MASK);
|
DESC_L_MASK);
|
||||||
@ -2422,12 +2422,14 @@ static inline void helper_ret_protected(int shift, int is_iret, int addend)
|
|||||||
if ((new_ss & 0xfffc) == 0) {
|
if ((new_ss & 0xfffc) == 0) {
|
||||||
#ifdef TARGET_X86_64
|
#ifdef TARGET_X86_64
|
||||||
/* NULL ss is allowed in long mode if cpl != 3*/
|
/* NULL ss is allowed in long mode if cpl != 3*/
|
||||||
|
/* XXX: test CS64 ? */
|
||||||
if ((env->hflags & HF_LMA_MASK) && rpl != 3) {
|
if ((env->hflags & HF_LMA_MASK) && rpl != 3) {
|
||||||
cpu_x86_load_seg_cache(env, R_SS, new_ss,
|
cpu_x86_load_seg_cache(env, R_SS, new_ss,
|
||||||
0, 0xffffffff,
|
0, 0xffffffff,
|
||||||
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
|
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
|
||||||
DESC_S_MASK | (rpl << DESC_DPL_SHIFT) |
|
DESC_S_MASK | (rpl << DESC_DPL_SHIFT) |
|
||||||
DESC_W_MASK | DESC_A_MASK);
|
DESC_W_MASK | DESC_A_MASK);
|
||||||
|
ss_e2 = DESC_B_MASK; /* XXX: should not be needed ? */
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@ -3716,14 +3718,14 @@ void helper_hlt(void)
|
|||||||
|
|
||||||
void helper_monitor(void)
|
void helper_monitor(void)
|
||||||
{
|
{
|
||||||
if (ECX != 0)
|
if ((uint32_t)ECX != 0)
|
||||||
raise_exception(EXCP0D_GPF);
|
raise_exception(EXCP0D_GPF);
|
||||||
/* XXX: store address ? */
|
/* XXX: store address ? */
|
||||||
}
|
}
|
||||||
|
|
||||||
void helper_mwait(void)
|
void helper_mwait(void)
|
||||||
{
|
{
|
||||||
if (ECX != 0)
|
if ((uint32_t)ECX != 0)
|
||||||
raise_exception(EXCP0D_GPF);
|
raise_exception(EXCP0D_GPF);
|
||||||
/* XXX: not complete but not completely erroneous */
|
/* XXX: not complete but not completely erroneous */
|
||||||
if (env->cpu_index != 0 || env->next_cpu != NULL) {
|
if (env->cpu_index != 0 || env->next_cpu != NULL) {
|
||||||
|
Loading…
Reference in New Issue
Block a user