Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / i386 / math-emu / get_address.c
index dd568ad..9819b70 100644 (file)
@@ -81,8 +81,8 @@ static int sib(int mod, unsigned long *fpu_eip)
   long offset;
 
   RE_ENTRANT_CHECK_OFF;
-  FPU_code_verify_area(1);
-  FPU_get_user(base, (u_char *) (*fpu_eip));   /* The SIB byte */
+  FPU_code_access_ok(1);
+  FPU_get_user(base, (u_char __user *) (*fpu_eip));   /* The SIB byte */
   RE_ENTRANT_CHECK_ON;
   (*fpu_eip)++;
   ss = base >> 6;
@@ -111,8 +111,8 @@ static int sib(int mod, unsigned long *fpu_eip)
       /* 8 bit signed displacement */
       long displacement;
       RE_ENTRANT_CHECK_OFF;
-      FPU_code_verify_area(1);
-      FPU_get_user(displacement, (signed char *) (*fpu_eip));
+      FPU_code_access_ok(1);
+      FPU_get_user(displacement, (signed char __user *) (*fpu_eip));
       offset += displacement;
       RE_ENTRANT_CHECK_ON;
       (*fpu_eip)++;
@@ -122,8 +122,8 @@ static int sib(int mod, unsigned long *fpu_eip)
       /* 32 bit displacement */
       long displacement;
       RE_ENTRANT_CHECK_OFF;
-      FPU_code_verify_area(4);
-      FPU_get_user(displacement, (long *) (*fpu_eip));
+      FPU_code_access_ok(4);
+      FPU_get_user(displacement, (long __user *) (*fpu_eip));
       offset += displacement;
       RE_ENTRANT_CHECK_ON;
       (*fpu_eip) += 4;
@@ -155,7 +155,6 @@ static long pm_address(u_char FPU_modrm, u_char segment,
 { 
   struct desc_struct descriptor;
   unsigned long base_address, limit, address, seg_top;
-  unsigned short selector;
 
   segment--;
 
@@ -173,17 +172,11 @@ static long pm_address(u_char FPU_modrm, u_char segment,
       /* fs and gs aren't used by the kernel, so they still have their
         user-space values. */
     case PREFIX_FS_-1:
-      /* The cast is needed here to get gcc 2.8.0 to use a 16 bit register
-        in the assembler statement. */
-
-      __asm__("mov %%fs,%0":"=r" (selector));
-      addr->selector = selector;
+      /* N.B. - movl %seg, mem is a 2 byte write regardless of prefix */
+      savesegment(fs, addr->selector);
       break;
     case PREFIX_GS_-1:
-      /* The cast is needed here to get gcc 2.8.0 to use a 16 bit register
-        in the assembler statement. */
-      __asm__("mov %%gs,%0":"=r" (selector));
-      addr->selector = selector;
+      savesegment(gs, addr->selector);
       break;
     default:
       addr->selector = PM_REG_(segment);
@@ -241,7 +234,7 @@ static long pm_address(u_char FPU_modrm, u_char segment,
 
 */
 
-void *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip,
+void __user *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip,
                  struct address *addr,
                  fpu_addr_modes addr_modes)
 {
@@ -276,33 +269,33 @@ void *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip,
            {
              /* Special case: disp32 */
              RE_ENTRANT_CHECK_OFF;
-             FPU_code_verify_area(4);
-             FPU_get_user(address, (unsigned long *) (*fpu_eip));
+             FPU_code_access_ok(4);
+             FPU_get_user(address, (unsigned long __user *) (*fpu_eip));
              (*fpu_eip) += 4;
              RE_ENTRANT_CHECK_ON;
              addr->offset = address;
-             return (void *) address;
+             return (void __user *) address;
            }
          else
            {
              address = *cpu_reg_ptr;  /* Just return the contents
                                          of the cpu register */
              addr->offset = address;
-             return (void *) address;
+             return (void __user *) address;
            }
        case 1:
          /* 8 bit signed displacement */
          RE_ENTRANT_CHECK_OFF;
-         FPU_code_verify_area(1);
-         FPU_get_user(address, (signed char *) (*fpu_eip));
+         FPU_code_access_ok(1);
+         FPU_get_user(address, (signed char __user *) (*fpu_eip));
          RE_ENTRANT_CHECK_ON;
          (*fpu_eip)++;
          break;
        case 2:
          /* 32 bit displacement */
          RE_ENTRANT_CHECK_OFF;
-         FPU_code_verify_area(4);
-         FPU_get_user(address, (long *) (*fpu_eip));
+         FPU_code_access_ok(4);
+         FPU_get_user(address, (long __user *) (*fpu_eip));
          (*fpu_eip) += 4;
          RE_ENTRANT_CHECK_ON;
          break;
@@ -331,11 +324,11 @@ void *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip,
       EXCEPTION(EX_INTERNAL|0x133);
     }
 
-  return (void *)address;
+  return (void __user *)address;
 }
 
 
-void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip,
+void __user *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip,
                     struct address *addr,
                     fpu_addr_modes addr_modes)
 {
@@ -362,8 +355,8 @@ void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip,
        {
          /* Special case: disp16 */
          RE_ENTRANT_CHECK_OFF;
-         FPU_code_verify_area(2);
-         FPU_get_user(address, (unsigned short *) (*fpu_eip));
+         FPU_code_access_ok(2);
+         FPU_get_user(address, (unsigned short __user *) (*fpu_eip));
          (*fpu_eip) += 2;
          RE_ENTRANT_CHECK_ON;
          goto add_segment;
@@ -372,16 +365,16 @@ void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip,
     case 1:
       /* 8 bit signed displacement */
       RE_ENTRANT_CHECK_OFF;
-      FPU_code_verify_area(1);
-      FPU_get_user(address, (signed char *) (*fpu_eip));
+      FPU_code_access_ok(1);
+      FPU_get_user(address, (signed char __user *) (*fpu_eip));
       RE_ENTRANT_CHECK_ON;
       (*fpu_eip)++;
       break;
     case 2:
       /* 16 bit displacement */
       RE_ENTRANT_CHECK_OFF;
-      FPU_code_verify_area(2);
-      FPU_get_user(address, (unsigned short *) (*fpu_eip));
+      FPU_code_access_ok(2);
+      FPU_get_user(address, (unsigned short __user *) (*fpu_eip));
       (*fpu_eip) += 2;
       RE_ENTRANT_CHECK_ON;
       break;
@@ -445,5 +438,5 @@ void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip,
       EXCEPTION(EX_INTERNAL|0x131);
     }
 
-  return (void *)address ;
+  return (void __user *)address ;
 }