[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging-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#staging-4.12 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |