Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/lib/getuser.S
10817 views
1
/*
2
* __get_user functions.
3
*
4
* (C) Copyright 1998 Linus Torvalds
5
* (C) Copyright 2005 Andi Kleen
6
* (C) Copyright 2008 Glauber Costa
7
*
8
* These functions have a non-standard call interface
9
* to make them more efficient, especially as they
10
* return an error value in addition to the "real"
11
* return value.
12
*/
13
14
/*
15
* __get_user_X
16
*
17
* Inputs: %[r|e]ax contains the address.
18
* The register is modified, but all changes are undone
19
* before returning because the C code doesn't know about it.
20
*
21
* Outputs: %[r|e]ax is error code (0 or -EFAULT)
22
* %[r|e]dx contains zero-extended value
23
*
24
*
25
* These functions should not modify any other registers,
26
* as they get called from within inline assembly.
27
*/
28
29
#include <linux/linkage.h>
30
#include <asm/dwarf2.h>
31
#include <asm/page_types.h>
32
#include <asm/errno.h>
33
#include <asm/asm-offsets.h>
34
#include <asm/thread_info.h>
35
#include <asm/asm.h>
36
37
.text
38
ENTRY(__get_user_1)
39
CFI_STARTPROC
40
GET_THREAD_INFO(%_ASM_DX)
41
cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
42
jae bad_get_user
43
1: movzb (%_ASM_AX),%edx
44
xor %eax,%eax
45
ret
46
CFI_ENDPROC
47
ENDPROC(__get_user_1)
48
49
ENTRY(__get_user_2)
50
CFI_STARTPROC
51
add $1,%_ASM_AX
52
jc bad_get_user
53
GET_THREAD_INFO(%_ASM_DX)
54
cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
55
jae bad_get_user
56
2: movzwl -1(%_ASM_AX),%edx
57
xor %eax,%eax
58
ret
59
CFI_ENDPROC
60
ENDPROC(__get_user_2)
61
62
ENTRY(__get_user_4)
63
CFI_STARTPROC
64
add $3,%_ASM_AX
65
jc bad_get_user
66
GET_THREAD_INFO(%_ASM_DX)
67
cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
68
jae bad_get_user
69
3: mov -3(%_ASM_AX),%edx
70
xor %eax,%eax
71
ret
72
CFI_ENDPROC
73
ENDPROC(__get_user_4)
74
75
#ifdef CONFIG_X86_64
76
ENTRY(__get_user_8)
77
CFI_STARTPROC
78
add $7,%_ASM_AX
79
jc bad_get_user
80
GET_THREAD_INFO(%_ASM_DX)
81
cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
82
jae bad_get_user
83
4: movq -7(%_ASM_AX),%_ASM_DX
84
xor %eax,%eax
85
ret
86
CFI_ENDPROC
87
ENDPROC(__get_user_8)
88
#endif
89
90
bad_get_user:
91
CFI_STARTPROC
92
xor %edx,%edx
93
mov $(-EFAULT),%_ASM_AX
94
ret
95
CFI_ENDPROC
96
END(bad_get_user)
97
98
.section __ex_table,"a"
99
_ASM_PTR 1b,bad_get_user
100
_ASM_PTR 2b,bad_get_user
101
_ASM_PTR 3b,bad_get_user
102
#ifdef CONFIG_X86_64
103
_ASM_PTR 4b,bad_get_user
104
#endif
105
106