hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/arch/x86/lib/putuser.S
....@@ -25,79 +25,94 @@
2525 * Inputs: %eax[:%edx] contains the data
2626 * %ecx contains the address
2727 *
28
- * Outputs: %eax is error code (0 or -EFAULT)
28
+ * Outputs: %ecx is error code (0 or -EFAULT)
29
+ *
30
+ * Clobbers: %ebx needed for task pointer
2931 *
3032 * These functions should not modify any other registers,
3133 * as they get called from within inline assembly.
3234 */
3335
34
-#define ENTER mov PER_CPU_VAR(current_task), %_ASM_BX
35
-#define EXIT ASM_CLAC ; \
36
- ret
36
+#ifdef CONFIG_X86_5LEVEL
37
+#define LOAD_TASK_SIZE_MINUS_N(n) \
38
+ ALTERNATIVE __stringify(mov $((1 << 47) - 4096 - (n)),%rbx), \
39
+ __stringify(mov $((1 << 56) - 4096 - (n)),%rbx), X86_FEATURE_LA57
40
+#else
41
+#define LOAD_TASK_SIZE_MINUS_N(n) \
42
+ mov $(TASK_SIZE_MAX - (n)),%_ASM_BX
43
+#endif
3744
3845 .text
39
-ENTRY(__put_user_1)
40
- ENTER
41
- cmp TASK_addr_limit(%_ASM_BX),%_ASM_CX
42
- jae bad_put_user
46
+SYM_FUNC_START(__put_user_1)
47
+ LOAD_TASK_SIZE_MINUS_N(0)
48
+ cmp %_ASM_BX,%_ASM_CX
49
+ jae .Lbad_put_user
50
+SYM_INNER_LABEL(__put_user_nocheck_1, SYM_L_GLOBAL)
4351 ASM_STAC
4452 1: movb %al,(%_ASM_CX)
45
- xor %eax,%eax
46
- EXIT
47
-ENDPROC(__put_user_1)
53
+ xor %ecx,%ecx
54
+ ASM_CLAC
55
+ RET
56
+SYM_FUNC_END(__put_user_1)
4857 EXPORT_SYMBOL(__put_user_1)
58
+EXPORT_SYMBOL(__put_user_nocheck_1)
4959
50
-ENTRY(__put_user_2)
51
- ENTER
52
- mov TASK_addr_limit(%_ASM_BX),%_ASM_BX
53
- sub $1,%_ASM_BX
60
+SYM_FUNC_START(__put_user_2)
61
+ LOAD_TASK_SIZE_MINUS_N(1)
5462 cmp %_ASM_BX,%_ASM_CX
55
- jae bad_put_user
63
+ jae .Lbad_put_user
64
+SYM_INNER_LABEL(__put_user_nocheck_2, SYM_L_GLOBAL)
5665 ASM_STAC
5766 2: movw %ax,(%_ASM_CX)
58
- xor %eax,%eax
59
- EXIT
60
-ENDPROC(__put_user_2)
67
+ xor %ecx,%ecx
68
+ ASM_CLAC
69
+ RET
70
+SYM_FUNC_END(__put_user_2)
6171 EXPORT_SYMBOL(__put_user_2)
72
+EXPORT_SYMBOL(__put_user_nocheck_2)
6273
63
-ENTRY(__put_user_4)
64
- ENTER
65
- mov TASK_addr_limit(%_ASM_BX),%_ASM_BX
66
- sub $3,%_ASM_BX
74
+SYM_FUNC_START(__put_user_4)
75
+ LOAD_TASK_SIZE_MINUS_N(3)
6776 cmp %_ASM_BX,%_ASM_CX
68
- jae bad_put_user
77
+ jae .Lbad_put_user
78
+SYM_INNER_LABEL(__put_user_nocheck_4, SYM_L_GLOBAL)
6979 ASM_STAC
7080 3: movl %eax,(%_ASM_CX)
71
- xor %eax,%eax
72
- EXIT
73
-ENDPROC(__put_user_4)
81
+ xor %ecx,%ecx
82
+ ASM_CLAC
83
+ RET
84
+SYM_FUNC_END(__put_user_4)
7485 EXPORT_SYMBOL(__put_user_4)
86
+EXPORT_SYMBOL(__put_user_nocheck_4)
7587
76
-ENTRY(__put_user_8)
77
- ENTER
78
- mov TASK_addr_limit(%_ASM_BX),%_ASM_BX
79
- sub $7,%_ASM_BX
88
+SYM_FUNC_START(__put_user_8)
89
+ LOAD_TASK_SIZE_MINUS_N(7)
8090 cmp %_ASM_BX,%_ASM_CX
81
- jae bad_put_user
91
+ jae .Lbad_put_user
92
+SYM_INNER_LABEL(__put_user_nocheck_8, SYM_L_GLOBAL)
8293 ASM_STAC
8394 4: mov %_ASM_AX,(%_ASM_CX)
8495 #ifdef CONFIG_X86_32
8596 5: movl %edx,4(%_ASM_CX)
8697 #endif
87
- xor %eax,%eax
88
- EXIT
89
-ENDPROC(__put_user_8)
98
+ xor %ecx,%ecx
99
+ ASM_CLAC
100
+ RET
101
+SYM_FUNC_END(__put_user_8)
90102 EXPORT_SYMBOL(__put_user_8)
103
+EXPORT_SYMBOL(__put_user_nocheck_8)
91104
92
-bad_put_user:
93
- movl $-EFAULT,%eax
94
- EXIT
95
-END(bad_put_user)
105
+SYM_CODE_START_LOCAL(.Lbad_put_user_clac)
106
+ ASM_CLAC
107
+.Lbad_put_user:
108
+ movl $-EFAULT,%ecx
109
+ RET
110
+SYM_CODE_END(.Lbad_put_user_clac)
96111
97
- _ASM_EXTABLE(1b,bad_put_user)
98
- _ASM_EXTABLE(2b,bad_put_user)
99
- _ASM_EXTABLE(3b,bad_put_user)
100
- _ASM_EXTABLE(4b,bad_put_user)
112
+ _ASM_EXTABLE_UA(1b, .Lbad_put_user_clac)
113
+ _ASM_EXTABLE_UA(2b, .Lbad_put_user_clac)
114
+ _ASM_EXTABLE_UA(3b, .Lbad_put_user_clac)
115
+ _ASM_EXTABLE_UA(4b, .Lbad_put_user_clac)
101116 #ifdef CONFIG_X86_32
102
- _ASM_EXTABLE(5b,bad_put_user)
117
+ _ASM_EXTABLE_UA(5b, .Lbad_put_user_clac)
103118 #endif