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)
11 #define SEGSS BYTE $0x36
12 #define SEGES BYTE $0x26
13 #define FARRET BYTE $0xCB
19 OPSIZE; MOVL $origin(SB), SP
21 OPSIZE; ADSIZE; PUSHL SP
22 OPSIZE; ADSIZE; PUSHL CX
39 /* make sure stack is at 0000: */
42 OPSIZE; ANDL $0xFFFF, SP
44 /* convert 16-bit return pc to far pointer */
49 SEGSS; LGDT(tgdtptr(SB))
51 /* enable protected mode */
57 FARJUMP16(EXEC16SEL, pmode32flush(SB));
58 TEXT pmode32flush(SB), $0
60 /* load 32-bit protected mode data selector */
64 /* load all data segments */
73 /* setup farret to rmode16x */
77 /* load 16-bit protected mode data selector */
83 SEGSS; LIDT(tidtptr(SB))
85 /* disable protected mode */
91 FARJUMP16(0, rmode16flush(SB));
92 TEXT rmode16flush(SB), $0
95 * load 16-bit realmode data segment 0000: and
96 * return to 32 bit return pc interpreted
97 * as 16 bit far pointer.
103 /* null descriptor */
107 /* data segment descriptor for 4 gigabytes (PL 0) */
109 LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
111 /* exec segment descriptor for 4 gigabytes (PL 0) */
113 LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
115 /* data segment descriptor for (PL 0) 16-bit */
117 LONG $((0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
119 /* exec segment descriptor for (PL 0) 16-bit */
121 LONG $((0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
183 TEXT pxecallret(SB), $0
201 PUSHI(pxecallret(SB))
203 /* get pxe env structure in ES:BX */
208 /* !PXE or PXEENV+ signature */
209 SEGES; LXW(0, xBX, rAX)
210 CMPI((('!'<<0)|('P'<<8)), rAX)
212 CMPI((('P'<<0)|('X'<<8)), rAX)
215 SEGES; LXW(0x2A, xBX, rAX)
216 SEGES; LXW(0x28, xBX, rBX)
220 SEGES; LXW(0x12, xBX, rAX)
222 SEGES; LXW(0x10, xBX, rAX)
244 TEXT readsect16(SB), $0
248 PUSHR(rCX) /* qword lba */
253 PUSHR(rCX) /* dword buffer */
257 PUSHR(rCX) /* word # of sectors */
259 PUSHI(0x0010) /* byte reserved, byte packet size */
276 TEXT readsect(SB), $0
283 CALL16(readsect16(SB))
292 TEXT bootname(SB), $0
293 BYTE $'3'; BYTE $'8'; BYTE $'6'; BYTE $'/';
294 BYTE $'9'; BYTE $'b'; BYTE $'o'; BYTE $'o';
295 BYTE $'t'; BYTE $'i'; BYTE $'s'; BYTE $'o';
301 BYTE $'\r'; BYTE $'\n'; BYTE $0
304 BYTE $'0'; BYTE $'1'; BYTE $'2'; BYTE $'3';
305 BYTE $'4'; BYTE $'5'; BYTE $'6'; BYTE $'7';
306 BYTE $'8'; BYTE $'9'; BYTE $'a'; BYTE $'b';
307 BYTE $'c'; BYTE $'d'; BYTE $'e'; BYTE $'f'