]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/pc/l.s
let the kernel set dma mode for ata by default
[plan9front.git] / sys / src / boot / pc / l.s
1 #include "x16.h"
2 #include "mem.h"
3
4 #undef ORB
5
6 #define DATA32SEL SELECTOR(1, SELGDT, 0)
7 #define EXEC32SEL SELECTOR(2, SELGDT, 0)
8 #define EXEC16SEL SELECTOR(3, SELGDT, 0)
9 #define SEGSS BYTE $0x36
10 #define SEGES BYTE $0x26
11 #define FARRET BYTE $0xCB
12
13 TEXT origin(SB), $0
14         CLI
15         CLR(rCX)
16         MTSR(rCX, rSS)
17         OPSIZE; MOVL $origin(SB), SP
18         PUSHA
19         OPSIZE; ADSIZE; PUSHL SP
20         OPSIZE; ADSIZE; PUSHL CX
21         PUSHI(start(SB))
22
23 TEXT pmode32(SB), $0
24         POPR(rDI)
25         SEGSS; LGDT(tgdtptr(SB))
26         MFCR(rCR0, rCX)
27         ORB $1, CL
28         MTCR(rCX, rCR0)
29         PUSHI(EXEC32SEL)
30         PUSHR(rDI)
31         LWI(DATA32SEL, rCX)
32 _segret:
33         MTSR(rCX, rDS)
34         MTSR(rCX, rES)
35         MTSR(rCX, rSS)
36         FARRET
37
38 TEXT rmode16(SB), $0
39         POPL DI
40         OPSIZE; BYTE $0xEA
41         WORD $unreal(SB)
42         WORD $EXEC16SEL
43
44 TEXT unreal(SB), $0
45         MFCR(rCR0, rCX)
46         ANDB $0xfe, CL
47         MTCR(rCX, rCR0)
48         CLR(rCX)
49         PUSHR(rCX)
50         PUSHR(rDI)
51         JMP _segret
52
53 TEXT tgdt(SB), $0 
54         /* null descriptor */
55         LONG $0
56         LONG $0
57
58         /* data segment descriptor for 4 gigabytes (PL 0) */
59         LONG $(0xFFFF)
60         LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
61
62         /* exec segment descriptor for 4 gigabytes (PL 0) */
63         LONG $(0xFFFF)
64         LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
65
66         /* exec segment descriptor for 4 gigabytes (PL 0) 16-bit */
67         LONG $(0xFFFF)
68         LONG $(SEGG|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
69
70 TEXT tgdtptr(SB), $0 
71          WORD $(4*8) 
72          LONG $tgdt(SB)
73
74 TEXT jump(SB), $0
75         MOVL 4(SP), AX
76         JMP *AX
77
78 TEXT halt(SB), $0
79 _halt:
80         JMP _halt
81
82 TEXT getc(SB), $0
83         CALL rmode16(SB)
84         STI
85         MOVB $0x00, AH
86         BIOSCALL(0x16)
87 _getcret:
88         CLI
89         CALL16(pmode32(SB))
90         ANDL $0xFF, AX
91         RET
92
93 TEXT gotc(SB), $0
94         CALL rmode16(SB)
95         STI
96         MOVB $0x01, AH
97         BIOSCALL(0x16)
98         JNZ _getcret
99         CLR(rAX)
100         JMP _getcret
101         
102 TEXT putc(SB), $0
103         MOVL 4(SP),AX
104         CALL rmode16(SB)
105         STI
106         MOVB $0x0E, AH
107         BIOSCALL(0x10)
108 _pret32:
109         CLI
110         CALL16(pmode32(SB))
111         ANDL $0xFFFF, AX
112         RET
113
114 #ifdef PXE
115
116 TEXT pxecallret(SB), $0
117         ADDI(6, rSP)
118         JMP _pret32
119
120 TEXT pxecall(SB), $0
121         MOVL op+4(SP),AX
122         MOVL buf+8(SP),SI
123         CALL rmode16(SB)
124         CLI
125
126         CLR(rCX)
127         PUSHR(rCX)
128         PUSHR(rSI)
129
130         /* opcode */
131         PUSHR(rAX)
132
133         PUSHR(rCX)
134         PUSHI(pxecallret(SB))
135
136         /* get pxe env structure in ES:BX */
137         LWI(0x5650, rAX)
138         BIOSCALL(0x1A)
139         JC _farret
140
141         /* !PXE or PXEENV+ signature */
142         SEGES; LXW(0, xBX, rAX)
143         CMPI((('!'<<0)|('P'<<8)), rAX)
144         JEQ _getentry
145         CMPI((('P'<<0)|('X'<<8)), rAX)
146         JNE _farret
147
148         SEGES; LXW(0x2A, xBX, rAX)
149         SEGES; LXW(0x28, xBX, rBX)
150         MTSR(rAX, rES)
151
152 _getentry:
153         SEGES; LXW(0x12, xBX, rAX)
154         PUSHR(rAX)
155         SEGES; LXW(0x10, xBX, rAX)
156         PUSHR(rAX)
157
158 _pxecall:
159         CLR(rAX)
160         CLR(rBX)
161         CLR(rCX)
162         CLR(rDX)
163         CLR(rDI)
164         CLR(rSI)
165 _farret:
166         FARRET
167
168 _pxeplus:
169         CMPI((('P'<<0)|('X'<<8)), rAX)
170         JNE _farret
171
172         PUSHR(rAX)
173         JMP _pxecall
174
175 #else /* PXE */
176
177 /*
178  * in:
179  *      DL drive
180  *      AX:BX lba32,
181  *      0000:SI buffer
182  */
183 TEXT readsect16(SB), $0
184         PUSHA
185         CLR(rCX)
186
187         PUSHR(rCX)              /* qword lba */
188         PUSHR(rCX)
189         PUSHR(rBX)
190         PUSHR(rAX)
191
192         PUSHR(rCX)              /* dword buffer */
193         PUSHR(rSI)
194
195         INC(rCX)
196         PUSHR(rCX)              /* word # of sectors */
197
198         PUSHI(0x0010)           /* byte reserved, byte packet size */
199
200         MW(rSP, rSI)
201         LWI(0x4200, rAX)
202         BIOSCALL(0x13)
203         JCC _readok
204         ADDI(0x10, rSP)
205         POPA
206         CLR(rAX)
207         DEC(rAX)
208         RET
209 _readok:
210         ADDI(0x10, rSP)
211         POPA
212         CLR(rAX)
213         RET
214
215 TEXT readsect(SB), $0
216         MOVL 4(SP), DX
217         MOVW 8(SP), AX
218         MOVW 10(SP), BX
219         MOVL 12(SP), SI 
220         CALL rmode16(SB)
221         STI
222         CALL16(readsect16(SB))
223         CLI
224         CALL16(pmode32(SB))
225         ANDL $0xFFFF, AX
226         RET
227
228 #endif
229
230 #ifdef ISO
231
232 TEXT bootname(SB), $0
233         BYTE $'3'; BYTE $'8'; BYTE $'6'; BYTE $'/';
234         BYTE $'9'; BYTE $'b'; BYTE $'o'; BYTE $'o';
235         BYTE $'t'; BYTE $'i'; BYTE $'s'; BYTE $'o';
236         BYTE $0
237
238 #endif
239
240 TEXT crnl(SB), $0
241         BYTE $'\r'; BYTE $'\n'; BYTE $0
242
243 TEXT hex(SB), $0
244         BYTE $'0'; BYTE $'1'; BYTE $'2'; BYTE $'3';
245         BYTE $'4'; BYTE $'5'; BYTE $'6'; BYTE $'7';
246         BYTE $'8'; BYTE $'9'; BYTE $'a'; BYTE $'b';
247         BYTE $'c'; BYTE $'d'; BYTE $'e'; BYTE $'f'