1 #ifndef _ASM_SCORE_ASMMACRO_H
2 #define _ASM_SCORE_ASMMACRO_H
3 
4 #include <asm/asm-offsets.h>
5 
6 #ifdef __ASSEMBLY__
7 
8 .macro	SAVE_ALL
9 	mfcr	r30, cr0
10 	mv	r31, r0
11 	nop
12 	/* if UMs == 1, change stack. */
13 	slli.c	r30, r30, 28
14 	bpl	1f
15 	la	r31, kernelsp
16 	lw	r31, [r31]
17 1:
18 	mv	r30, r0
19 	addri	r0, r31, -PT_SIZE
20 
21 	sw	r30, [r0, PT_R0]
22 	.set	r1
23 	sw	r1, [r0, PT_R1]
24 	.set	nor1
25 	sw	r2, [r0, PT_R2]
26 	sw	r3, [r0, PT_R3]
27 	sw	r4, [r0, PT_R4]
28 	sw	r5, [r0, PT_R5]
29 	sw	r6, [r0, PT_R6]
30 	sw	r7, [r0, PT_R7]
31 
32 	sw	r8, [r0, PT_R8]
33 	sw	r9, [r0, PT_R9]
34 	sw	r10, [r0, PT_R10]
35 	sw	r11, [r0, PT_R11]
36 	sw	r12, [r0, PT_R12]
37 	sw	r13, [r0, PT_R13]
38 	sw	r14, [r0, PT_R14]
39 	sw	r15, [r0, PT_R15]
40 
41 	sw	r16, [r0, PT_R16]
42 	sw	r17, [r0, PT_R17]
43 	sw	r18, [r0, PT_R18]
44 	sw	r19, [r0, PT_R19]
45 	sw	r20, [r0, PT_R20]
46 	sw	r21, [r0, PT_R21]
47 	sw	r22, [r0, PT_R22]
48 	sw	r23, [r0, PT_R23]
49 
50 	sw	r24, [r0, PT_R24]
51 	sw	r25, [r0, PT_R25]
52 	sw	r25, [r0, PT_R25]
53 	sw	r26, [r0, PT_R26]
54 	sw	r27, [r0, PT_R27]
55 
56 	sw	r28, [r0, PT_R28]
57 	sw	r29, [r0, PT_R29]
58 	orri	r28, r0, 0x1fff
59 	li	r31, 0x00001fff
60 	xor	r28, r28, r31
61 
62 	mfcehl	r30, r31
63 	sw	r30, [r0, PT_CEH]
64 	sw	r31, [r0, PT_CEL]
65 
66 	mfcr	r31, cr0
67 	sw	r31, [r0, PT_PSR]
68 
69 	mfcr	r31, cr1
70 	sw	r31, [r0, PT_CONDITION]
71 
72 	mfcr	r31, cr2
73 	sw	r31, [r0, PT_ECR]
74 
75 	mfcr	r31, cr5
76 	srli	r31, r31, 1
77 	slli	r31, r31, 1
78 	sw	r31, [r0, PT_EPC]
79 .endm
80 
81 .macro	RESTORE_ALL_AND_RET
82 	mfcr	r30, cr0
83 	srli	r30, r30, 1
84 	slli	r30, r30, 1
85 	mtcr	r30, cr0
86 	nop
87 	nop
88 	nop
89 	nop
90 	nop
91 
92 	.set	r1
93 	ldis	r1, 0x00ff
94 	and	r30, r30, r1
95 	not	r1, r1
96 	lw	r31, [r0, PT_PSR]
97 	and	r31, r31, r1
98 	.set	nor1
99 	or	r31, r31, r30
100 	mtcr	r31, cr0
101 	nop
102 	nop
103 	nop
104 	nop
105 	nop
106 
107 	lw	r30, [r0, PT_CONDITION]
108 	mtcr	r30, cr1
109 	nop
110 	nop
111 	nop
112 	nop
113 	nop
114 
115 	lw	r30, [r0, PT_CEH]
116 	lw	r31, [r0, PT_CEL]
117 	mtcehl	r30, r31
118 
119 	.set	r1
120 	lw	r1, [r0, PT_R1]
121 	.set	nor1
122 	lw	r2, [r0, PT_R2]
123 	lw	r3, [r0, PT_R3]
124 	lw	r4, [r0, PT_R4]
125 	lw	r5, [r0, PT_R5]
126 	lw	r6, [r0, PT_R6]
127 	lw	r7, [r0, PT_R7]
128 
129 	lw	r8, [r0, PT_R8]
130 	lw	r9, [r0, PT_R9]
131 	lw	r10, [r0, PT_R10]
132 	lw	r11, [r0, PT_R11]
133 	lw	r12, [r0, PT_R12]
134 	lw	r13, [r0, PT_R13]
135 	lw	r14, [r0, PT_R14]
136 	lw	r15, [r0, PT_R15]
137 
138 	lw	r16, [r0, PT_R16]
139 	lw	r17, [r0, PT_R17]
140 	lw	r18, [r0, PT_R18]
141 	lw	r19, [r0, PT_R19]
142 	lw	r20, [r0, PT_R20]
143 	lw	r21, [r0, PT_R21]
144 	lw	r22, [r0, PT_R22]
145 	lw	r23, [r0, PT_R23]
146 
147 	lw	r24, [r0, PT_R24]
148 	lw	r25, [r0, PT_R25]
149 	lw	r26, [r0, PT_R26]
150 	lw	r27, [r0, PT_R27]
151 	lw	r28, [r0, PT_R28]
152 	lw	r29, [r0, PT_R29]
153 
154 	lw	r30, [r0, PT_EPC]
155 	lw	r0, [r0, PT_R0]
156 	mtcr	r30, cr5
157 	rte
158 .endm
159 
160 #endif /* __ASSEMBLY__ */
161 #endif /* _ASM_SCORE_ASMMACRO_H */
162