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