Contents of /tags/mkinitrd-6_4_0/isolinux/comboot.inc
Parent Directory | Revision Log
Revision 1133 -
(show annotations)
(download)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/comboot.inc
File size: 21435 byte(s)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/comboot.inc
File size: 21435 byte(s)
-updated to isolinux-3.86
1 | ;; ----------------------------------------------------------------------- |
2 | ;; |
3 | ;; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved |
4 | ;; Copyright 2009 Intel Corporation; author: H. Peter Anvin |
5 | ;; |
6 | ;; This program is free software; you can redistribute it and/or modify |
7 | ;; it under the terms of the GNU General Public License as published by |
8 | ;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
9 | ;; Boston MA 02111-1307, USA; either version 2 of the License, or |
10 | ;; (at your option) any later version; incorporated herein by reference. |
11 | ;; |
12 | ;; ----------------------------------------------------------------------- |
13 | |
14 | ;; |
15 | ;; comboot.inc |
16 | ;; |
17 | ;; Common code for running a COMBOOT image |
18 | ;; |
19 | |
20 | section .text |
21 | |
22 | ; Parameter registers definition; this is the definition |
23 | ; of the stack frame used by INT 21h and INT 22h. |
24 | %define P_FLAGS word [bp+44] |
25 | %define P_FLAGSL byte [bp+44] |
26 | %define P_FLAGSH byte [bp+45] |
27 | %define P_CS word [bp+42] |
28 | %define P_IP word [bp+40] |
29 | %define P_CSIP dword [bp+40] |
30 | %define P_DS word [bp+38] |
31 | %define P_ES word [bp+36] |
32 | %define P_FS word [bp+34] |
33 | %define P_GS word [bp+32] |
34 | %define P_EAX dword [bp+28] |
35 | %define P_AX word [bp+28] |
36 | %define P_HAX word [bp+30] |
37 | %define P_AL byte [bp+28] |
38 | %define P_AH byte [bp+29] |
39 | %define P_ECX dword [bp+24] |
40 | %define P_CX word [bp+24] |
41 | %define P_HCX word [bp+26] |
42 | %define P_CL byte [bp+24] |
43 | %define P_CH byte [bp+25] |
44 | %define P_EDX dword [bp+20] |
45 | %define P_DX word [bp+20] |
46 | %define P_HDX word [bp+22] |
47 | %define P_DL byte [bp+20] |
48 | %define P_DH byte [bp+21] |
49 | %define P_EBX dword [bp+16] |
50 | %define P_BX word [bp+16] |
51 | %define P_HBX word [bp+18] |
52 | %define P_BL byte [bp+16] |
53 | %define P_BH byte [bp+17] |
54 | %define P_EBP dword [bp+8] |
55 | %define P_BP word [bp+8] |
56 | %define P_HBP word [bp+10] |
57 | %define P_ESI dword [bp+4] |
58 | %define P_SI word [bp+4] |
59 | %define P_HSI word [bp+6] |
60 | %define P_EDI dword [bp] |
61 | %define P_DI word [bp] |
62 | %define P_HDI word [bp+2] |
63 | |
64 | ; Looks like a COMBOOT image but too large |
65 | comboot_too_large: |
66 | call close_file |
67 | mov si,err_comlarge |
68 | call writestr |
69 | jmp enter_command |
70 | |
71 | ; |
72 | ; Load a COMBOOT image. A COMBOOT image is basically a DOS .COM file, |
73 | ; except that it may, of course, not contain any DOS system calls. We |
74 | ; do, however, allow the execution of INT 20h to return to SYSLINUX. |
75 | ; |
76 | is_comboot_image: |
77 | push si ; Save file handle |
78 | |
79 | call make_plain_cmdline |
80 | |
81 | call comboot_setup_api |
82 | |
83 | mov cx,comboot_seg |
84 | mov es,cx |
85 | |
86 | xor di,di |
87 | mov cx,64 ; 256 bytes (size of PSP) |
88 | xor eax,eax ; Clear PSP |
89 | rep stosd |
90 | |
91 | mov word [es:0], 020CDh ; INT 20h instruction |
92 | ; First non-free paragraph |
93 | ; This is valid because comboot_seg == real_mode_seg |
94 | ; == the highest segment used by all derivatives |
95 | int 12h ; Get DOS memory size |
96 | shl ax,6 ; Kilobytes -> paragraphs |
97 | mov word [es:02h],ax |
98 | |
99 | %ifndef DEPEND |
100 | %if real_mode_seg != comboot_seg |
101 | %error "This code assumes real_mode_seg == comboot_seg" |
102 | %endif |
103 | %endif |
104 | ; Copy the command line from high memory |
105 | mov si,cmd_line_here |
106 | mov cx,125 ; Max cmdline len (minus space and CR) |
107 | mov di,081h ; Offset in PSP for command line |
108 | mov al,' ' ; DOS command lines begin with a space |
109 | stosb |
110 | |
111 | .loop: es lodsb |
112 | and al,al |
113 | jz .done |
114 | stosb |
115 | loop .loop |
116 | .done: |
117 | |
118 | mov al,0Dh ; CR after last character |
119 | stosb |
120 | mov ax,di |
121 | sub al,82h ; Include space but not CR |
122 | mov [es:80h],al ; Store command line length |
123 | |
124 | ; Now actually load the file... |
125 | pop si ; File handle |
126 | mov bx,100h ; Load at <seg>:0100h |
127 | mov cx,10000h >> SECTOR_SHIFT |
128 | ; Absolute maximum # of sectors |
129 | call getfssec |
130 | cmp ecx,65536-256-2 ; Maximum size |
131 | ja comboot_too_large |
132 | |
133 | ; And invoke the program... |
134 | mov ax,es |
135 | mov ds,ax |
136 | mov ss,ax |
137 | xor sp,sp |
138 | push word 0 ; Return to address 0 -> exit |
139 | |
140 | jmp comboot_seg:100h ; Run it |
141 | |
142 | ; Proper return vector |
143 | ; Note: this gets invoked both via INT 21h and directly via INT 20h. |
144 | ; We don't need to cld explicitly here, because comboot_exit does that |
145 | ; when invoking RESET_STACK_AND_SEGS. |
146 | comboot_return: cli ; May not have a safe stack |
147 | push enter_command ; Normal return to command prompt |
148 | jmp comboot_exit |
149 | |
150 | ; |
151 | ; Set up the COMBOOT API interrupt vectors. This is also used |
152 | ; by the COM32 code. |
153 | ; |
154 | comboot_setup_api: |
155 | mov di,DOSErrTramp ; Error trampolines |
156 | mov cx,32 |
157 | push cx |
158 | mov eax,02EB206Ah ; push 20h; jmp $+4 |
159 | .loop1: stosd |
160 | inc ah |
161 | loop .loop1 |
162 | dec di |
163 | mov byte [di-1],0E9h |
164 | mov ax,comboot_bogus-2 |
165 | sub ax,di |
166 | stosw |
167 | |
168 | pop cx ; CX <- 32 |
169 | mov si,4*20h ; DOS interrupt vectors |
170 | mov bx,comboot_vectors |
171 | mov di,DOSSaveVectors |
172 | .loop2: |
173 | movsd |
174 | movzx eax,word [bx] |
175 | inc bx |
176 | inc bx |
177 | mov [si-4],eax |
178 | loop .loop2 |
179 | ret |
180 | |
181 | section .bss |
182 | alignb 4 |
183 | DOSSaveVectors resd 32 |
184 | |
185 | section .data |
186 | %define comboot_err(x) (DOSErrTramp+4*((x)-20h)) |
187 | |
188 | comboot_vectors: |
189 | dw comboot_return ; INT 20 = exit |
190 | dw comboot_int21 ; INT 21 = DOS-compatible system calls |
191 | dw comboot_int22 ; INT 22 = native system calls |
192 | dw comboot_err(23h) ; INT 23 = DOS Ctrl-C handler |
193 | dw comboot_err(24h) ; INT 24 = DOS critical error handler |
194 | dw comboot_err(25h) ; INT 25 = DOS absolute disk read |
195 | dw comboot_err(26h) ; INT 26 = DOS absolute disk write |
196 | dw comboot_err(27h) ; INT 27 = DOS TSR |
197 | dw comboot_int28 ; INT 28 = DOS idle interrupt |
198 | dw comboot_int29 ; INT 29 = DOS fast console output |
199 | dw comboot_err(2Ah) ; INT 2A = DOS network API (NetBIOS) |
200 | dw comboot_err(2Bh) ; INT 2B = DOS reserved |
201 | dw comboot_err(2Ch) ; INT 2C = DOS reserved |
202 | dw comboot_iret ; INT 2D = DOS reserved, AMIS |
203 | dw comboot_err(2Eh) ; INT 2E = DOS run command |
204 | dw comboot_iret ; INT 2F = DOS multiplex interrupt |
205 | dw comboot_err(30h) ; INT 30 = DOS CP/M system calls |
206 | dw comboot_err(31h) ; INT 31 = DPMI |
207 | dw comboot_err(32h) ; INT 32 = DOS reserved |
208 | dw comboot_iret ; INT 33 = DOS mouse API |
209 | dw comboot_err(34h) ; INT 34 = DOS FPU emulation |
210 | dw comboot_err(35h) ; INT 35 = DOS FPU emulation |
211 | dw comboot_err(36h) ; INT 36 = DOS FPU emulation |
212 | dw comboot_err(37h) ; INT 37 = DOS FPU emulation |
213 | dw comboot_err(38h) ; INT 38 = DOS FPU emulation |
214 | dw comboot_err(39h) ; INT 39 = DOS FPU emulation |
215 | dw comboot_err(3Ah) ; INT 3A = DOS FPU emulation |
216 | dw comboot_err(3Bh) ; INT 3B = DOS FPU emulation |
217 | dw comboot_err(3Ch) ; INT 3C = DOS FPU emulation |
218 | dw comboot_err(3Dh) ; INT 3D = DOS FPU emulation |
219 | dw comboot_err(3Eh) ; INT 3E = DOS FPU emulation |
220 | dw comboot_err(3Fh) ; INT 3F = DOS overlay manager |
221 | |
222 | section .text |
223 | |
224 | ; INT 21h: generic DOS system call |
225 | comboot_int21: sti |
226 | push ds |
227 | push es |
228 | push fs |
229 | push gs |
230 | pushad |
231 | cld |
232 | mov bp,cs |
233 | mov ds,bp |
234 | mov es,bp |
235 | mov bp,sp ; Set up stack frame |
236 | |
237 | call adjust_screen ; The COMBOOT program might have changed the screen |
238 | |
239 | mov cx,int21_count |
240 | mov si,int21_table |
241 | .again: lodsb |
242 | cmp al,P_AH |
243 | lodsw |
244 | loopne .again |
245 | ; The last function in the list is the |
246 | ; "no such function" function |
247 | clc |
248 | call ax ; Call the invoked function |
249 | comboot_resume: |
250 | mov bp,sp ; In case the function clobbers BP |
251 | setc P_FLAGSL ; Propagate CF->error |
252 | popad |
253 | pop gs |
254 | pop fs |
255 | pop es |
256 | pop ds |
257 | comboot_iret: |
258 | iret |
259 | |
260 | comboot_bad_int21: |
261 | mov ax,P_AX |
262 | push P_CSIP |
263 | push 21h |
264 | ; Fall through |
265 | |
266 | ; Attempted to execute invalid DOS system call |
267 | ; The interrupt number is on the stack. |
268 | comboot_bogus: pop dx ; Interrupt number |
269 | pop edi ; CS:IP |
270 | mov cx,err_notdos |
271 | push comboot_bogus_tail |
272 | jmp comboot_exit_msg |
273 | comboot_bogus_tail: |
274 | xchg ax,dx |
275 | call writehex2 ; Interrupt number |
276 | mov al,' ' |
277 | call writechr |
278 | xchg ax,dx |
279 | call writehex4 ; Function number (AX) |
280 | mov al,' ' |
281 | call writechr |
282 | mov eax,edi |
283 | call writehex8 ; CS:IP of the origin |
284 | call crlf |
285 | jmp enter_command |
286 | |
287 | ; |
288 | ; Generic COMBOOT return to command line code |
289 | ; stack -> where to go next |
290 | ; CX -> message (for _msg version) |
291 | ; |
292 | comboot_exit: |
293 | xor cx,cx |
294 | comboot_exit_msg: |
295 | pop bx ; Return address |
296 | RESET_STACK_AND_SEGS SI ; Contains sti, cld |
297 | call adjust_screen ; The COMBOOT program might have changed the screen |
298 | pusha |
299 | mov si,DOSSaveVectors |
300 | mov di,4*20h |
301 | mov cx,20h |
302 | rep movsd ; Restore DOS-range vectors |
303 | popa |
304 | jcxz .nomsg |
305 | mov si,KernelCName |
306 | call writestr |
307 | mov si,cx |
308 | call writestr |
309 | .nomsg: |
310 | jmp bx |
311 | |
312 | ; |
313 | ; INT 21h system calls |
314 | ; |
315 | comboot_getkey: ; 01 = get key with echo |
316 | call vgashowcursor |
317 | call comboot_getchar |
318 | call vgahidecursor |
319 | call writechr |
320 | clc |
321 | ret |
322 | |
323 | comboot_writechr: ; 02 = writechr |
324 | mov al,P_DL |
325 | call writechr |
326 | clc |
327 | ret |
328 | |
329 | comboot_writeserial: ; 04 = write serial port |
330 | mov al,P_DL |
331 | call write_serial |
332 | clc |
333 | ret |
334 | |
335 | comboot_getkeynoecho: ; 08 = get key w/o echo |
336 | call comboot_getchar |
337 | clc |
338 | ret |
339 | |
340 | comboot_writestr: ; 09 = write DOS string |
341 | mov es,P_DS |
342 | mov si,P_DX |
343 | .loop: es lodsb |
344 | cmp al,'$' ; End string with $ - bizarre |
345 | je .done |
346 | call writechr |
347 | jmp short .loop |
348 | .done: clc |
349 | ret |
350 | |
351 | comboot_checkkey: ; 0B = check keyboard status |
352 | cmp byte [APIKeyFlag],00h |
353 | jnz .waiting |
354 | call pollchar |
355 | .waiting: setz al |
356 | dec al ; AL = 0FFh if present, 0 if not |
357 | mov P_AL,al |
358 | clc |
359 | ret |
360 | |
361 | comboot_checkver: ; 30 = check DOS version |
362 | ; We return 0 in all DOS-compatible version registers, |
363 | ; but the high part of eax-ebx-ecx-edx spell "SYSLINUX" |
364 | mov P_EAX,'SY' << 16 |
365 | mov P_EBX,'SL' << 16 |
366 | mov P_ECX,'IN' << 16 |
367 | mov P_EDX,'UX' << 16 |
368 | ret |
369 | |
370 | comboot_getchar: |
371 | cmp byte [APIKeyFlag],00h |
372 | jne .queued |
373 | call getchar ; If not queued get input |
374 | and al,al ; Function key? (CF <- 0) |
375 | jnz .done |
376 | mov [APIKeyWait],ah ; High part of key |
377 | inc byte [APIKeyFlag] ; Set flag |
378 | .done: mov P_AL,al |
379 | ret |
380 | .queued: mov al,[APIKeyWait] |
381 | dec byte [APIKeyFlag] |
382 | jmp .done |
383 | |
384 | ; |
385 | ; INT 28h - DOS idle |
386 | ; |
387 | comboot_int28: |
388 | sti |
389 | cld |
390 | call do_idle |
391 | iret |
392 | |
393 | ; |
394 | ; INT 29h - DOS fast write character |
395 | ; |
396 | comboot_int29: |
397 | sti |
398 | cld |
399 | call writechr ; Preserves registers! |
400 | iret |
401 | |
402 | ; |
403 | ; INT 22h - SYSLINUX-specific system calls |
404 | ; System call number in ax |
405 | ; |
406 | comboot_int22: |
407 | sti |
408 | push ds |
409 | push es |
410 | push fs |
411 | push gs |
412 | pushad |
413 | cld |
414 | mov bp,cs |
415 | mov ds,bp |
416 | mov es,bp |
417 | mov bp,sp ; Set up stack frame |
418 | |
419 | call adjust_screen ; The COMBOOT program might have changed the screen |
420 | |
421 | cmp ax,int22_count |
422 | jb .ok |
423 | xor ax,ax ; Function 0 -> unimplemented |
424 | .ok: |
425 | xchg ax,bx |
426 | add bx,bx ; CF <- 0 |
427 | call [bx+int22_table] |
428 | jmp comboot_resume ; On return |
429 | |
430 | ; |
431 | ; INT 22h AX=0000h Unimplemented call |
432 | ; |
433 | comapi_err: |
434 | stc |
435 | ret |
436 | |
437 | ; |
438 | ; INT 22h AX=0001h Get SYSLINUX version |
439 | ; |
440 | comapi_get_version: |
441 | ; Number of API functions supported |
442 | mov P_AX,int22_count |
443 | ; SYSLINUX version |
444 | mov P_CX,(VERSION_MAJOR << 8)+VERSION_MINOR |
445 | ; SYSLINUX derivative ID byte |
446 | mov P_DX,my_id |
447 | ; For future use |
448 | mov P_BX,cs ; cs == 0 |
449 | |
450 | mov P_ES,ds |
451 | ; ES:SI -> version banner |
452 | mov P_SI,syslinux_banner + 2 ; Skip leading CR LF |
453 | ; ES:DI -> copyright string |
454 | mov P_DI,copyright_str + 1 ; Skip leading space |
455 | |
456 | comapi_nop: |
457 | clc |
458 | ret |
459 | |
460 | ; |
461 | ; INT 22h AX=0002h Write string |
462 | ; |
463 | ; Write null-terminated string in ES:BX |
464 | ; |
465 | comapi_writestr: |
466 | mov ds,P_ES |
467 | mov si,P_BX |
468 | call writestr |
469 | clc |
470 | ret |
471 | |
472 | ; |
473 | ; INT 22h AX=0003h Run command |
474 | ; |
475 | ; Terminates the COMBOOT program and executes the command line in |
476 | ; ES:BX as if it had been entered by the user. |
477 | ; |
478 | comapi_run: |
479 | mov ds,P_ES |
480 | mov si,P_BX |
481 | mov di,command_line |
482 | call strcpy |
483 | push load_kernel ; Run a new kernel |
484 | jmp comboot_exit ; Terminate task, clean up |
485 | |
486 | ; |
487 | ; INT 22h AX=0004h Run default command |
488 | ; |
489 | ; Terminates the COMBOOT program and executes the default command line |
490 | ; as if a timeout had happened or the user pressed <Enter>. |
491 | ; |
492 | comapi_run_default: |
493 | push auto_boot |
494 | jmp comboot_exit |
495 | |
496 | ; |
497 | ; INT 22h AX=0005h Force text mode |
498 | ; |
499 | ; Puts the video in standard text mode |
500 | ; |
501 | comapi_textmode: |
502 | call vgaclearmode |
503 | clc |
504 | ret |
505 | |
506 | ; |
507 | ; INT 22h AX=0006h Open file |
508 | ; |
509 | comapi_open: |
510 | call reset_idle |
511 | push ds |
512 | mov ds,P_ES |
513 | mov si,P_SI |
514 | mov di,InitRD |
515 | call mangle_name |
516 | pop ds |
517 | call searchdir |
518 | jz comapi_err |
519 | mov P_EAX,eax |
520 | mov P_CX,SECTOR_SIZE |
521 | mov P_SI,si |
522 | clc |
523 | ret |
524 | |
525 | ; |
526 | ; INT 22h AX=0007h Read file |
527 | ; |
528 | comapi_read: |
529 | call reset_idle |
530 | mov es,P_ES |
531 | mov bx,P_BX |
532 | mov si,P_SI |
533 | mov cx,P_CX |
534 | call getfssec |
535 | jnc .noteof |
536 | xor si,si ; SI <- 0 on EOF, CF <- 0 |
537 | .noteof: mov P_SI,si |
538 | mov P_ECX,ecx |
539 | ret |
540 | |
541 | ; |
542 | ; INT 22h AX=0008h Close file |
543 | ; |
544 | comapi_close: |
545 | mov si,P_SI |
546 | call close_file |
547 | clc |
548 | ret |
549 | |
550 | ; |
551 | ; INT 22h AX=0009h Call PXE stack |
552 | ; |
553 | %if IS_PXELINUX |
554 | comapi_pxecall: |
555 | mov bx,P_BX |
556 | mov es,P_ES |
557 | mov di,P_DI |
558 | call pxenv |
559 | mov ax,[PXEStatus] |
560 | mov P_AX,ax |
561 | ret |
562 | %else |
563 | comapi_pxecall equ comapi_err ; Not available |
564 | %endif |
565 | |
566 | ; |
567 | ; INT 22h AX=000Ah Get Derivative-Specific Info |
568 | ; |
569 | comapi_derinfo: |
570 | mov P_AL,my_id |
571 | %if IS_PXELINUX |
572 | mov ax,[APIVer] |
573 | mov P_DX,ax |
574 | mov ax,[StrucPtr] |
575 | mov P_BX,ax |
576 | mov ax,[StrucPtr+2] |
577 | mov P_ES,ax |
578 | mov ax,[InitStack] |
579 | mov P_SI,ax |
580 | mov ax,[InitStack+2] |
581 | mov P_FS,ax |
582 | mov eax,[MyIP] |
583 | mov P_ECX,eax |
584 | %else |
585 | ; Physical medium... |
586 | |
587 | mov P_CL,SECTOR_SHIFT |
588 | mov al,[DriveNumber] |
589 | mov P_DL,al |
590 | mov P_FS,cs |
591 | mov P_SI,OrigESDI |
592 | %if IS_SYSLINUX || IS_EXTLINUX |
593 | mov P_ES,cs |
594 | mov P_BX,PartInfo |
595 | %elif IS_ISOLINUX |
596 | mov P_ES,cs |
597 | mov P_BX,spec_packet |
598 | mov ax,[BIOSType] |
599 | sub ax,bios_cdrom |
600 | shr ax,2 |
601 | mov P_CH,al ; Mode (el torito/cbios/ebios) |
602 | %endif |
603 | %endif |
604 | clc |
605 | ret |
606 | |
607 | ; |
608 | ; INT 22h AX=000Bh Get Serial Console Configuration |
609 | ; |
610 | comapi_serialcfg: |
611 | mov ax,[SerialPort] |
612 | mov P_DX,ax |
613 | mov ax,[BaudDivisor] |
614 | mov P_CX,ax |
615 | mov ax,[FlowControl] |
616 | or al,ah |
617 | mov ah,[FlowIgnore] |
618 | shr ah,4 |
619 | test byte [DisplayCon],01h |
620 | jnz .normalconsole |
621 | or ah,80h |
622 | .normalconsole: |
623 | mov P_BX,ax |
624 | clc |
625 | ret |
626 | |
627 | ; |
628 | ; INT 22h AX=000Ch Perform final cleanup |
629 | ; |
630 | comapi_cleanup: |
631 | %if IS_PXELINUX |
632 | ; Unload PXE if requested |
633 | test dl,3 |
634 | setnz [KeepPXE] |
635 | sub bp,sp ; unload_pxe may move the stack around |
636 | call unload_pxe |
637 | add bp,sp ; restore frame pointer... |
638 | %elif IS_SYSLINUX || IS_EXTLINUX |
639 | ; Restore original FDC table |
640 | mov eax,[OrigFDCTabPtr] |
641 | mov [fdctab],eax |
642 | %endif |
643 | call cleanup_hardware |
644 | clc |
645 | ret |
646 | |
647 | ; |
648 | ; INT 22h AX=000Dh Clean up then replace bootstrap |
649 | ; |
650 | comapi_chainboot: |
651 | call comapi_cleanup |
652 | mov eax,P_EDI |
653 | mov [trackbuf+4],eax ; Copy from |
654 | mov eax,P_ECX |
655 | mov [trackbuf+8],eax ; Total bytes |
656 | mov eax,7C00h |
657 | mov [trackbuf],eax ; Copy to |
658 | push eax ; Entry point on stack |
659 | mov esi,P_ESI |
660 | mov edx,P_EBX |
661 | mov bx,P_DS |
662 | jmp replace_bootstrap_one |
663 | |
664 | ; |
665 | ; INT 22h AX=000Eh Get configuration file name |
666 | ; |
667 | comapi_configfile: |
668 | mov P_ES,cs |
669 | mov P_BX,ConfigName |
670 | clc |
671 | ret |
672 | |
673 | ; |
674 | ; INT 22h AX=000Fh Get IPAPPEND strings |
675 | ; |
676 | comapi_ipappend: |
677 | mov P_ES,cs |
678 | mov P_CX,numIPAppends |
679 | mov P_BX,IPAppends |
680 | clc |
681 | ret |
682 | |
683 | ; |
684 | ; INT 22h AX=0010h Resolve hostname |
685 | ; |
686 | %if IS_PXELINUX |
687 | comapi_dnsresolv: |
688 | mov ds,P_ES |
689 | mov si,P_BX |
690 | call dns_resolv |
691 | mov P_EAX,eax |
692 | clc |
693 | ret |
694 | %else |
695 | comapi_dnsresolv equ comapi_err |
696 | %endif |
697 | |
698 | section .text |
699 | |
700 | ; |
701 | ; INT 22h AX=0011h Obsolete |
702 | ; |
703 | |
704 | ; |
705 | ; INT 22h AX=0012h Obsolete |
706 | ; |
707 | |
708 | ; |
709 | ; INT 22h AX=0013h Idle call |
710 | ; |
711 | comapi_idle: |
712 | call do_idle |
713 | clc |
714 | ret |
715 | |
716 | ; |
717 | ; INT 22h AX=0014h Local boot |
718 | ; |
719 | %if HAS_LOCALBOOT |
720 | comapi_localboot: |
721 | mov ax,P_DX |
722 | jmp local_boot |
723 | %else |
724 | comapi_localboot equ comapi_err |
725 | %endif ; HAS_LOCALBOOT |
726 | |
727 | ; |
728 | ; INT 22h AX=0015h Feature flags |
729 | ; |
730 | comapi_features: |
731 | mov P_ES,cs |
732 | mov P_BX,feature_flags |
733 | mov P_CX,feature_flags_len |
734 | clc |
735 | ret |
736 | |
737 | ; |
738 | ; INT 22h AX=0016h Run kernel image |
739 | ; |
740 | comapi_runkernel: |
741 | mov al,P_DL |
742 | cmp al,VK_TYPES-1 |
743 | ja .error |
744 | mov [KernelType],al |
745 | push ds |
746 | mov ds,P_DS |
747 | mov si,P_SI |
748 | mov di,KernelName |
749 | call mangle_name |
750 | pop ds |
751 | call searchdir |
752 | jz comapi_err |
753 | |
754 | ; The kernel image was found, so we can load it... |
755 | mov [Kernel_SI],si |
756 | mov [Kernel_EAX],eax |
757 | |
758 | ; It's not just possible, but quite likely, that ES:BX |
759 | ; points into real_mode_seg or xfer_buf_seg, so we |
760 | ; need to exercise some special care here... use |
761 | ; trackbuf as an intermediary |
762 | push ds |
763 | mov ds,P_ES |
764 | mov si,P_BX |
765 | mov di,trackbuf |
766 | call strcpy |
767 | pop ds |
768 | |
769 | %if IS_PXELINUX |
770 | mov al,P_CL |
771 | mov [IPAppend],al |
772 | %endif |
773 | |
774 | call comboot_exit |
775 | |
776 | .finish: |
777 | ; Copy the command line into its proper place |
778 | push es |
779 | mov dx,real_mode_seg |
780 | mov es,dx |
781 | mov si,trackbuf |
782 | mov di,cmd_line_here |
783 | call strcpy |
784 | mov byte [es:di-1],' ' ; Simulate APPEND |
785 | pop es |
786 | mov [CmdLinePtr],di |
787 | mov word [CmdOptPtr],zero_string |
788 | jmp kernel_good_saved |
789 | |
790 | .error equ comapi_usingvga.error |
791 | |
792 | ; |
793 | ; INT 22h AX=0017h Report video mode change |
794 | ; |
795 | comapi_usingvga: |
796 | mov ax,P_BX |
797 | cmp ax,0Fh ; Unknown flags = failure |
798 | ja .error |
799 | mov [UsingVGA],al |
800 | mov cx,P_CX |
801 | mov dx,P_DX |
802 | mov [GXPixCols],cx |
803 | mov [GXPixRows],dx |
804 | test al,08h |
805 | jnz .notext |
806 | call adjust_screen |
807 | .notext: |
808 | clc |
809 | ret |
810 | .error: |
811 | stc |
812 | ret |
813 | |
814 | ; |
815 | ; INT 22h AX=0018h Query custom font |
816 | ; |
817 | comapi_userfont: |
818 | mov al,[UserFont] |
819 | and al,al |
820 | jz .done |
821 | mov al,[VGAFontSize] |
822 | mov P_ES,aux_seg |
823 | mov P_BX,aux.fontbuf |
824 | |
825 | .done: ; CF=0 here |
826 | mov P_AL,al |
827 | ret |
828 | |
829 | ; |
830 | ; INT 22h AX=0019h Read disk |
831 | ; |
832 | %if IS_SYSLINUX || IS_ISOLINUX || IS_EXTLINUX |
833 | comapi_readdisk: |
834 | call reset_idle |
835 | mov esi,P_ESI ; Enforce ESI == EDI == 0, these |
836 | or esi,P_EDI ; are reserved for future expansion |
837 | jnz .err |
838 | mov eax,P_EDX |
839 | mov es,P_ES |
840 | mov bx,P_BX |
841 | mov bp,P_CX ; WE CANNOT use P_* after touching bp! |
842 | call getlinsec |
843 | clc |
844 | ret |
845 | .err: |
846 | stc |
847 | ret |
848 | %else |
849 | comapi_readdisk equ comapi_err |
850 | %endif |
851 | |
852 | ; |
853 | ; INT 22h AX=001Ah Obsolete |
854 | ; |
855 | |
856 | ; |
857 | ; INT 22h AX=001Bh Obsolete |
858 | ; |
859 | |
860 | ; |
861 | ; INT 22h AX=001Ch Get pointer to auxillary data vector |
862 | ; |
863 | comapi_getadv: |
864 | mov P_ES,ds |
865 | mov P_BX,adv0.data |
866 | mov P_CX,ADV_LEN |
867 | ret |
868 | |
869 | ; |
870 | ; INT 22h AX=001Dh Write auxillary data vector |
871 | ; |
872 | comapi_writeadv equ adv_write |
873 | |
874 | ; |
875 | ; INT 22h AX=001Eh Keyboard remapping table |
876 | comapi_kbdtable: |
877 | cmp P_DX,0 |
878 | jne .err |
879 | mov P_AX,1 ; Version |
880 | mov P_CX,256 ; Length |
881 | mov P_ES,cs |
882 | mov P_BX,KbdMap |
883 | ret |
884 | .err: |
885 | stc |
886 | ret |
887 | |
888 | ; |
889 | ; INT 22h AX=001Fh Get current working directory |
890 | ; |
891 | comapi_getcwd: |
892 | mov P_ES,cs |
893 | mov P_BX,CurrentDirName |
894 | clc |
895 | ret |
896 | |
897 | ; |
898 | ; INT 22h AX=0020h Open directory |
899 | ; |
900 | %if IS_SYSLINUX |
901 | comapi_opendir: |
902 | call reset_idle |
903 | push ds |
904 | mov ds,P_ES |
905 | mov si,P_SI |
906 | mov di,InitRD |
907 | call mangle_name |
908 | pop ds |
909 | call searchdir |
910 | jnz comapi_err ; Didn't find a directory |
911 | cmp eax,0 |
912 | jz comapi_err ; Found nothing |
913 | ;ZF is unset |
914 | call alloc_fill_dir |
915 | mov P_EAX,eax |
916 | mov P_CX,SECTOR_SIZE |
917 | mov P_SI,si |
918 | clc |
919 | ret |
920 | %else |
921 | comapi_opendir equ comapi_err |
922 | %endif |
923 | |
924 | ; |
925 | ; INT 22h AX=0021h Read directory |
926 | ; |
927 | %if IS_SYSLINUX |
928 | comapi_readdir: |
929 | call reset_idle |
930 | mov es,P_ES |
931 | mov di,P_DI |
932 | mov si,P_SI |
933 | call readdir |
934 | mov P_EAX,eax |
935 | mov P_DL,dl |
936 | mov P_EBX,ebx |
937 | mov P_SI,si |
938 | ret |
939 | %else |
940 | comapi_readdir equ comapi_err |
941 | %endif |
942 | |
943 | ; |
944 | ; INT 22h AX=0022h Close directory |
945 | ; |
946 | %if IS_SYSLINUX |
947 | comapi_closedir: |
948 | mov si,P_SI |
949 | call close_dir |
950 | clc |
951 | ret |
952 | %else |
953 | comapi_closedir equ comapi_err |
954 | %endif |
955 | |
956 | ; |
957 | ; INT 22h AX=0023h Query shuffler size |
958 | ; |
959 | comapi_shufsize: |
960 | mov P_CX,bcopyxx_safe |
961 | ret |
962 | |
963 | ; |
964 | ; INT 22h AX=0024h Cleanup, shuffle and boot raw |
965 | ; |
966 | comapi_shufraw: |
967 | call comapi_cleanup |
968 | mov edi,P_EDI |
969 | mov esi,P_ESI |
970 | mov ecx,P_ECX |
971 | jmp shuffle_and_boot_raw |
972 | |
973 | section .data |
974 | |
975 | %macro int21 2 |
976 | db %1 |
977 | dw %2 |
978 | %endmacro |
979 | |
980 | int21_table: |
981 | int21 00h, comboot_return |
982 | int21 01h, comboot_getkey |
983 | int21 02h, comboot_writechr |
984 | int21 04h, comboot_writeserial |
985 | int21 08h, comboot_getkeynoecho |
986 | int21 09h, comboot_writestr |
987 | int21 0Bh, comboot_checkkey |
988 | int21 30h, comboot_checkver |
989 | int21 4Ch, comboot_return |
990 | int21 -1, comboot_bad_int21 |
991 | int21_count equ ($-int21_table)/3 |
992 | |
993 | alignz 2 |
994 | int22_table: |
995 | dw comapi_err ; 0000 unimplemented syscall |
996 | dw comapi_get_version ; 0001 get SYSLINUX version |
997 | dw comapi_writestr ; 0002 write string |
998 | dw comapi_run ; 0003 run specified command |
999 | dw comapi_run_default ; 0004 run default command |
1000 | dw comapi_textmode ; 0005 force text mode |
1001 | dw comapi_open ; 0006 open file |
1002 | dw comapi_read ; 0007 read file |
1003 | dw comapi_close ; 0008 close file |
1004 | dw comapi_pxecall ; 0009 call PXE stack |
1005 | dw comapi_derinfo ; 000A derivative-specific info |
1006 | dw comapi_serialcfg ; 000B get serial port config |
1007 | dw comapi_cleanup ; 000C perform final cleanup |
1008 | dw comapi_err ; 000D clean up then bootstrap |
1009 | dw comapi_configfile ; 000E get name of config file |
1010 | dw comapi_ipappend ; 000F get ipappend strings |
1011 | dw comapi_dnsresolv ; 0010 resolve hostname |
1012 | dw comapi_err ; 0011 maximum shuffle descriptors |
1013 | dw comapi_err ; 0012 cleanup, shuffle and boot |
1014 | dw comapi_idle ; 0013 idle call |
1015 | dw comapi_localboot ; 0014 local boot |
1016 | dw comapi_features ; 0015 feature flags |
1017 | dw comapi_runkernel ; 0016 run kernel image |
1018 | dw comapi_usingvga ; 0017 report video mode change |
1019 | dw comapi_userfont ; 0018 query custom font |
1020 | dw comapi_readdisk ; 0019 read disk |
1021 | dw comapi_err ; 001A cleanup, shuffle and boot to pm |
1022 | dw comapi_err ; 001B cleanup, shuffle and boot to rm |
1023 | dw comapi_getadv ; 001C get pointer to ADV |
1024 | dw comapi_writeadv ; 001D write ADV to disk |
1025 | dw comapi_kbdtable ; 001E keyboard remapping table |
1026 | dw comapi_getcwd ; 001F get current working directory |
1027 | dw comapi_opendir ; 0020 open directory |
1028 | dw comapi_readdir ; 0021 read directory |
1029 | dw comapi_closedir ; 0022 close directory |
1030 | dw comapi_shufsize ; 0023 query shuffler size |
1031 | dw comapi_shufraw ; 0024 cleanup, shuffle and boot raw |
1032 | int22_count equ ($-int22_table)/2 |
1033 | |
1034 | APIKeyWait db 0 |
1035 | APIKeyFlag db 0 |
1036 | |
1037 | zero_string db 0 ; Empty, null-terminated string |
1038 | |
1039 | ; |
1040 | ; This is the feature flag array for INT 22h AX=0015h |
1041 | ; |
1042 | ; Note: PXELINUX clears the idle is noop flag if appropriate |
1043 | ; in pxe_detect_nic_type |
1044 | ; |
1045 | feature_flags: |
1046 | db 1 ; Have local boot, idle is not noop |
1047 | feature_flags_len equ ($-feature_flags) |
1048 | |
1049 | err_notdos db ': attempted DOS system call INT ',0 |
1050 | err_comlarge db 'COMBOOT image too large.', CR, LF, 0 |
1051 | |
1052 | section .bss1 |
1053 | alignb 4 |
1054 | DOSErrTramp resd 33 ; Error trampolines |
1055 | ConfigName resb FILENAME_MAX |
1056 | CurrentDirName resb FILENAME_MAX |