Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / unicore32 / include / asm / assembler.h
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
100         .macro  usracc, instr, reg, ptr, inc, cond, rept, abort
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