root/core/comboot.inc

Revision 33cef16bfdef4576be2b538506b4f8a61bf9c0a2, 20.4 KB (checked in by H. Peter Anvin <hpa@…>, 17 months ago)

core: remove HAS_LOCALBOOT

HAS_LOCALBOOT is set unconditionally in config.inc.

Signed-off-by: Sebastian Herbszt <herbszt@…>
Signed-off-by: H. Peter Anvin <hpa@…>

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