summaryrefslogtreecommitdiffstats
path: root/sys/arm
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-08-07 17:49:42 +0000
committerian <ian@FreeBSD.org>2014-08-07 17:49:42 +0000
commit50af577d2958463bdeba4a96c7de9bad571fed80 (patch)
tree2c82554d4cf6fb8e225ba047ee09efb9d8c676b6 /sys/arm
parente6e753558318cbcd315299f33f75e7fc2e23f0f0 (diff)
downloadFreeBSD-src-50af577d2958463bdeba4a96c7de9bad571fed80.zip
FreeBSD-src-50af577d2958463bdeba4a96c7de9bad571fed80.tar.gz
MFC r256691, r256748: casuword fixes
Use unsigned compare against KERNBASE addr. Use atomic ops on armv6.
Diffstat (limited to 'sys/arm')
-rw-r--r--sys/arm/arm/fusu.S16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/arm/arm/fusu.S b/sys/arm/arm/fusu.S
index 316962d..137bdf6 100644
--- a/sys/arm/arm/fusu.S
+++ b/sys/arm/arm/fusu.S
@@ -66,11 +66,27 @@ ENTRY(casuword)
stmfd sp!, {r4, r5}
adr r4, .Lcasuwordfault
str r4, [r3, #PCB_ONFAULT]
+#ifdef _ARM_ARCH_6
+1:
+ cmp r0, #KERNBASE
+ mvnhs r0, #0
+ bhs 2f
+
+ ldrex r5, [r0]
+ cmp r5, r1
+ movne r0, r5
+ bne 2f
+ strex r5, r2, [r0]
+ cmp r5, #0
+ bne 1b
+#else
ldrt r5, [r0]
cmp r5, r1
movne r0, r5
streqt r2, [r0]
+#endif
moveq r0, r1
+2:
ldmfd sp!, {r4, r5}
mov r1, #0x00000000
str r1, [r3, #PCB_ONFAULT]
OpenPOWER on IntegriCloud