hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/arch/nios2/include/asm/uaccess.h
....@@ -26,18 +26,17 @@
2626 #define USER_DS MAKE_MM_SEG(0x80000000UL)
2727 #define KERNEL_DS MAKE_MM_SEG(0)
2828
29
-#define get_ds() (KERNEL_DS)
3029
3130 #define get_fs() (current_thread_info()->addr_limit)
3231 #define set_fs(seg) (current_thread_info()->addr_limit = (seg))
3332
34
-#define segment_eq(a, b) ((a).seg == (b).seg)
33
+#define uaccess_kernel() (get_fs().seg == KERNEL_DS.seg)
3534
3635 #define __access_ok(addr, len) \
3736 (((signed long)(((long)get_fs().seg) & \
3837 ((long)(addr) | (((long)(addr)) + (len)) | (len)))) == 0)
3938
40
-#define access_ok(type, addr, len) \
39
+#define access_ok(addr, len) \
4140 likely(__access_ok((unsigned long)(addr), (unsigned long)(len)))
4241
4342 # define __EX_TABLE_SECTION ".section __ex_table,\"a\"\n"
....@@ -70,7 +69,7 @@
7069 static inline unsigned long __must_check clear_user(void __user *to,
7170 unsigned long n)
7271 {
73
- if (!access_ok(VERIFY_WRITE, to, n))
72
+ if (!access_ok(to, n))
7473 return n;
7574 return __clear_user(to, n);
7675 }
....@@ -90,6 +89,7 @@
9089 /* Optimized macros */
9190 #define __get_user_asm(val, insn, addr, err) \
9291 { \
92
+ unsigned long __gu_val; \
9393 __asm__ __volatile__( \
9494 " movi %0, %3\n" \
9595 "1: " insn " %1, 0(%2)\n" \
....@@ -98,14 +98,20 @@
9898 " .section __ex_table,\"a\"\n" \
9999 " .word 1b, 2b\n" \
100100 " .previous" \
101
- : "=&r" (err), "=r" (val) \
101
+ : "=&r" (err), "=r" (__gu_val) \
102102 : "r" (addr), "i" (-EFAULT)); \
103
+ val = (__force __typeof__(*(addr)))__gu_val; \
103104 }
104105
105
-#define __get_user_unknown(val, size, ptr, err) do { \
106
+extern void __get_user_unknown(void);
107
+
108
+#define __get_user_8(val, ptr, err) do { \
109
+ u64 __val = 0; \
106110 err = 0; \
107
- if (__copy_from_user(&(val), ptr, size)) { \
111
+ if (raw_copy_from_user(&(__val), ptr, sizeof(val))) { \
108112 err = -EFAULT; \
113
+ } else { \
114
+ val = (typeof(val))(typeof((val) - (val)))__val; \
109115 } \
110116 } while (0)
111117
....@@ -121,8 +127,11 @@
121127 case 4: \
122128 __get_user_asm(val, "ldw", ptr, err); \
123129 break; \
130
+ case 8: \
131
+ __get_user_8(val, ptr, err); \
132
+ break; \
124133 default: \
125
- __get_user_unknown(val, size, ptr, err); \
134
+ __get_user_unknown(); \
126135 break; \
127136 } \
128137 } while (0)
....@@ -131,9 +140,7 @@
131140 ({ \
132141 long __gu_err = -EFAULT; \
133142 const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
134
- unsigned long __gu_val = 0; \
135
- __get_user_common(__gu_val, sizeof(*(ptr)), __gu_ptr, __gu_err);\
136
- (x) = (__force __typeof__(x))__gu_val; \
143
+ __get_user_common(x, sizeof(*(ptr)), __gu_ptr, __gu_err); \
137144 __gu_err; \
138145 })
139146
....@@ -141,11 +148,9 @@
141148 ({ \
142149 long __gu_err = -EFAULT; \
143150 const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
144
- unsigned long __gu_val = 0; \
145
- if (access_ok(VERIFY_READ, __gu_ptr, sizeof(*__gu_ptr))) \
146
- __get_user_common(__gu_val, sizeof(*__gu_ptr), \
151
+ if (access_ok( __gu_ptr, sizeof(*__gu_ptr))) \
152
+ __get_user_common(x, sizeof(*__gu_ptr), \
147153 __gu_ptr, __gu_err); \
148
- (x) = (__force __typeof__(x))__gu_val; \
149154 __gu_err; \
150155 })
151156
....@@ -168,7 +173,7 @@
168173 long __pu_err = -EFAULT; \
169174 __typeof__(*(ptr)) __user *__pu_ptr = (ptr); \
170175 __typeof__(*(ptr)) __pu_val = (__typeof(*ptr))(x); \
171
- if (access_ok(VERIFY_WRITE, __pu_ptr, sizeof(*__pu_ptr))) { \
176
+ if (access_ok(__pu_ptr, sizeof(*__pu_ptr))) { \
172177 switch (sizeof(*__pu_ptr)) { \
173178 case 1: \
174179 __put_user_asm(__pu_val, "stb", __pu_ptr, __pu_err); \