getuser_64.S 1.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * __get_user functions.
 *
 * (C) Copyright 1998 Linus Torvalds
 * (C) Copyright 2005 Andi Kleen
 *
 * These functions have a non-standard call interface
 * to make them more efficient, especially as they
 * return an error value in addition to the "real"
 * return value.
 */

/*
 * __get_user_X
 *
 * Inputs:	%rcx contains the address.
 *		The register is modified, but all changes are undone
 *		before returning because the C code doesn't know about it.
 *
 * Outputs:	%rax is error code (0 or -EFAULT)
 *		%rdx contains zero-extended value
 * 
 * %r8 is destroyed.
 *
 * These functions should not modify any other registers,
 * as they get called from within inline assembly.
 */

#include <linux/linkage.h>
30
#include <asm/dwarf2.h>
L
Linus Torvalds 已提交
31 32
#include <asm/page.h>
#include <asm/errno.h>
33
#include <asm/asm-offsets.h>
L
Linus Torvalds 已提交
34 35 36
#include <asm/thread_info.h>

	.text
37 38
ENTRY(__get_user_1)
	CFI_STARTPROC
39
	GET_THREAD_INFO(%rdx)
40
	cmp TI_addr_limit(%rdx),%rax
L
Linus Torvalds 已提交
41
	jae bad_get_user
42
1:	movzb (%rax),%edx
43
	xor %eax,%eax
L
Linus Torvalds 已提交
44
	ret
45 46
	CFI_ENDPROC
ENDPROC(__get_user_1)
L
Linus Torvalds 已提交
47

48 49
ENTRY(__get_user_2)
	CFI_STARTPROC
50
	add $1,%rax
51 52
	jc bad_get_user
	GET_THREAD_INFO(%rdx)
53
	cmp TI_addr_limit(%rdx),%rax
54 55
	jae bad_get_user
2:	movzwl -1(%rax),%edx
56
	xor %eax,%eax
L
Linus Torvalds 已提交
57
	ret
58 59
	CFI_ENDPROC
ENDPROC(__get_user_2)
L
Linus Torvalds 已提交
60

61 62
ENTRY(__get_user_4)
	CFI_STARTPROC
63
	add $3,%rax
64 65
	jc bad_get_user
	GET_THREAD_INFO(%rdx)
66
	cmp TI_addr_limit(%rdx),%rax
67
	jae bad_get_user
68 69
3:	mov -3(%rax),%edx
	xor %eax,%eax
L
Linus Torvalds 已提交
70
	ret
71 72
	CFI_ENDPROC
ENDPROC(__get_user_4)
L
Linus Torvalds 已提交
73

74 75
ENTRY(__get_user_8)
	CFI_STARTPROC
76
	add $7,%rax
77 78
	jc bad_get_user
	GET_THREAD_INFO(%rdx)
79
	cmp TI_addr_limit(%rdx),%rax
80 81
	jae	bad_get_user
4:	movq -7(%rax),%rdx
82
	xor %eax,%eax
L
Linus Torvalds 已提交
83
	ret
84 85
	CFI_ENDPROC
ENDPROC(__get_user_8)
L
Linus Torvalds 已提交
86 87

bad_get_user:
88
	CFI_STARTPROC
89 90
	xor %edx,%edx
	mov $(-EFAULT),%rax
L
Linus Torvalds 已提交
91
	ret
92 93
	CFI_ENDPROC
END(bad_get_user)
L
Linus Torvalds 已提交
94 95 96 97 98 99 100

.section __ex_table,"a"
	.quad 1b,bad_get_user
	.quad 2b,bad_get_user
	.quad 3b,bad_get_user
	.quad 4b,bad_get_user
.previous