| .. | .. |
|---|
| 16 | 16 | #include <asm/barrier.h> |
|---|
| 17 | 17 | #include <asm/compiler.h> |
|---|
| 18 | 18 | #include <asm/errno.h> |
|---|
| 19 | +#include <asm/sync.h> |
|---|
| 19 | 20 | #include <asm/war.h> |
|---|
| 20 | 21 | |
|---|
| 21 | 22 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ |
|---|
| 22 | 23 | { \ |
|---|
| 23 | | - if (cpu_has_llsc && R10000_LLSC_WAR) { \ |
|---|
| 24 | + if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) { \ |
|---|
| 24 | 25 | __asm__ __volatile__( \ |
|---|
| 25 | 26 | " .set push \n" \ |
|---|
| 26 | 27 | " .set noat \n" \ |
|---|
| 28 | + " .set push \n" \ |
|---|
| 27 | 29 | " .set arch=r4000 \n" \ |
|---|
| 28 | 30 | "1: ll %1, %4 # __futex_atomic_op \n" \ |
|---|
| 29 | | - " .set mips0 \n" \ |
|---|
| 31 | + " .set pop \n" \ |
|---|
| 30 | 32 | " " insn " \n" \ |
|---|
| 31 | 33 | " .set arch=r4000 \n" \ |
|---|
| 32 | 34 | "2: sc $1, %2 \n" \ |
|---|
| 33 | 35 | " beqzl $1, 1b \n" \ |
|---|
| 34 | | - __WEAK_LLSC_MB \ |
|---|
| 36 | + __stringify(__WEAK_LLSC_MB) " \n" \ |
|---|
| 35 | 37 | "3: \n" \ |
|---|
| 36 | 38 | " .insn \n" \ |
|---|
| 37 | 39 | " .set pop \n" \ |
|---|
| 38 | | - " .set mips0 \n" \ |
|---|
| 39 | 40 | " .section .fixup,\"ax\" \n" \ |
|---|
| 40 | 41 | "4: li %0, %6 \n" \ |
|---|
| 41 | 42 | " j 3b \n" \ |
|---|
| .. | .. |
|---|
| 53 | 54 | __asm__ __volatile__( \ |
|---|
| 54 | 55 | " .set push \n" \ |
|---|
| 55 | 56 | " .set noat \n" \ |
|---|
| 57 | + " .set push \n" \ |
|---|
| 56 | 58 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ |
|---|
| 59 | + " " __SYNC(full, loongson3_war) " \n" \ |
|---|
| 57 | 60 | "1: "user_ll("%1", "%4")" # __futex_atomic_op\n" \ |
|---|
| 58 | | - " .set mips0 \n" \ |
|---|
| 61 | + " .set pop \n" \ |
|---|
| 59 | 62 | " " insn " \n" \ |
|---|
| 60 | 63 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ |
|---|
| 61 | 64 | "2: "user_sc("$1", "%2")" \n" \ |
|---|
| 62 | 65 | " beqz $1, 1b \n" \ |
|---|
| 63 | | - __WEAK_LLSC_MB \ |
|---|
| 66 | + __stringify(__WEAK_LLSC_MB) " \n" \ |
|---|
| 64 | 67 | "3: \n" \ |
|---|
| 65 | 68 | " .insn \n" \ |
|---|
| 66 | 69 | " .set pop \n" \ |
|---|
| 67 | | - " .set mips0 \n" \ |
|---|
| 68 | 70 | " .section .fixup,\"ax\" \n" \ |
|---|
| 69 | 71 | "4: li %0, %6 \n" \ |
|---|
| 70 | 72 | " j 3b \n" \ |
|---|
| .. | .. |
|---|
| 87 | 89 | { |
|---|
| 88 | 90 | int oldval = 0, ret; |
|---|
| 89 | 91 | |
|---|
| 90 | | - pagefault_disable(); |
|---|
| 92 | + if (!access_ok(uaddr, sizeof(u32))) |
|---|
| 93 | + return -EFAULT; |
|---|
| 91 | 94 | |
|---|
| 92 | 95 | switch (op) { |
|---|
| 93 | 96 | case FUTEX_OP_SET: |
|---|
| .. | .. |
|---|
| 114 | 117 | ret = -ENOSYS; |
|---|
| 115 | 118 | } |
|---|
| 116 | 119 | |
|---|
| 117 | | - pagefault_enable(); |
|---|
| 118 | | - |
|---|
| 119 | 120 | if (!ret) |
|---|
| 120 | 121 | *oval = oldval; |
|---|
| 121 | 122 | |
|---|
| .. | .. |
|---|
| 129 | 130 | int ret = 0; |
|---|
| 130 | 131 | u32 val; |
|---|
| 131 | 132 | |
|---|
| 132 | | - if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) |
|---|
| 133 | + if (!access_ok(uaddr, sizeof(u32))) |
|---|
| 133 | 134 | return -EFAULT; |
|---|
| 134 | 135 | |
|---|
| 135 | | - if (cpu_has_llsc && R10000_LLSC_WAR) { |
|---|
| 136 | + if (cpu_has_llsc && IS_ENABLED(CONFIG_WAR_R10000_LLSC)) { |
|---|
| 136 | 137 | __asm__ __volatile__( |
|---|
| 137 | 138 | "# futex_atomic_cmpxchg_inatomic \n" |
|---|
| 138 | 139 | " .set push \n" |
|---|
| 139 | 140 | " .set noat \n" |
|---|
| 141 | + " .set push \n" |
|---|
| 140 | 142 | " .set arch=r4000 \n" |
|---|
| 141 | 143 | "1: ll %1, %3 \n" |
|---|
| 142 | 144 | " bne %1, %z4, 3f \n" |
|---|
| 143 | | - " .set mips0 \n" |
|---|
| 145 | + " .set pop \n" |
|---|
| 144 | 146 | " move $1, %z5 \n" |
|---|
| 145 | 147 | " .set arch=r4000 \n" |
|---|
| 146 | 148 | "2: sc $1, %2 \n" |
|---|
| 147 | 149 | " beqzl $1, 1b \n" |
|---|
| 148 | | - __WEAK_LLSC_MB |
|---|
| 150 | + __stringify(__WEAK_LLSC_MB) " \n" |
|---|
| 149 | 151 | "3: \n" |
|---|
| 150 | 152 | " .insn \n" |
|---|
| 151 | 153 | " .set pop \n" |
|---|
| .. | .. |
|---|
| 166 | 168 | "# futex_atomic_cmpxchg_inatomic \n" |
|---|
| 167 | 169 | " .set push \n" |
|---|
| 168 | 170 | " .set noat \n" |
|---|
| 171 | + " .set push \n" |
|---|
| 169 | 172 | " .set "MIPS_ISA_ARCH_LEVEL" \n" |
|---|
| 173 | + " " __SYNC(full, loongson3_war) " \n" |
|---|
| 170 | 174 | "1: "user_ll("%1", "%3")" \n" |
|---|
| 171 | 175 | " bne %1, %z4, 3f \n" |
|---|
| 172 | | - " .set mips0 \n" |
|---|
| 176 | + " .set pop \n" |
|---|
| 173 | 177 | " move $1, %z5 \n" |
|---|
| 174 | 178 | " .set "MIPS_ISA_ARCH_LEVEL" \n" |
|---|
| 175 | 179 | "2: "user_sc("$1", "%2")" \n" |
|---|
| 176 | 180 | " beqz $1, 1b \n" |
|---|
| 177 | | - __WEAK_LLSC_MB |
|---|
| 178 | | - "3: \n" |
|---|
| 181 | + "3: " __SYNC_ELSE(full, loongson3_war, __WEAK_LLSC_MB) "\n" |
|---|
| 179 | 182 | " .insn \n" |
|---|
| 180 | 183 | " .set pop \n" |
|---|
| 181 | 184 | " .section .fixup,\"ax\" \n" |
|---|