/[qemu]/qemu/target-i386/helper.c
ViewVC logotype

Diff of /qemu/target-i386/helper.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.48 by bellard, Sat Apr 23 17:48:47 2005 UTC revision 1.49 by bellard, Sun Apr 24 18:04:33 2005 UTC
# Line 1494  void load_seg(int seg_reg, int selector) Line 1494  void load_seg(int seg_reg, int selector)
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);
# Line 1520  void load_seg(int seg_reg, int selector) Line 1521  void load_seg(int seg_reg, int selector)
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))
# Line 2054  static inline void helper_ret_protected( Line 2054  static inline void helper_ret_protected(
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);

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.49

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26