1494 |
target_ulong ptr; |
target_ulong ptr; |
1495 |
|
|
1496 |
selector &= 0xffff; |
selector &= 0xffff; |
1497 |
|
cpl = env->hflags & HF_CPL_MASK; |
1498 |
if ((selector & 0xfffc) == 0) { |
if ((selector & 0xfffc) == 0) { |
1499 |
/* null selector case */ |
/* null selector case */ |
1500 |
if (seg_reg == R_SS |
if (seg_reg == R_SS |
1501 |
#ifdef TARGET_X86_64 |
#ifdef TARGET_X86_64 |
1502 |
&& !(env->hflags & HF_CS64_MASK) |
&& (!(env->hflags & HF_CS64_MASK) || cpl == 3) |
1503 |
#endif |
#endif |
1504 |
) |
) |
1505 |
raise_exception_err(EXCP0D_GPF, 0); |
raise_exception_err(EXCP0D_GPF, 0); |
1521 |
raise_exception_err(EXCP0D_GPF, selector & 0xfffc); |
raise_exception_err(EXCP0D_GPF, selector & 0xfffc); |
1522 |
rpl = selector & 3; |
rpl = selector & 3; |
1523 |
dpl = (e2 >> DESC_DPL_SHIFT) & 3; |
dpl = (e2 >> DESC_DPL_SHIFT) & 3; |
|
cpl = env->hflags & HF_CPL_MASK; |
|
1524 |
if (seg_reg == R_SS) { |
if (seg_reg == R_SS) { |
1525 |
/* must be writable segment */ |
/* must be writable segment */ |
1526 |
if ((e2 & DESC_CS_MASK) || !(e2 & DESC_W_MASK)) |
if ((e2 & DESC_CS_MASK) || !(e2 & DESC_W_MASK)) |
2054 |
new_ss, new_esp); |
new_ss, new_esp); |
2055 |
} |
} |
2056 |
#endif |
#endif |
2057 |
if ((env->hflags & HF_LMA_MASK) && (new_ss & 0xfffc) == 0) { |
if ((new_ss & 0xfffc) == 0) { |
2058 |
/* NULL ss is allowed in long mode */ |
#ifdef TARGET_X86_64 |
2059 |
cpu_x86_load_seg_cache(env, R_SS, new_ss, |
/* NULL ss is allowed in long mode if cpl != 3*/ |
2060 |
0, 0xffffffff, |
if ((env->hflags & HF_LMA_MASK) && rpl != 3) { |
2061 |
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | |
cpu_x86_load_seg_cache(env, R_SS, new_ss, |
2062 |
DESC_S_MASK | (rpl << DESC_DPL_SHIFT) | |
0, 0xffffffff, |
2063 |
DESC_W_MASK | DESC_A_MASK); |
DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | |
2064 |
|
DESC_S_MASK | (rpl << DESC_DPL_SHIFT) | |
2065 |
|
DESC_W_MASK | DESC_A_MASK); |
2066 |
|
} else |
2067 |
|
#endif |
2068 |
|
{ |
2069 |
|
raise_exception_err(EXCP0D_GPF, 0); |
2070 |
|
} |
2071 |
} else { |
} else { |
2072 |
if ((new_ss & 3) != rpl) |
if ((new_ss & 3) != rpl) |
2073 |
raise_exception_err(EXCP0D_GPF, new_ss & 0xfffc); |
raise_exception_err(EXCP0D_GPF, new_ss & 0xfffc); |