x86-32: Add support for 64bit get_user()
[deliverable/linux.git] / arch / x86 / lib / getuser.S
index 156b9c8046704d7a3119356e12977578f3e3792e..d3bf9f99ca770fb779a547713ce98a3304a1d34a 100644 (file)
  * __get_user_X
  *
  * Inputs:     %[r|e]ax contains the address.
- *             The register is modified, but all changes are undone
- *             before returning because the C code doesn't know about it.
  *
  * Outputs:    %[r|e]ax is error code (0 or -EFAULT)
  *             %[r|e]dx contains zero-extended value
+ *             %ecx contains the high half for 32-bit __get_user_8
  *
  *
  * These functions should not modify any other registers,
@@ -79,22 +78,35 @@ ENTRY(__get_user_4)
        CFI_ENDPROC
 ENDPROC(__get_user_4)
 
-#ifdef CONFIG_X86_64
 ENTRY(__get_user_8)
        CFI_STARTPROC
+#ifdef CONFIG_X86_64
        add $7,%_ASM_AX
        jc bad_get_user
        GET_THREAD_INFO(%_ASM_DX)
        cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
-       jae     bad_get_user
+       jae bad_get_user
        ASM_STAC
 4:     movq -7(%_ASM_AX),%_ASM_DX
        xor %eax,%eax
        ASM_CLAC
        ret
+#else
+       add $7,%_ASM_AX
+       jc bad_get_user_8
+       GET_THREAD_INFO(%_ASM_DX)
+       cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
+       jae bad_get_user_8
+       ASM_STAC
+4:     mov -7(%_ASM_AX),%edx
+5:     mov -3(%_ASM_AX),%ecx
+       xor %eax,%eax
+       ASM_CLAC
+       ret
+#endif
        CFI_ENDPROC
 ENDPROC(__get_user_8)
-#endif
+
 
 bad_get_user:
        CFI_STARTPROC
@@ -105,9 +117,24 @@ bad_get_user:
        CFI_ENDPROC
 END(bad_get_user)
 
+#ifdef CONFIG_X86_32
+bad_get_user_8:
+       CFI_STARTPROC
+       xor %edx,%edx
+       xor %ecx,%ecx
+       mov $(-EFAULT),%_ASM_AX
+       ASM_CLAC
+       ret
+       CFI_ENDPROC
+END(bad_get_user_8)
+#endif
+
        _ASM_EXTABLE(1b,bad_get_user)
        _ASM_EXTABLE(2b,bad_get_user)
        _ASM_EXTABLE(3b,bad_get_user)
 #ifdef CONFIG_X86_64
        _ASM_EXTABLE(4b,bad_get_user)
+#else
+       _ASM_EXTABLE(4b,bad_get_user_8)
+       _ASM_EXTABLE(5b,bad_get_user_8)
 #endif
This page took 0.073516 seconds and 5 git commands to generate.