Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
assembler.h
Go to the documentation of this file.
1 /*
2  * Based on arch/arm/include/asm/assembler.h
3  *
4  * Copyright (C) 1996-2000 Russell King
5  * Copyright (C) 2012 ARM Ltd.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 #ifndef __ASSEMBLY__
20 #error "Only include this from assembly code"
21 #endif
22 
23 #include <asm/ptrace.h>
24 
25 /*
26  * Stack pushing/popping (register pairs only). Equivalent to store decrement
27  * before, load increment after.
28  */
29  .macro push, xreg1, xreg2
30  stp \xreg1, \xreg2, [sp, #-16]!
31  .endm
32 
33  .macro pop, xreg1, xreg2
34  ldp \xreg1, \xreg2, [sp], #16
35  .endm
36 
37 /*
38  * Enable and disable interrupts.
39  */
40  .macro disable_irq
41  msr daifset, #2
42  .endm
43 
44  .macro enable_irq
45  msr daifclr, #2
46  .endm
47 
48 /*
49  * Save/disable and restore interrupts.
50  */
54  .endm
55 
56  .macro restore_irqs, olddaif
57  msr daif, \olddaif
58  .endm
59 
60 /*
61  * Enable and disable debug exceptions.
62  */
63  .macro disable_dbg
64  msr daifset, #8
65  .endm
66 
67  .macro enable_dbg
68  msr daifclr, #8
69  .endm
70 
71  .macro disable_step, tmp
73  bic \tmp, \tmp, #1
74  msr mdscr_el1, \tmp
75  .endm
76 
77  .macro enable_step, tmp
79  orr \tmp, \tmp, #1
80  msr mdscr_el1, \tmp
81  .endm
82 
85  tbnz \tmp, #1, 9990f
87 9990:
88  .endm
89 
90 /*
91  * SMP data memory barrier
92  */
93  .macro smp_dmb, opt
94 #ifdef CONFIG_SMP
95  dmb \opt
96 #endif
97  .endm
98 
99 #define USER(l, x...) \
100 9999: x; \
101  .section __ex_table,"a"; \
102  .align 3; \
103  .quad 9999b,l; \
104  .previous
105 
106 /*
107  * Register aliases.
108  */
109 lr .req x30 // link register