]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/zynq/ltrap.s
segment: fix print buffer overflow, map fixed segments uncached, add to zynq kernel
[plan9front.git] / sys / src / 9 / zynq / ltrap.s
1 #include "mem.h"
2 #include "io.h"
3
4 TEXT vectors(SB), $-4
5         MOVW $_start-KZERO(SB), R15
6         MOVW $_vexc(SB), R15
7         MOVW $_vsvc(SB), R15
8         MOVW $_viabt(SB), R15
9         MOVW $_vexc(SB), R15
10         MOVW $vectors(SB), R15
11         MOVW $_vexc(SB), R15
12         MOVW $_vexc(SB), R15
13
14 TEXT _viabt(SB), $-4
15         CPS(CPSID)
16         CLREX
17         DSB
18         MOVW R14, 8(R13)
19         MOVW SPSR, R14
20         MOVW R14, 4(R13)
21         MOVW CPSR, R14
22         AND $0x1e, R14
23         B _exc
24         
25
26 TEXT _vexc(SB), $-4
27         CPS(CPSID)
28         CLREX
29         DSB
30         MOVW R14, 8(R13)
31         MOVW SPSR, R14
32         MOVW R14, 4(R13)
33         MOVW CPSR, R14
34         AND $0x1f, R14
35 _exc:
36         MOVW R14, 0(R13)
37         CPS(CPSMODE | PsrMsvc)
38
39         SUB $(18*4), R13
40         MOVM.IA [R0-R14], (R13)
41
42         /* get Mach* from TPIDRPRW */
43         MRC 15, 0, R(Rmach), C(13), C(0), 4
44         MOVW 8(R(Rmach)), R(Rup)
45         MOVW $setR12(SB), R12
46         
47         ADD $12, R(Rmach), R0
48         MOVM.IA (R0), [R1-R3]
49         ADD $(15*4), R13, R0
50         MOVM.IA [R1-R3], (R0)
51         
52         AND.S $0xf, R2
53         ADD.NE $(18*4), R13, R0
54         MOVW.NE R0, (13*4)(R13)
55         ADD.EQ $(13*4), R13, R0
56         MOVM.IA.S.EQ [R13-R14], (R0)
57         
58         MOVW R13, R0
59         SUB $8, R13
60         BL trap(SB)
61         ADD $8, R13
62         
63         MOVW (16*4)(R13), R0
64         MOVW R0, SPSR
65         AND.S $0xf, R0
66         BEQ _uret
67         MOVW R(Rmach), (Rmach*4)(R13)
68         MOVM.IA (R13), [R0-R14]
69         DSB
70         MOVM.DB.S (R13), [R15]
71
72 TEXT _vsvc(SB), $-4
73         CLREX
74         DSB
75         MOVW.W R14, -4(R13)
76         MOVW SPSR, R14
77         MOVW.W R14, -4(R13)
78         MOVW $PsrMsvc, R14
79         MOVW.W R14, -4(R13)
80         MOVM.DB.S [R0-R14], (R13)
81         SUB $(15*4), R13
82         
83         /* get Mach* from TPIDRPRW */
84         MRC 15, 0, R(Rmach), C(13), C(0), 4
85         MOVW 8(R(Rmach)), R(Rup)
86         MOVW $setR12(SB), R12
87         
88         MOVW R13, R0
89         SUB $8, R13
90         BL syscall(SB)
91         ADD $8, R13
92
93         MOVW (16*4)(R13), R0
94         MOVW R0, SPSR
95 _uret:
96         MOVM.IA.S (R13), [R0-R14]
97         ADD $(17*4), R13
98         DSB
99         ISB
100         MOVM.IA.S.W (R13), [R15]