Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/unicore32/include/asm/assembler.h
10818 views
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
132
133