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  * linux/arch/unicore32/include/asm/assembler.h
3  *
4  * Code specific to PKUnity SoC and UniCore ISA
5  *
6  * Copyright (C) 2001-2010 GUAN Xue-tao
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12  * Do not include any C declarations in this file - it is included by
13  * assembler source.
14  */
15 #ifndef __ASSEMBLY__
16 #error "Only include this from assembly code"
17 #endif
18 
19 #include <asm/ptrace.h>
20 
21 /*
22  * Little Endian independent macros for shifting bytes within registers.
23  */
24 #define pull >>
25 #define push <<
26 #define get_byte_0 << #0
27 #define get_byte_1 >> #8
28 #define get_byte_2 >> #16
29 #define get_byte_3 >> #24
30 #define put_byte_0 << #0
31 #define put_byte_1 << #8
32 #define put_byte_2 << #16
33 #define put_byte_3 << #24
34 
35 #define cadd cmpadd
36 #define cand cmpand
37 #define csub cmpsub
38 #define cxor cmpxor
39 
40 /*
41  * Enable and disable interrupts
42  */
43  .macro disable_irq, temp
44  mov \temp, asr
45  andn \temp, \temp, #0xFF
46  or \temp, \temp, #PSR_I_BIT | PRIV_MODE
47  mov.a asr, \temp
48  .endm
49 
50  .macro enable_irq, temp
51  mov \temp, asr
52  andn \temp, \temp, #0xFF
53  or \temp, \temp, #PRIV_MODE
54  mov.a asr, \temp
55  .endm
56 
57 #define USER(x...) \
58 9999: x; \
59  .pushsection __ex_table, "a"; \
60  .align 3; \
61  .long 9999b, 9001f; \
62  .popsection
63 
64  .macro notcond, cond, nexti = .+8
65  .ifc \cond, eq
66  bne \nexti
67  .else; .ifc \cond, ne
68  beq \nexti
69  .else; .ifc \cond, ea
70  bub \nexti
71  .else; .ifc \cond, ub
72  bea \nexti
73  .else; .ifc \cond, fs
74  bns \nexti
75  .else; .ifc \cond, ns
76  bfs \nexti
77  .else; .ifc \cond, fv
78  bnv \nexti
79  .else; .ifc \cond, nv
80  bfv \nexti
81  .else; .ifc \cond, ua
82  beb \nexti
83  .else; .ifc \cond, eb
84  bua \nexti
85  .else; .ifc \cond, eg
86  bsl \nexti
87  .else; .ifc \cond, sl
88  beg \nexti
89  .else; .ifc \cond, sg
90  bel \nexti
91  .else; .ifc \cond, el
92  bsg \nexti
93  .else; .ifnc \cond, al
94  .error "Unknown cond in notcond macro argument"
95  .endif; .endif; .endif; .endif; .endif; .endif; .endif
96  .endif; .endif; .endif; .endif; .endif; .endif; .endif
97  .endif
98  .endm
99 
101  .rept \rept
102  notcond \cond, .+8
103 9999 :
104  .if \inc == 1
105  \instr\()b.u \reg, [\ptr], #\inc
106  .elseif \inc == 4
107  \instr\()w.u \reg, [\ptr], #\inc
108  .else
109  .error "Unsupported inc macro argument"
110  .endif
111 
112  .pushsection __ex_table, "a"
113  .align 3
114  .long 9999b, \abort
115  .popsection
116  .endr
117  .endm
118 
119  .macro strusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f
120  usracc st, \reg, \ptr, \inc, \cond, \rept, \abort
121  .endm
122 
123  .macro ldrusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f
124  usracc ld, \reg, \ptr, \inc, \cond, \rept, \abort
125  .endm
126 
127  .macro nop8
128  .rept 8
129  nop
130  .endr
131  .endm