Merge tag 'mpc85xx-for-v2018.11-rc1' of git://git.denx.de/u-boot-mpc85xx
[oweals/u-boot.git] / arch / mips / lib / genex.S
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle
4  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
5  * Copyright (C) 2002, 2007  Maciej W. Rozycki
6  * Copyright (C) 2001, 2012 MIPS Technologies, Inc.  All rights reserved.
7  */
8
9 #include <asm/asm.h>
10 #include <asm/regdef.h>
11 #include <asm/mipsregs.h>
12 #include <asm/asm-offsets.h>
13
14 #define STATMASK 0x1f
15
16         .set    noreorder
17
18         /*
19          * Macros copied and adapted from Linux MIPS
20          */
21         .macro  SAVE_AT
22         .set    push
23         .set    noat
24         LONG_S  $1, PT_R1(sp)
25         .set    pop
26         .endm
27
28         .macro  SAVE_TEMP
29 #if __mips_isa_rev < 6
30         mfhi    v1
31 #endif
32 #ifdef CONFIG_32BIT
33         LONG_S  $8, PT_R8(sp)
34         LONG_S  $9, PT_R9(sp)
35 #endif
36         LONG_S  $10, PT_R10(sp)
37         LONG_S  $11, PT_R11(sp)
38         LONG_S  $12, PT_R12(sp)
39 #if __mips_isa_rev < 6
40         LONG_S  v1, PT_HI(sp)
41         mflo    v1
42 #endif
43         LONG_S  $13, PT_R13(sp)
44         LONG_S  $14, PT_R14(sp)
45         LONG_S  $15, PT_R15(sp)
46         LONG_S  $24, PT_R24(sp)
47 #if __mips_isa_rev < 6
48         LONG_S  v1, PT_LO(sp)
49 #endif
50         .endm
51
52         .macro  SAVE_STATIC
53         LONG_S  $16, PT_R16(sp)
54         LONG_S  $17, PT_R17(sp)
55         LONG_S  $18, PT_R18(sp)
56         LONG_S  $19, PT_R19(sp)
57         LONG_S  $20, PT_R20(sp)
58         LONG_S  $21, PT_R21(sp)
59         LONG_S  $22, PT_R22(sp)
60         LONG_S  $23, PT_R23(sp)
61         LONG_S  $30, PT_R30(sp)
62         .endm
63
64         .macro  SAVE_SOME
65         .set    push
66         .set    noat
67         PTR_SUBU k1, sp, PT_SIZE
68         LONG_S  sp, PT_R29(k1)
69         move    sp, k1
70
71         LONG_S  $3, PT_R3(sp)
72         LONG_S  $0, PT_R0(sp)
73         mfc0    v1, CP0_STATUS
74         LONG_S  $2, PT_R2(sp)
75         LONG_S  v1, PT_STATUS(sp)
76         LONG_S  $4, PT_R4(sp)
77         mfc0    v1, CP0_CAUSE
78         LONG_S  $5, PT_R5(sp)
79         LONG_S  v1, PT_CAUSE(sp)
80         LONG_S  $6, PT_R6(sp)
81         MFC0    v1, CP0_EPC
82         LONG_S  $7, PT_R7(sp)
83 #ifdef CONFIG_64BIT
84         LONG_S  $8, PT_R8(sp)
85         LONG_S  $9, PT_R9(sp)
86 #endif
87         LONG_S  v1, PT_EPC(sp)
88         LONG_S  $25, PT_R25(sp)
89         LONG_S  $28, PT_R28(sp)
90         LONG_S  $31, PT_R31(sp)
91         .set    pop
92         .endm
93
94         .macro  RESTORE_AT
95         .set    push
96         .set    noat
97         LONG_L  $1,  PT_R1(sp)
98         .set    pop
99         .endm
100
101         .macro  RESTORE_TEMP
102 #if __mips_isa_rev < 6
103         LONG_L  $24, PT_LO(sp)
104         mtlo    $24
105         LONG_L  $24, PT_HI(sp)
106         mthi    $24
107 #endif
108 #ifdef CONFIG_32BIT
109         LONG_L  $8, PT_R8(sp)
110         LONG_L  $9, PT_R9(sp)
111 #endif
112         LONG_L  $10, PT_R10(sp)
113         LONG_L  $11, PT_R11(sp)
114         LONG_L  $12, PT_R12(sp)
115         LONG_L  $13, PT_R13(sp)
116         LONG_L  $14, PT_R14(sp)
117         LONG_L  $15, PT_R15(sp)
118         LONG_L  $24, PT_R24(sp)
119         .endm
120
121         .macro  RESTORE_STATIC
122         LONG_L  $16, PT_R16(sp)
123         LONG_L  $17, PT_R17(sp)
124         LONG_L  $18, PT_R18(sp)
125         LONG_L  $19, PT_R19(sp)
126         LONG_L  $20, PT_R20(sp)
127         LONG_L  $21, PT_R21(sp)
128         LONG_L  $22, PT_R22(sp)
129         LONG_L  $23, PT_R23(sp)
130         LONG_L  $30, PT_R30(sp)
131         .endm
132
133         .macro  RESTORE_SOME
134         .set    push
135         .set    reorder
136         .set    noat
137         mfc0    a0, CP0_STATUS
138         ori     a0, STATMASK
139         xori    a0, STATMASK
140         mtc0    a0, CP0_STATUS
141         li      v1, ST0_CU1 | ST0_FR | ST0_IM
142         and     a0, v1
143         LONG_L  v0, PT_STATUS(sp)
144         nor     v1, $0, v1
145         and     v0, v1
146         or      v0, a0
147         mtc0    v0, CP0_STATUS
148         LONG_L  v1, PT_EPC(sp)
149         MTC0    v1, CP0_EPC
150         LONG_L  $31, PT_R31(sp)
151         LONG_L  $28, PT_R28(sp)
152         LONG_L  $25, PT_R25(sp)
153 #ifdef CONFIG_64BIT
154         LONG_L  $8, PT_R8(sp)
155         LONG_L  $9, PT_R9(sp)
156 #endif
157         LONG_L  $7,  PT_R7(sp)
158         LONG_L  $6,  PT_R6(sp)
159         LONG_L  $5,  PT_R5(sp)
160         LONG_L  $4,  PT_R4(sp)
161         LONG_L  $3,  PT_R3(sp)
162         LONG_L  $2,  PT_R2(sp)
163         .set    pop
164         .endm
165
166         .macro  RESTORE_SP
167         LONG_L  sp, PT_R29(sp)
168         .endm
169
170 NESTED(except_vec3_generic, 0, sp)
171         PTR_LA  k1, handle_reserved
172         jr      k1
173          nop
174         END(except_vec3_generic)
175
176 NESTED(except_vec_ejtag_debug, 0, sp)
177         PTR_LA  k1, handle_ejtag_debug
178         jr      k1
179          nop
180         END(except_vec_ejtag_debug)
181
182 NESTED(handle_reserved, PT_SIZE, sp)
183         SAVE_SOME
184         SAVE_AT
185         SAVE_TEMP
186         SAVE_STATIC
187
188         PTR_LA  t9, do_reserved
189         jr      t9
190          move   a0, sp
191         END(handle_reserved)
192
193 NESTED(handle_ejtag_debug, PT_SIZE, sp)
194         .set    push
195         .set    noat
196         MTC0    k1, CP0_DESAVE
197
198         /* Check for SDBBP */
199         MFC0    k1, CP0_DEBUG
200         sll     k1, k1, 30
201         bgez    k1, ejtag_return
202          nop
203
204         SAVE_SOME
205         SAVE_AT
206         SAVE_TEMP
207         SAVE_STATIC
208
209         PTR_LA  t9, do_ejtag_debug
210         jalr    t9
211          move   a0, sp
212
213         RESTORE_TEMP
214         RESTORE_STATIC
215         RESTORE_AT
216         RESTORE_SOME
217         RESTORE_SP
218
219 ejtag_return:
220         MFC0    k1, CP0_DESAVE
221         deret
222         .set pop
223         END(handle_ejtag_debug)