config: fix build with external compiler by passing the sysroot where needed
[AROS.git] / arch / m68k-all / kernel / buserror.S
blob0b64afed1807ac24aade88d59eeca2d094397c2c
2         #include <aros/config.h>
3         #include "aros/m68k/asm.h"
5 #define STACKOFFSET (4 + 4*4)
7         .text
8         .balign 4
9         .globl  buserror030
10 buserror030:
11         /* 68030 bus error handling is so simple.. */
12         or.w    #0x0700,%sr
13         subq.l  #4,%sp
14         movem.l %d0-%d1/%a0-%a1,-(%sp)
15         moveq   #0,%d0
16         moveq   #0,%d1
17         /* SSW */
18         move.w  STACKOFFSET+0x0a(%sp),%d1
19         /* fault address */
20         move.l  STACKOFFSET+0x10(%sp),%a0
21         cmp.w   #4,%a0
22         bne             .doexit
23         and.w   #0x01f0,%d1
24         /* DATA (DF) + READ + LONG? */
25         cmp.w   #0x0140,%d1
26         bne             .doexit
27         /* clear DF */
28         and.w   #~0x0100,STACKOFFSET+0x0a(%sp)
29         movec   %vbr,%a0
30         /* Fetch execbase from VBR */
31         move.l  4(%a0),STACKOFFSET+0x2c(%sp)
32         /* 68030 continues the execution using above fetched value */
33         movem.l (%sp)+,%d0-%d1/%a0-%a1
34         addq.l  #4,%sp
35         rte
37         .balign 4
38         .globl  buserror040
39 buserror040:
40         or.w    #0x0700,%sr
41         subq.l  #4,%sp
42         movem.l %d0-%d1/%a0-%a1,-(%sp)
43         moveq   #1,%d0
44         /* SSW */
45         moveq   #0,%d1
46         move.w  STACKOFFSET+0x0c(%sp),%d1
47         /* fault address */
48         move.l  STACKOFFSET+0x14(%sp),%a0
49         cmp.w   #4,%a0
50         bne             .doexit
51         and.w   #0xffc0,%d1
52         /* LONG DATA READ + ATC fault? */
53         cmp.w   #0x0500,%d1
54         bne             .doexit
55 .dotrace:
56         /* It was long read from address 4. Special handling required.
57          *
58          * Because 68040 (and 060) restart instruction after read fault,
59          * we need to mark zeropage as valid and re-run faulting
60          * instruction in trace mode. Trace exception is used to restore
61          * zero page descriptor back to original invalid state.
62          */
63         movec   %vbr,%a0
64         move.l  253*4(%a0),%a0
65         /* Zero page -> resident */
66         or.b    #3,%a0@
67         cpushl  %dc,(%a0)
68         pflushan
69         movec   %vbr,%a0
70         /* Store old trace vector in "safe" place */
71         move.l  9*4(%a0),254*4(%a0)
72         /* Store old SR */
73         move.w  STACKOFFSET(%sp),255*4(%a0)
74         /* Set temporary trace */
75         move.l  #trace040,9*4(%a0)
76         movem.l (%sp)+,%d0-%d1/%a0-%a1
77         addq.l  #4,%sp
78         /* Modify SR in stack, trace on, interrupts disabled! */
79         and.w   #0x3fff,(%sp)
80         or.w    #0x8700,(%sp)
81         /* Re-run the instruction */
82         rte
84         .balign 4
85 trace040:
86         move.l  %a0,-(%sp)
87         movec   %vbr,%a0
88         move.l  253*4(%a0),%a0
89         /* Zero page -> invalid */
90         and.b   #~3,%a0@
91         cpushl  %dc,(%a0)
92         pflushan
93         movec   %vbr,%a0
94         /* Original trace vector */
95         move.l  254*4(%a0),9*4(%a0)
96         /* Original SR */
97         move.w  255*4(%a0),4(%sp)
98         move.l  (%sp)+,%a0
99         rte
101         .balign 4
102         .globl  buserror060
103 buserror060:
104         or.w    #0x0700,%sr
105         subq.l  #4,%sp
106         movem.l %d0-%d1/%a0-%a1,-(%sp)
107         moveq   #2,%d0
108         /* FSLW */
109         move.l  STACKOFFSET+0x0c(%sp),%d1
110         /* fault address */
111         move.l  STACKOFFSET+0x08(%sp),%a0
112         cmp.w   #4,%a0
113         bne             .doexit
114         and.l   #0x07000200,%d1
115         /* DATA READ PAGE FAULT? */
116         cmp.l   #0x01000200,%d1
117         beq             .dotrace
118         
119 .doexit:
121 #define STACK_RESERVE 80
123 #if AROS_SERIAL_DEBUG
124         sub.w   #STACK_RESERVE,%sp
125         move.l  %sp@(STACK_RESERVE+0),%sp@(16+0)                // stacked D0 -> regs[0]
126         move.l  %sp@(STACK_RESERVE+4),%sp@(16+4)                // stacked D1 -> regs[1]
127         move.l  %sp@(STACK_RESERVE+8),%sp@(16+8*4+0)    // stacked A0 -> regs[8]
128         move.l  %sp@(STACK_RESERVE+12),%sp@(16+8*4+4)   // stacked A1 -> regs[9]
129         move.l  %sp,%a0
130         add.w   #STACK_RESERVE+STACKOFFSET,%a0
131         move.l  %a0,%sp@                                                                //  0 Bus error stack frame
132         move.l  %sp,%a0
133         addq.l  #4,%a0
134         move.l  %d0,(%a0)+                                                              //  4 CPU type
135         movec   %usp,%d0
136         move.l  %d0,(%a0)+                                                              //  8 USP
137         movec   %vbr,%d0
138         move.l  %d0,(%a0)+                                                              // 12 VBR
139         move.l  %sp,%d0
140         add.l   #STACK_RESERVE+STACKOFFSET,%d0
141                                                                                                         // 16
142         move.l  %d0,%a0@(8*4+7*4)                                               // SSP -> regs[15]
143         movem.l %d2-%d7,%a0@(8)                                                 // regs[2]-regs[7]
144         movem.l %a2-%a6,%a0@(8*4+8)                                             // regs[10]-regs[14]
145         move.l  %sp,-(%sp)
146         jsr     bushandler
147         add.w   #STACK_RESERVE+4,%sp
148 #endif
150         /* jump to original exception vector
151          * we assume illegal instruction uses same address
152          *
153          * TODO: Handle 68040 writebacks. Not really important at this
154          * point because this is meant to be kernel debugger that simply
155          * crashes the system if access fault happens.
156          */
158         movec   %vbr,%a0
159         move.l  4*4(%a0),STACKOFFSET-4(%sp)
160         movem.l (%sp)+,%d0-%d1/%a0-%a1
161         rts
163         .globl  addrerror030
164 addrerror030:
165         or.w    #0x0700,%sr
166         subq.l  #4,%sp
167         move.w  #0x10,(%sp)
168 .addrerror:
169         movem.l %d0-%d1/%a0-%a1,-(%sp)
170         move.w  STACKOFFSET-4(%sp),%d0
171         bra             .doexit
173         .globl  addrerror040
174 addrerror040:
175         or.w    #0x0700,%sr
176         subq.l  #4,%sp
177         move.w  #0x11,(%sp)
178         bra.s   .addrerror
180         .globl  addrerror060
181 addrerror060:
182         or.w    #0x0700,%sr
183         subq.l  #4,%sp
184         move.w  #0x12,(%sp)
185         bra.s   .addrerror
187         .chip 68030
188         .globl  mmu_valid_check_030
189 mmu_valid_check_030:
190         move.l  4(%sp),%a0
191         ptestr  #5,(%a0),#7 // FC=5, all levels
192         subq.l  #4,%sp
193         pmove   %psr,(%sp)
194         move.w  (%sp),%d0
195         addq.l  #4,%sp
196         and.w   #0x8400,%d0
197         rts
199         .chip 68040
200         .globl  mmu_valid_check_040
201 mmu_valid_check_040:
202         move.l  4(%sp),%a0
203         movec   %dfc,%d1
204         moveq   #5,%d0
205         movec   %d0,%dfc
206         ptestr  (%a0)
207         movec   %mmusr,%d0
208         movec   %d1,%dfc
209         and.w   #0x0800,%d0
210         rts
212         .chip 68060
213         .globl  mmu_valid_check_060
214 mmu_valid_check_060:
215         move.l  %d2,-(%sp)
216         movec   %dfc,%d2
217         moveq   #5,%d0
218         movec   %d0,%dfc
219         movec   %vbr,%a0
220         addq.l  #8,%a0
221         lea             mmu_invalid_060(%pc),%a1
222         move.l  (%a0),%d1
223         move.l  %a1,(%a0)
224         move.l  8(%sp),%a1
225         moveq   #0,%d0
226         plpar   (%a1)
227         move.l  %d1,(%a0)
228         movec   %d2,%dfc
229         move.l  (%sp)+,%d2
230         rts
231 mmu_invalid_060:
232         moveq   #-1,%d0
233         addq.l  #2,2(%sp)
234         rte