KVM: emulator: emulate SALC
[firefly-linux-kernel-4.4.55.git] / arch / arm64 / lib / bitops.S
1 /*
2  * Based on arch/arm/lib/bitops.h
3  *
4  * Copyright (C) 2013 ARM Ltd.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <linux/linkage.h>
20 #include <asm/assembler.h>
21
22 /*
23  * x0: bits 5:0  bit offset
24  *     bits 63:6 word offset
25  * x1: address
26  */
27         .macro  bitop, name, instr
28 ENTRY(  \name   )
29         and     x3, x0, #63             // Get bit offset
30         eor     x0, x0, x3              // Clear low bits
31         mov     x2, #1
32         add     x1, x1, x0, lsr #3      // Get word offset
33         lsl     x3, x2, x3              // Create mask
34 1:      ldxr    x2, [x1]
35         \instr  x2, x2, x3
36         stxr    w0, x2, [x1]
37         cbnz    w0, 1b
38         ret
39 ENDPROC(\name   )
40         .endm
41
42         .macro  testop, name, instr
43 ENTRY(  \name   )
44         and     x3, x0, #63             // Get bit offset
45         eor     x0, x0, x3              // Clear low bits
46         mov     x2, #1
47         add     x1, x1, x0, lsr #3      // Get word offset
48         lsl     x4, x2, x3              // Create mask
49 1:      ldaxr   x2, [x1]
50         lsr     x0, x2, x3              // Save old value of bit
51         \instr  x2, x2, x4              // toggle bit
52         stlxr   w5, x2, [x1]
53         cbnz    w5, 1b
54         and     x0, x0, #1
55 3:      ret
56 ENDPROC(\name   )
57         .endm
58
59 /*
60  * Atomic bit operations.
61  */
62         bitop   change_bit, eor
63         bitop   clear_bit, bic
64         bitop   set_bit, orr
65
66         testop  test_and_change_bit, eor
67         testop  test_and_clear_bit, bic
68         testop  test_and_set_bit, orr