hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/arch/powerpc/include/asm/futex.h
....@@ -8,14 +8,12 @@
88 #include <linux/uaccess.h>
99 #include <asm/errno.h>
1010 #include <asm/synch.h>
11
-#include <asm/asm-405.h>
1211
1312 #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \
1413 __asm__ __volatile ( \
1514 PPC_ATOMIC_ENTRY_BARRIER \
1615 "1: lwarx %0,0,%2\n" \
1716 insn \
18
- PPC405_ERR77(0, %2) \
1917 "2: stwcx. %1,0,%2\n" \
2018 "bne- 1b\n" \
2119 PPC_ATOMIC_EXIT_BARRIER \
....@@ -35,8 +33,9 @@
3533 {
3634 int oldval = 0, ret;
3735
38
- allow_write_to_user(uaddr, sizeof(*uaddr));
39
- pagefault_disable();
36
+ if (!access_ok(uaddr, sizeof(u32)))
37
+ return -EFAULT;
38
+ allow_read_write_user(uaddr, uaddr, sizeof(*uaddr));
4039
4140 switch (op) {
4241 case FUTEX_OP_SET:
....@@ -58,11 +57,9 @@
5857 ret = -ENOSYS;
5958 }
6059
61
- pagefault_enable();
62
-
6360 *oval = oldval;
6461
65
- prevent_write_to_user(uaddr, sizeof(*uaddr));
62
+ prevent_read_write_user(uaddr, uaddr, sizeof(*uaddr));
6663 return ret;
6764 }
6865
....@@ -73,16 +70,16 @@
7370 int ret = 0;
7471 u32 prev;
7572
76
- if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
73
+ if (!access_ok(uaddr, sizeof(u32)))
7774 return -EFAULT;
7875
79
- allow_write_to_user(uaddr, sizeof(*uaddr));
76
+ allow_read_write_user(uaddr, uaddr, sizeof(*uaddr));
77
+
8078 __asm__ __volatile__ (
8179 PPC_ATOMIC_ENTRY_BARRIER
8280 "1: lwarx %1,0,%3 # futex_atomic_cmpxchg_inatomic\n\
8381 cmpw 0,%1,%4\n\
8482 bne- 3f\n"
85
- PPC405_ERR77(0,%3)
8683 "2: stwcx. %5,0,%3\n\
8784 bne- 1b\n"
8885 PPC_ATOMIC_EXIT_BARRIER
....@@ -97,7 +94,8 @@
9794 : "cc", "memory");
9895
9996 *uval = prev;
100
- prevent_write_to_user(uaddr, sizeof(*uaddr));
97
+ prevent_read_write_user(uaddr, uaddr, sizeof(*uaddr));
98
+
10199 return ret;
102100 }
103101