]> git.lizzy.rs Git - plan9front.git/blob - sys/src/boot/pc/l.s
dont put plan9.ini bootimage in cd root
[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 TEXT a20(SB), $0
115         CALL rmode16(SB)
116         STI
117         LWI(0x2401, rAX)
118         BIOSCALL(0x15)
119         JMP _pret32
120
121 #ifdef PXE
122
123 TEXT pxecallret(SB), $0
124         ADDI(6, rSP)
125         JMP _pret32
126
127 TEXT pxecall(SB), $0
128         MOVL op+4(SP),AX
129         MOVL buf+8(SP),SI
130         CALL rmode16(SB)
131         CLI
132
133         CLR(rCX)
134         PUSHR(rCX)
135         PUSHR(rSI)
136
137         /* opcode */
138         PUSHR(rAX)
139
140         PUSHR(rCX)
141         PUSHI(pxecallret(SB))
142
143         /* get pxe env structure in ES:BX */
144         LWI(0x5650, rAX)
145         BIOSCALL(0x1A)
146         JC _farret
147
148         /* !PXE or PXEENV+ signature */
149         SEGES; LXW(0, xBX, rAX)
150         CMPI((('!'<<0)|('P'<<8)), rAX)
151         JEQ _getentry
152         CMPI((('P'<<0)|('X'<<8)), rAX)
153         JNE _farret
154
155         SEGES; LXW(0x2A, xBX, rAX)
156         SEGES; LXW(0x28, xBX, rBX)
157         MTSR(rAX, rES)
158
159 _getentry:
160         SEGES; LXW(0x12, xBX, rAX)
161         PUSHR(rAX)
162         SEGES; LXW(0x10, xBX, rAX)
163         PUSHR(rAX)
164
165 _pxecall:
166         CLR(rAX)
167         CLR(rBX)
168         CLR(rCX)
169         CLR(rDX)
170         CLR(rDI)
171         CLR(rSI)
172 _farret:
173         FARRET
174
175 _pxeplus:
176         CMPI((('P'<<0)|('X'<<8)), rAX)
177         JNE _farret
178
179         PUSHR(rAX)
180         JMP _pxecall
181
182 #else /* PXE */
183
184 /*
185  * in:
186  *      DL drive
187  *      AX:BX lba32,
188  *      0000:SI buffer
189  */
190 TEXT readsect16(SB), $0
191         PUSHA
192         CLR(rCX)
193
194         PUSHR(rCX)              /* qword lba */
195         PUSHR(rCX)
196         PUSHR(rBX)
197         PUSHR(rAX)
198
199         PUSHR(rCX)              /* dword buffer */
200         PUSHR(rSI)
201
202         INC(rCX)
203         PUSHR(rCX)              /* word # of sectors */
204
205         PUSHI(0x0010)           /* byte reserved, byte packet size */
206
207         MW(rSP, rSI)
208         LWI(0x4200, rAX)
209         BIOSCALL(0x13)
210         JCC _readok
211         ADDI(0x10, rSP)
212         POPA
213         CLR(rAX)
214         DEC(rAX)
215         RET
216 _readok:
217         ADDI(0x10, rSP)
218         POPA
219         CLR(rAX)
220         RET
221
222 TEXT readsect(SB), $0
223         MOVL 4(SP), DX
224         MOVW 8(SP), AX
225         MOVW 10(SP), BX
226         MOVL 12(SP), SI 
227         CALL rmode16(SB)
228         STI
229         CALL16(readsect16(SB))
230         CLI
231         CALL16(pmode32(SB))
232         ANDL $0xFFFF, AX
233         RET
234
235 #endif
236
237 #ifdef ISO
238
239 TEXT bootname(SB), $0
240         BYTE $'3'; BYTE $'8'; BYTE $'6'; BYTE $'/';
241         BYTE $'9'; BYTE $'b'; BYTE $'o'; BYTE $'o';
242         BYTE $'t'; BYTE $'i'; BYTE $'s'; BYTE $'o';
243         BYTE $0
244
245 #endif
246
247 TEXT crnl(SB), $0
248         BYTE $'\r'; BYTE $'\n'; BYTE $0
249
250 TEXT hex(SB), $0
251         BYTE $'0'; BYTE $'1'; BYTE $'2'; BYTE $'3';
252         BYTE $'4'; BYTE $'5'; BYTE $'6'; BYTE $'7';
253         BYTE $'8'; BYTE $'9'; BYTE $'a'; BYTE $'b';
254         BYTE $'c'; BYTE $'d'; BYTE $'e'; BYTE $'f'