|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.12] xen/arm64: bitops: Rewrite bitop helpers in C
commit 1625ff3ea84357690741bcdb19daf8be5e61fe00
Author: Julien Grall <julien.grall@xxxxxxx>
AuthorDate: Mon Apr 29 15:05:18 2019 +0100
Commit: Julien Grall <julien.grall@xxxxxxx>
CommitDate: Fri Jun 14 14:32:19 2019 +0100
xen/arm64: bitops: Rewrite bitop helpers in C
This is part of XSA-295.
Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
---
xen/arch/arm/README.LinuxPrimitives | 1 -
xen/arch/arm/arm64/lib/bitops.S | 67 ---------------------------
xen/arch/arm/arm64/lib/bitops.c | 90 +++++++++++++++++++++++++++++++++++++
3 files changed, 90 insertions(+), 68 deletions(-)
diff --git a/xen/arch/arm/README.LinuxPrimitives
b/xen/arch/arm/README.LinuxPrimitives
index 028e8721f9..891667a5da 100644
--- a/xen/arch/arm/README.LinuxPrimitives
+++ b/xen/arch/arm/README.LinuxPrimitives
@@ -8,7 +8,6 @@ arm64:
bitops: last sync @ v3.16-rc6 (last commit: 8715466b6027)
-linux/arch/arm64/lib/bitops.S xen/arch/arm/arm64/lib/bitops.S
linux/arch/arm64/include/asm/bitops.h xen/include/asm-arm/arm64/bitops.h
---------------------------------------------------------------------
diff --git a/xen/arch/arm/arm64/lib/bitops.S b/xen/arch/arm/arm64/lib/bitops.S
deleted file mode 100644
index 6471dd1875..0000000000
--- a/xen/arch/arm/arm64/lib/bitops.S
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Based on linux/arch/arm64/lib/bitops.h which in turn is
- * Based on arch/arm/lib/bitops.h
- *
- * Copyright (C) 2013 ARM Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * x0: bits 4:0 bit offset
- * bits 31:5 word offset
- * x1: address
- */
- .macro bitop, name, instr
-ENTRY( \name )
- and w3, w0, #31 // Get bit offset
- eor w0, w0, w3 // Clear low bits
- mov x2, #1
- add x1, x1, x0, lsr #3 // Get word offset
- lsl x3, x2, x3 // Create mask
-1: ldxr w2, [x1]
- \instr w2, w2, w3
- stxr w0, w2, [x1]
- cbnz w0, 1b
- ret
-ENDPROC(\name )
- .endm
-
- .macro testop, name, instr
-ENTRY( \name )
- and w3, w0, #31 // Get bit offset
- eor w0, w0, w3 // Clear low bits
- mov x2, #1
- add x1, x1, x0, lsr #3 // Get word offset
- lsl x4, x2, x3 // Create mask
-1: ldxr w2, [x1]
- lsr w0, w2, w3 // Save old value of bit
- \instr w2, w2, w4 // toggle bit
- stlxr w5, w2, [x1]
- cbnz w5, 1b
- dmb ish
- and w0, w0, #1
-3: ret
-ENDPROC(\name )
- .endm
-
-/*
- * Atomic bit operations.
- */
- bitop change_bit, eor
- bitop clear_bit, bic
- bitop set_bit, orr
-
- testop test_and_change_bit, eor
- testop test_and_clear_bit, bic
- testop test_and_set_bit, orr
diff --git a/xen/arch/arm/arm64/lib/bitops.c b/xen/arch/arm/arm64/lib/bitops.c
new file mode 100644
index 0000000000..b1c681c642
--- /dev/null
+++ b/xen/arch/arm/arm64/lib/bitops.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2018 ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <xen/bitops.h>
+#include <asm/system.h>
+
+/*
+ * The atomic bit operations pass the number of bit in a signed number
+ * (not sure why). This has the drawback to increase the complexity of
+ * the resulting assembly.
+ *
+ * To generate simpler code, the number of bit (nr) will be cast to
+ * unsigned int.
+ *
+ * XXX: Rework the interface to use unsigned int.
+ */
+
+#define bitop(name, instr) \
+void name(int nr, volatile void *p) \
+{ \
+ volatile uint32_t *ptr = (uint32_t *)p + BIT_WORD((unsigned int)nr); \
+ const uint32_t mask = BIT_MASK((unsigned int)nr); \
+ unsigned long res, tmp; \
+ \
+ do \
+ { \
+ asm volatile ("// " __stringify(name) "\n" \
+ " ldxr %w2, %1\n" \
+ " " __stringify(instr) " %w2, %w2, %w3\n" \
+ " stxr %w0, %w2, %1\n" \
+ : "=&r" (res), "+Q" (*ptr), "=&r" (tmp) \
+ : "r" (mask)); \
+ } while ( res ); \
+} \
+
+#define testop(name, instr) \
+int name(int nr, volatile void *p) \
+{ \
+ volatile uint32_t *ptr = (uint32_t *)p + BIT_WORD((unsigned int)nr); \
+ unsigned int bit = (unsigned int)nr % BITS_PER_WORD; \
+ const uint32_t mask = BIT_MASK(bit); \
+ unsigned long res, tmp; \
+ unsigned long oldbit; \
+ \
+ do \
+ { \
+ asm volatile ("// " __stringify(name) "\n" \
+ " ldxr %w3, %2\n" \
+ " lsr %w1, %w3, %w5 // Save old value of bit\n" \
+ " " __stringify(instr) " %w3, %w3, %w4 // Toggle bit\n" \
+ " stlxr %w0, %w3, %2\n" \
+ : "=&r" (res), "=&r" (oldbit), "+Q" (*ptr), "=&r" (tmp) \
+ : "r" (mask), "r" (bit) \
+ : "memory"); \
+ } while ( res ); \
+ \
+ dmb(ish); \
+ \
+ return oldbit & 1; \
+}
+
+bitop(change_bit, eor)
+bitop(clear_bit, bic)
+bitop(set_bit, orr)
+
+testop(test_and_change_bit, eor)
+testop(test_and_clear_bit, bic)
+testop(test_and_set_bit, orr)
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.12
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |