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
17 OPSIZE; MOVL $origin(SB), SP
19 OPSIZE; ADSIZE; PUSHL SP
20 OPSIZE; ADSIZE; PUSHL CX
25 SEGSS; LGDT(tgdtptr(SB))
58 /* data segment descriptor for 4 gigabytes (PL 0) */
60 LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
62 /* exec segment descriptor for 4 gigabytes (PL 0) */
64 LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
66 /* exec segment descriptor for 4 gigabytes (PL 0) 16-bit */
68 LONG $(SEGG|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
116 TEXT pxecallret(SB), $0
134 PUSHI(pxecallret(SB))
136 /* get pxe env structure in ES:BX */
141 /* !PXE or PXEENV+ signature */
142 SEGES; LXW(0, xBX, rAX)
143 CMPI((('!'<<0)|('P'<<8)), rAX)
145 CMPI((('P'<<0)|('X'<<8)), rAX)
148 SEGES; LXW(0x2A, xBX, rAX)
149 SEGES; LXW(0x28, xBX, rBX)
153 SEGES; LXW(0x12, xBX, rAX)
155 SEGES; LXW(0x10, xBX, rAX)
169 CMPI((('P'<<0)|('X'<<8)), rAX)
183 TEXT readsect16(SB), $0
187 PUSHR(rCX) /* qword lba */
192 PUSHR(rCX) /* dword buffer */
196 PUSHR(rCX) /* word # of sectors */
198 PUSHI(0x0010) /* byte reserved, byte packet size */
215 TEXT readsect(SB), $0
222 CALL16(readsect16(SB))
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';
241 BYTE $'\r'; BYTE $'\n'; BYTE $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'