1 ;; -----------------------------------------------------------------------
3 ;; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved
4 ;; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin
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.
12 ;; -----------------------------------------------------------------------
17 ;; Common code for running a COMBOOT image
21 ; Parameter registers definition; this is the definition
22 ; of the stack frame used by INT 21h and INT 22h.
23 %define P_FLAGS word [bp+44]
24 %define P_FLAGSL byte [bp+44]
25 %define P_FLAGSH byte [bp+45]
26 %define P_CS word [bp+42]
27 %define P_IP word [bp+40]
28 %define P_CSIP dword [bp+40]
29 %define P_DS word [bp+38]
30 %define P_ES word [bp+36]
31 %define P_FS word [bp+34]
32 %define P_GS word [bp+32]
33 %define P_EAX dword [bp+28]
34 %define P_AX word [bp+28]
35 %define P_HAX word [bp+30]
36 %define P_AL byte [bp+28]
37 %define P_AH byte [bp+29]
38 %define P_ECX dword [bp+24]
39 %define P_CX word [bp+24]
40 %define P_HCX word [bp+26]
41 %define P_CL byte [bp+24]
42 %define P_CH byte [bp+25]
43 %define P_EDX dword [bp+20]
44 %define P_DX word [bp+20]
45 %define P_HDX word [bp+22]
46 %define P_DL byte [bp+20]
47 %define P_DH byte [bp+21]
48 %define P_EBX dword [bp+16]
49 %define P_BX word [bp+16]
50 %define P_HBX word [bp+18]
51 %define P_BL byte [bp+16]
52 %define P_BH byte [bp+17]
53 %define P_EBP dword [bp+8]
54 %define P_BP word [bp+8]
55 %define P_HBP word [bp+10]
56 %define P_ESI dword [bp+4]
57 %define P_SI word [bp+4]
58 %define P_HSI word [bp+6]
59 %define P_EDI dword [bp]
60 %define P_DI word [bp]
61 %define P_HDI word [bp+2]
64 ; Set up the COMBOOT API interrupt vectors. This is now done at
65 ; initialization time.
68 mov di,DOSErrTramp ; Error trampolines
71 mov eax,02EB206Ah ; push 20h; jmp $+4
77 mov ax,comboot_bogus-2
82 mov si,4*20h ; DOS interrupt vectors
83 mov bx,comboot_vectors
95 ; Restore the original state of the COMBOOT API vectors, and free
96 ; any low memory allocated by the comboot module.
98 global comboot_cleanup_api
101 mov si,DOSSaveVectors
104 rep movsd ; Restore DOS-range vectors
110 DOSSaveVectors resd 32
113 %define comboot_err(x) (DOSErrTramp+4*((x)-20h))
116 dw comboot_return ; INT 20 = exit
117 dw comboot_int21 ; INT 21 = DOS-compatible system calls
118 dw comboot_int22 ; INT 22 = native system calls
119 dw comboot_err(23h) ; INT 23 = DOS Ctrl-C handler
120 dw comboot_err(24h) ; INT 24 = DOS critical error handler
121 dw comboot_err(25h) ; INT 25 = DOS absolute disk read
122 dw comboot_err(26h) ; INT 26 = DOS absolute disk write
123 dw comboot_err(27h) ; INT 27 = DOS TSR
124 dw comboot_int28 ; INT 28 = DOS idle interrupt
125 dw comboot_int29 ; INT 29 = DOS fast console output
126 dw comboot_err(2Ah) ; INT 2A = DOS network API (NetBIOS)
127 dw comboot_err(2Bh) ; INT 2B = DOS reserved
128 dw comboot_err(2Ch) ; INT 2C = DOS reserved
129 dw comboot_iret ; INT 2D = DOS reserved, AMIS
130 dw comboot_err(2Eh) ; INT 2E = DOS run command
131 dw comboot_iret ; INT 2F = DOS multiplex interrupt
132 dw comboot_err(30h) ; INT 30 = DOS CP/M system calls
133 dw comboot_err(31h) ; INT 31 = DPMI
134 dw comboot_err(32h) ; INT 32 = DOS reserved
135 dw comboot_iret ; INT 33 = DOS mouse API
136 dw comboot_err(34h) ; INT 34 = DOS FPU emulation
137 dw comboot_err(35h) ; INT 35 = DOS FPU emulation
138 dw comboot_err(36h) ; INT 36 = DOS FPU emulation
139 dw comboot_err(37h) ; INT 37 = DOS FPU emulation
140 dw comboot_err(38h) ; INT 38 = DOS FPU emulation
141 dw comboot_err(39h) ; INT 39 = DOS FPU emulation
142 dw comboot_err(3Ah) ; INT 3A = DOS FPU emulation
143 dw comboot_err(3Bh) ; INT 3B = DOS FPU emulation
144 dw comboot_err(3Ch) ; INT 3C = DOS FPU emulation
145 dw comboot_err(3Dh) ; INT 3D = DOS FPU emulation
146 dw comboot_err(3Eh) ; INT 3E = DOS FPU emulation
147 dw comboot_err(3Fh) ; INT 3F = DOS overlay manager
151 ; INT 21h: generic DOS system call
162 mov bp,sp ; Set up stack frame
164 pm_call pm_adjust_screen ; The COMBOOT program might hav changed the screen
172 ; The last function in the list is the
173 ; "no such function" function
175 call ax ; Call the invoked function
177 mov bp,sp ; In case the function clobbers BP
178 setc P_FLAGSL ; Propagate CF->error
193 ; Attempted to execute invalid DOS system call
194 ; The interrupt number is on the stack.
195 comboot_bogus: pop dx ; Interrupt number
198 push comboot_bogus_tail
202 pm_call pm_writehex2 ; Interrupt number
206 pm_call pm_writehex4 ; Function number (AX)
210 pm_call pm_writehex8 ; CS:IP of the origin
214 ; Proper return vector
215 ; Note: this gets invoked both via INT 21h and directly via INT 20h.
216 ; We don't need to cld explicitly here, because comboot_exit does that
217 ; when invoking RESET_STACK_AND_SEGS.
219 cli ; May not have a safe stack
220 push enter_command ; Normal return to command prompt
224 ; Generic COMBOOT return to command line code
225 ; stack -> where to go next
226 ; CX -> message (for _msg version)
228 extern comboot_cleanup_lowmem
232 pop bx ; Return address
233 RESET_STACK_AND_SEGS si ; Contains sti, cld
234 pm_call comboot_cleanup_lowmem
235 pm_call pm_adjust_screen; The COMBOOT program might have change the screen
245 ; INT 21h system calls
247 comboot_getkey: ; 01 = get key with echo
248 pm_call vgashowcursor
250 pm_call vgahidecursor
255 comboot_writechr: ; 02 = writechr
261 comboot_writeserial: ; 04 = write serial port
263 pm_call pm_write_serial
267 comboot_getkeynoecho: ; 08 = get key w/o echo
272 comboot_writestr: ; 09 = write DOS string
276 cmp al,'$' ; End string with $ - bizarre
283 comboot_checkkey: ; 0B = check keyboard status
284 cmp byte [APIKeyFlag],00h
288 dec al ; AL = 0FFh if present, 0 if not
293 comboot_checkver: ; 30 = check DOS version
294 ; We return 0 in all DOS-compatible version registers,
295 ; but the high part of eax-ebx-ecx-edx spell "SYSLINUX"
303 cmp byte [APIKeyFlag],00h
305 pm_call pm_getchar ; If not queued get input
306 and al,al ; Function key? (CF <- 0)
308 mov [APIKeyWait],ah ; High part of key
309 inc byte [APIKeyFlag] ; Set flag
312 .queued: mov al,[APIKeyWait]
313 dec byte [APIKeyFlag]
326 ; INT 29h - DOS fast write character
335 ; INT 22h - SYSLINUX-specific system calls
336 ; System call number in ax
349 mov bp,sp ; Set up stack frame
351 pm_call pm_adjust_screen ; The COMBOOT program might hav changed the screen
355 xor ax,ax ; Function 0 -> unimplemented
359 call [bx+int22_table]
360 jmp comboot_resume ; On return
363 ; INT 22h AX=0000h Unimplemented call
370 ; INT 22h AX=000Ah Get Derivative-Specific Info
385 mov eax,[IPInfo.MyIP]
400 %if IS_SYSLINUX || IS_EXTLINUX
409 mov P_CH,al ; Mode (el torito/cbios/ebios)
416 ; INT 22h AX=001Ch Get pointer to auxillary data vector
425 ; INT 22h AX=001Dh Write auxillary data vector
427 comapi_writeadv equ adv_write
430 ; INT 22h AX=0024h Cleanup, shuffle and boot raw
434 ; Unload PXE if requested
437 sub bp,sp ; unload_pxe may move the stack around
439 add bp,sp ; restore frame pointer...
440 %elif IS_SYSLINUX || IS_EXTLINUX
441 ; Restore original FDC table
442 mov eax,[OrigFDCTabPtr]
445 pm_call cleanup_hardware
449 jmp shuffle_and_boot_raw
452 ; INT 22h AX=0025h Initialize the ADV structure
466 int21 00h, comboot_return
467 int21 01h, comboot_getkey
468 int21 02h, comboot_writechr
469 int21 04h, comboot_writeserial
470 int21 08h, comboot_getkeynoecho
471 int21 09h, comboot_writestr
472 int21 0Bh, comboot_checkkey
473 int21 30h, comboot_checkver
474 int21 4Ch, comboot_return
475 int21 -1, comboot_bad_int21
476 int21_count equ ($-int21_table)/3
480 dw comapi_err ; 0000 unimplemented syscall
481 dw comapi_err ; 0001 get SYSLINUX version
482 dw comapi_err ; 0002 write string
483 dw comapi_err ; 0003 run specified command
484 dw comapi_err ; 0004 run default command
485 dw comapi_err ; 0005 force text mode
486 dw comapi_err ; 0006 open file
487 dw comapi_err ; 0007 read file
488 dw comapi_err ; 0008 close file
489 dw comapi_err ; 0009 call PXE stack
490 dw comapi_derinfo ; 000A derivative-specific info
491 dw comapi_err ; 000B get serial port config
492 dw comapi_err ; 000C perform final cleanup
493 dw comapi_err ; 000D clean up then bootstrap
494 dw comapi_err ; 000E get name of config file
495 dw comapi_err ; 000F get ipappend strings
496 dw comapi_err ; 0010 resolve hostname
497 dw comapi_err ; 0011 maximum shuffle descriptors
498 dw comapi_err ; 0012 cleanup, shuffle and boot
499 dw comapi_err ; 0013 idle call
500 dw comapi_err ; 0014 local boot
501 dw comapi_err ; 0015 feature flags
502 dw comapi_err ; 0016 run kernel image
503 dw comapi_err ; 0017 report video mode change
504 dw comapi_err ; 0018 query custom font
505 dw comapi_err ; 0019 read disk
506 dw comapi_err ; 001A cleanup, shuffle and boot to pm
507 dw comapi_err ; 001B cleanup, shuffle and boot to rm
508 dw comapi_getadv ; 001C get pointer to ADV
509 dw comapi_writeadv ; 001D write ADV to disk
510 dw comapi_err ; 001E keyboard remapping table
511 dw comapi_err ; 001F get current working directory
512 dw comapi_err ; 0020 open directory
513 dw comapi_err ; 0021 read directory
514 dw comapi_err ; 0022 close directory
515 dw comapi_err ; 0023 query shuffler size
516 dw comapi_shufraw ; 0024 cleanup, shuffle and boot raw
517 dw comapi_initadv ; 0025 initialize adv structure
518 int22_count equ ($-int22_table)/2
523 zero_string db 0 ; Empty, null-terminated string
525 err_notdos db ': attempted DOS system call INT ',0
526 err_comlarge db 'COMBOOT image too large.', CR, LF, 0
530 DOSErrTramp resd 33 ; Error trampolines
532 %ifndef HAVE_CURRENTDIRNAME
533 global CurrentDirName
534 CurrentDirName resb FILENAME_MAX