]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/pc/l.s
9boot: increase timeout, do less printing
[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 DATA16SEL SELECTOR(3, SELGDT, 0)
9 #define EXEC16SEL SELECTOR(4, SELGDT, 0)
10
11 #define SEGSS BYTE $0x36
12 #define SEGES BYTE $0x26
13 #define FARRET BYTE $0xCB
14
15 TEXT origin(SB), $0
16         CLI
17         CLR(rCX)
18         MTSR(rCX, rSS)
19         OPSIZE; MOVL $origin(SB), SP
20         PUSHA
21         OPSIZE; ADSIZE; PUSHL SP
22         OPSIZE; ADSIZE; PUSHL CX
23         PUSHI(start(SB))
24
25 TEXT pmode32(SB), $0
26         CLI
27
28         /* get return pc */
29         POPR(rDI)
30
31         /* make sure stack is at 0000: */
32         CLR(rCX)
33         MTSR(rCX, rSS)
34         OPSIZE; ANDL $0xFFFF, SP
35
36         /* convert 16-bit return pc to far pointer */
37         PUSHI(EXEC32SEL)
38         PUSHR(rDI)
39
40         /* load gdt */
41         SEGSS; LGDT(tgdtptr(SB))
42
43         /* enable protected mode */
44         MFCR(rCR0, rCX)
45         ORB $1, CL
46         MTCR(rCX, rCR0)
47
48         /* flush */
49         FARJUMP16(EXEC16SEL, pmode32flush(SB));
50 TEXT pmode32flush(SB), $0
51
52         /* load 32-bit protected mode data selector */
53         LWI(DATA32SEL, rCX)
54
55 _segret:
56         /* load all data segments */
57         MTSR(rCX, rDS)
58         MTSR(rCX, rES)
59         MTSR(rCX, rFS)
60         MTSR(rCX, rGS)
61         MTSR(rCX, rSS)
62         FARRET
63
64 TEXT rmode16(SB), $0
65         /* setup farret to rmode16x */
66         PUSHL $EXEC16SEL
67         PUSHL $rmode16x(SB)
68
69         /* load 16-bit protected mode data selector */
70         MOVL $DATA16SEL, CX
71         JMP _segret
72
73 TEXT rmode16x(SB), $0
74         /* disable protected mode */
75         MFCR(rCR0, rCX)
76         ANDB $0xfe, CL
77         MTCR(rCX, rCR0)
78
79         /* flush */
80         FARJUMP16(0, rmode16flush(SB));
81 TEXT rmode16flush(SB), $0
82
83         /*
84          * load 16-bit realmode data segment 0000: and
85          * return to 32 bit return pc interpreted
86          * as 16 bit far pointer.
87          */
88         CLR(rCX)
89         JMP _segret
90
91 TEXT tgdt(SB), $0 
92         /* null descriptor */
93         LONG $0
94         LONG $0
95
96         /* data segment descriptor for 4 gigabytes (PL 0) */
97         LONG $(0xFFFF)
98         LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
99
100         /* exec segment descriptor for 4 gigabytes (PL 0) */
101         LONG $(0xFFFF)
102         LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
103
104         /* data segment descriptor for (PL 0) 16-bit */
105         LONG $(0xFFFF)
106         LONG $((0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
107
108         /* exec segment descriptor for (PL 0) 16-bit */
109         LONG $(0xFFFF)
110         LONG $((0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
111
112 TEXT tgdtptr(SB), $0 
113          WORD $(5*8) 
114          LONG $tgdt(SB)
115
116 TEXT jump(SB), $0
117         MOVL 4(SP), AX
118         JMP *AX
119
120 TEXT halt(SB), $0
121 _halt:
122         JMP _halt
123
124 TEXT getc(SB), $0
125         CALL rmode16(SB)
126         STI
127         MOVB $0x00, AH
128         BIOSCALL(0x16)
129 _getcret:
130         CALL16(pmode32(SB))
131         ANDL $0xFF, AX
132         RET
133
134 TEXT gotc(SB), $0
135         CALL rmode16(SB)
136         STI
137         MOVB $0x01, AH
138         BIOSCALL(0x16)
139         JNZ _getcret
140         CLR(rAX)
141         JMP _getcret
142         
143 TEXT putc(SB), $0
144         MOVL 4(SP),AX
145         CALL rmode16(SB)
146         STI
147         MOVB $0x0E, AH
148         BIOSCALL(0x10)
149 _pret32:
150         CALL16(pmode32(SB))
151         ANDL $0xFFFF, AX
152         RET
153
154 TEXT usleep(SB), $0
155         MOVL t+4(SP), AX
156         PUSHL AX
157         CALL rmode16(SB)
158         STI
159         POPR(rDX)
160         POPR(rCX)
161         MOVB $0x86, AH
162         BIOSCALL(0x15)
163         JMP _pret32
164
165 #ifdef PXE
166
167 TEXT pxeinit(SB), $0
168         CALL rmode16(SB)
169
170         /* get pxe env structure in ES:BX */
171         LWI(0x5650, rAX)
172         BIOSCALL(0x1A)
173         JC _pret32
174
175         /* !PXE or PXEENV+ signature */
176         SEGES; LXW(0, xBX, rAX)
177         CMPI((('!'<<0)|('P'<<8)), rAX)
178         JEQ _getentry
179         CMPI((('P'<<0)|('X'<<8)), rAX)
180         JNE _pret32
181
182         SEGES; LXW(0x2A, xBX, rAX)
183         SEGES; LXW(0x28, xBX, rBX)
184         MTSR(rAX, rES)
185
186 _getentry:
187         SEGES; LXW(0x12, xBX, rAX)
188         SW(rAX, pxepseg(SB))
189         SEGES; LXW(0x10, xBX, rAX)
190         SW(rAX, pxepoff(SB))
191         CLR(rAX)
192         JMP _pret32
193
194 TEXT pxecallret(SB), $0
195         ADDI(6, rSP)
196         JMP _pret32
197
198 TEXT pxecall(SB), $0
199         MOVL op+4(SP),AX
200         MOVL buf+8(SP),SI
201         CALL rmode16(SB)
202
203         CLR(rCX)
204         PUSHR(rCX)
205         PUSHR(rSI)
206
207         /* opcode */
208         PUSHR(rAX)
209
210         /* farcall */
211         PUSHR(rCX)
212         PUSHI(pxecallret(SB))
213
214         LW(pxepseg(SB), rAX)
215         PUSHR(rAX)
216         LW(pxepoff(SB), rAX)
217         PUSHR(rAX)
218
219         STI
220
221         CLR(rAX)
222         CLR(rBX)
223         CLR(rCX)
224         CLR(rDX)
225         CLR(rDI)
226         CLR(rSI)
227         FARRET
228
229 TEXT pxepseg(SB), $0
230         WORD $0
231 TEXT pxepoff(SB), $0
232         WORD $0
233
234 #else /* PXE */
235
236 /*
237  * in:
238  *      DL drive
239  *      AX:BX lba32,
240  *      0000:SI buffer
241  */
242 TEXT readsect16(SB), $0
243         PUSHA
244         CLR(rCX)
245
246         PUSHR(rCX)              /* qword lba */
247         PUSHR(rCX)
248         PUSHR(rBX)
249         PUSHR(rAX)
250
251         PUSHR(rCX)              /* dword buffer */
252         PUSHR(rSI)
253
254         INC(rCX)
255         PUSHR(rCX)              /* word # of sectors */
256
257         PUSHI(0x0010)           /* byte reserved, byte packet size */
258
259         MW(rSP, rSI)
260         LWI(0x4200, rAX)
261         BIOSCALL(0x13)
262         JCC _readok
263         ADDI(0x10, rSP)
264         POPA
265         CLR(rAX)
266         DEC(rAX)
267         RET
268 _readok:
269         ADDI(0x10, rSP)
270         POPA
271         CLR(rAX)
272         RET
273
274 TEXT readsect(SB), $0
275         MOVL 4(SP), DX
276         MOVW 8(SP), AX
277         MOVW 10(SP), BX
278         MOVL 12(SP), SI 
279         CALL rmode16(SB)
280         STI
281         CALL16(readsect16(SB))
282         CALL16(pmode32(SB))
283         ANDL $0xFFFF, AX
284         RET
285
286 #endif
287
288 #ifdef ISO
289
290 TEXT bootname(SB), $0
291         BYTE $'3'; BYTE $'8'; BYTE $'6'; BYTE $'/';
292         BYTE $'9'; BYTE $'b'; BYTE $'o'; BYTE $'o';
293         BYTE $'t'; BYTE $'i'; BYTE $'s'; BYTE $'o';
294         BYTE $0
295
296 #endif
297
298 TEXT crnl(SB), $0
299         BYTE $'\r'; BYTE $'\n'; BYTE $0
300
301 TEXT hex(SB), $0
302         BYTE $'0'; BYTE $'1'; BYTE $'2'; BYTE $'3';
303         BYTE $'4'; BYTE $'5'; BYTE $'6'; BYTE $'7';
304         BYTE $'8'; BYTE $'9'; BYTE $'a'; BYTE $'b';
305         BYTE $'c'; BYTE $'d'; BYTE $'e'; BYTE $'f'