home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 August (Alt) / CHIP 2005-08.1.iso / program / guvenlik / syslinux-3.07.exe / comboot.inc < prev    next >
Encoding:
Text File  |  2005-01-11  |  13.5 KB  |  685 lines

  1. ;; $Id: comboot.inc,v 1.38 2005/01/12 00:34:54 hpa Exp $
  2. ;; -----------------------------------------------------------------------
  3. ;;   
  4. ;;   Copyright 1994-2005 H. Peter Anvin - All Rights Reserved
  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_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]
  62.  
  63. ; Looks like a COMBOOT image but too large
  64. comboot_too_large:
  65.         mov si,err_comlarge
  66.         call cwritestr
  67.         jmp enter_command
  68.  
  69. ;
  70. ; Load a COMBOOT image.  A COMBOOT image is basically a DOS .COM file,
  71. ; except that it may, of course, not contain any DOS system calls.  We
  72. ; do, however, allow the execution of INT 20h to return to SYSLINUX.
  73. ;
  74. is_comboot_image:
  75.         and dx,dx
  76.         jnz comboot_too_large
  77.         cmp ax,0ff00h        ; Max size in bytes
  78.         jae comboot_too_large
  79.  
  80.         push si            ; Save file handle
  81.  
  82.         call make_plain_cmdline
  83.  
  84.         call comboot_setup_api
  85.  
  86.         mov cx,comboot_seg
  87.         mov es,cx
  88.  
  89.         xor di,di
  90.         mov cx,64        ; 256 bytes (size of PSP)
  91.         xor eax,eax        ; Clear PSP
  92.         rep stosd
  93.  
  94.         mov word [es:0], 020CDh    ; INT 20h instruction
  95.         ; First non-free paragraph
  96.         ; This is valid because comboot_seg == real_mode_seg
  97.         ; == the highest segment used by all derivatives
  98.         int 12h            ; Get DOS memory size
  99.         shl ax,6        ; Kilobytes -> paragraphs
  100.         mov word [es:02h],ax
  101.  
  102. %ifndef DEPEND
  103. %if real_mode_seg != comboot_seg
  104. %error "This code assumes real_mode_seg == comboot_seg"
  105. %endif
  106. %endif
  107.         ; Copy the command line from high memory
  108.         mov si,cmd_line_here
  109.         mov cx,125        ; Max cmdline len (minus space and CR)
  110.         mov di,081h        ; Offset in PSP for command line
  111.         mov al,' '        ; DOS command lines begin with a space
  112.         stosb
  113.  
  114. .loop:        es lodsb
  115.         and al,al
  116.         jz .done
  117.         stosb
  118.         loop .loop
  119. .done:
  120.  
  121.         mov al,0Dh        ; CR after last character
  122.         stosb
  123.         mov ax,di
  124.         sub al,82h        ; Include space but not CR
  125.         mov [es:80h],al        ; Store command line length
  126.  
  127.         ; Now actually load the file...
  128.         pop si            ; File handle
  129.         mov bx,100h        ; Load at <seg>:0100h
  130.         mov cx,0FF00h >> SECTOR_SHIFT
  131.                     ; Absolute maximum # of sectors
  132.         call getfssec
  133.  
  134.         ; And invoke the program...
  135.         mov [SavedSSSP],sp
  136.         mov [SavedSSSP+2],ss    ; Save away SS:SP
  137.  
  138.         mov ax,es
  139.         mov ds,ax
  140.         mov ss,ax
  141.         xor sp,sp
  142.         push word 0        ; Return to address 0 -> exit
  143.  
  144.         jmp comboot_seg:100h    ; Run it
  145.  
  146. ; Proper return vector
  147. comboot_return:    cli            ; Don't trust anyone
  148.         xor ax,ax
  149.         jmp comboot_exit
  150.  
  151. ;
  152. ; Set up the COMBOOT API interrupt vectors.  This is also used
  153. ; by the COM32 code.
  154. ;
  155. comboot_setup_api:
  156.         mov di,4*0x20        ; DOS interrupt vectors
  157.         mov eax,comboot_return    ; INT 20h = exit
  158.         stosd
  159.         mov ax,comboot_int21    ; INT 21h = DOS-compatible syscalls
  160.         stosd
  161.         mov ax,comboot_int22    ; INT 22h = proprietary syscalls
  162.         stosd
  163.         mov ax,comboot_bogus
  164.         mov cx,29        ; All remaining DOS vectors
  165.         rep stosd
  166.         ret
  167.  
  168. ; INT 21h: generic DOS system call
  169. comboot_int21:    cli
  170.         push ds
  171.         push es
  172.         push fs
  173.         push gs
  174.         pushad
  175.         cld
  176.         mov bp,cs
  177.         mov ds,bp
  178.         mov es,bp
  179.         mov bp,sp            ; Set up stack frame
  180.  
  181.         call adjust_screen        ; The COMBOOT program might have changed the screen
  182.  
  183.         mov cx,int21_count
  184.         mov si,int21_table
  185. .again:        lodsb
  186.         cmp al,P_AH
  187.         lodsw
  188.         loopne .again
  189.         ; The last function in the list is the
  190.         ; "no such function" function
  191.         clc
  192.         call ax            ; Call the invoked function
  193. comboot_resume:
  194.         setc P_FLAGSL        ; Propagate CF->error
  195.         popad
  196.         pop gs
  197.         pop fs
  198.         pop es
  199.         pop ds
  200.         iret
  201.  
  202. ; Attempted to execute non-21h DOS system call
  203. comboot_bogus:    cli            ; Don't trust anyone
  204.         mov ax,err_notdos
  205. ;
  206. ; Generic COMBOOT return to command line code
  207. ;  AX -> message (if any)
  208. ;  BX -> where to go next
  209. ;
  210. comboot_exit:
  211.         mov bx,enter_command    ; Normal return to command prompt
  212. comboot_exit_special:
  213.         xor dx,dx
  214.         mov ds,dx
  215.         mov es,dx
  216.         lss sp,[SavedSSSP]
  217.         sti
  218.         cld
  219.         call adjust_screen    ; The COMBOOT program might have changed the screen
  220.         and ax,ax
  221.         je .nomsg
  222.         mov si,KernelCName
  223.         call cwritestr
  224.         xchg si,ax
  225.         call cwritestr
  226. .nomsg:        jmp bx
  227.  
  228. ;
  229. ; INT 21h system calls
  230. ;
  231. comboot_getkey:                ; 01 = get key with echo
  232.         call vgashowcursor
  233.         call comboot_getchar
  234.         call vgahidecursor
  235.         call writechr
  236.         clc
  237.         ret
  238.  
  239. comboot_writechr:            ; 02 = writechr
  240.         mov al,P_DL
  241.         call writechr
  242.         clc
  243.         ret
  244.  
  245. comboot_writeserial:            ; 04 = write serial port
  246.         mov al,P_DL
  247.         call write_serial
  248.         clc
  249.         ret
  250.  
  251. comboot_getkeynoecho:            ; 08 = get key w/o echo
  252.         call comboot_getchar
  253.         clc
  254.         ret
  255.  
  256. comboot_writestr:            ; 09 = write DOS string
  257.         mov es,P_DS
  258.         mov si,P_DX
  259. .loop:        es lodsb
  260.         cmp al,'$'        ; End string with $ - bizarre
  261.         je .done
  262.         call writechr
  263.         jmp short .loop
  264. .done:        clc
  265.         ret
  266.  
  267. comboot_checkkey:            ; 0B = check keyboard status
  268.         cmp byte [APIKeyFlag],00h
  269.         jnz .waiting
  270.         call pollchar
  271. .waiting:    setz al
  272.         dec al            ; AL = 0FFh if present, 0 if not
  273.         mov P_AL,al
  274.         clc
  275.         ret
  276.  
  277. comboot_checkver:            ; 30 = check DOS version
  278.         ; We return 0 in all DOS-compatible version registers,
  279.         ; but the high part of eax-ebx-ecx-edx spell "SYSLINUX"
  280.         mov P_EAX,'SY' << 16
  281.         mov P_EBX,'SL' << 16
  282.         mov P_ECX,'IN' << 16
  283.         mov P_EDX,'UX' << 16
  284.         ret
  285.  
  286. comboot_getchar:
  287.         cmp byte [APIKeyFlag],00h
  288.         jne .queued
  289.         call getchar        ; If not queued get input
  290.         and al,al        ; Function key?  (CF <- 0)
  291.         jnz .done
  292.         mov [APIKeyWait],ah    ; High part of key
  293.         inc byte [APIKeyFlag]    ; Set flag
  294. .done:        mov P_AL,al
  295.         ret
  296. .queued:    mov al,[APIKeyWait]
  297.         dec byte [APIKeyFlag]
  298.         jmp .done
  299.  
  300. ;
  301. ; INT 22h - SYSLINUX-specific system calls
  302. ;           System call number in ax
  303. ;
  304. comboot_int22:
  305.         cli
  306.         push ds
  307.         push es
  308.         push fs
  309.         push gs
  310.         pushad
  311.         cld
  312.         mov bp,cs
  313.         mov ds,bp
  314.         mov es,bp
  315.         mov bp,sp            ; Set up stack frame
  316.  
  317.         call adjust_screen        ; The COMBOOT program might have changed the screen
  318.  
  319.         cmp ax,int22_count
  320.         jb .ok
  321.         xor ax,ax            ; Function 0 -> unimplemented
  322. .ok:
  323.         xchg ax,bx
  324.         add bx,bx            ; CF <- 0
  325.         call [bx+int22_table]
  326.         jmp comboot_resume        ; On return
  327.  
  328. ;
  329. ; INT 22h AX=0000h    Unimplemented call
  330. ;
  331. comapi_err:
  332.         stc
  333.         ret
  334.  
  335. ;
  336. ; INT 22h AX=0001h    Get SYSLINUX version
  337. ;
  338. comapi_get_version:
  339.         ; Number of API functions supported
  340.         mov P_AX,int22_count
  341.         ; SYSLINUX version
  342.         mov P_CX,(VER_MAJOR << 8)+VER_MINOR
  343.         ; SYSLINUX derivative ID byte
  344.         mov P_DX,my_id
  345.         ; For future use
  346.         mov P_BX,cs    ; cs == 0
  347.  
  348.         mov P_ES,ds
  349.         ; ES:SI -> version banner
  350.         mov P_SI,syslinux_banner
  351.         ; ES:DI -> copyright string
  352.         mov P_DI,copyright_str
  353.  
  354. comapi_nop:
  355.         clc
  356.         ret
  357.  
  358. ;
  359. ; INT 22h AX=0002h    Write string
  360. ;
  361. ; Write null-terminated string in ES:BX
  362. ;
  363. comapi_writestr:
  364.         mov ds,P_ES
  365.         mov si,P_BX
  366.         call writestr
  367.         clc
  368.         ret
  369.  
  370. ;
  371. ; INT 22h AX=0003h    Run command
  372. ;
  373. ; Terminates the COMBOOT program and executes the command line in
  374. ; ES:BX as if it had been entered by the user.
  375. ;
  376. comapi_run:
  377.         mov ds,P_ES
  378.         mov si,P_BX
  379.         mov di,command_line
  380.         call strcpy
  381.         xor ax,ax
  382.         mov bx,load_kernel        ; Run a new kernel
  383.         jmp comboot_exit_special    ; Terminate task, clean up
  384.  
  385. ;
  386. ; INT 22h AX=0004h    Run default command        
  387. ;
  388. ; Terminates the COMBOOT program and executes the default command line
  389. ; as if a timeout had happened or the user pressed <Enter>.
  390. ;
  391. comapi_run_default:
  392.         mov bx,auto_boot
  393.         jmp comboot_exit_special
  394.  
  395. ;
  396. ; INT 22h AX=0005h    Force text mode
  397. ;
  398. ; Puts the video in standard text mode
  399. ;
  400. comapi_textmode:
  401.         call vgaclearmode
  402.         clc
  403.         ret
  404.  
  405. ;
  406. ; INT 22h AX=0006h    Open file
  407. ;
  408. comapi_open:
  409.         push ds
  410.         mov ds,P_ES
  411.         mov si,P_SI
  412.         mov di,InitRD
  413.         push di
  414.         call mangle_name
  415.         pop di
  416.         pop ds
  417.         call searchdir
  418.         jz .err
  419.         mov P_AX,ax
  420.         mov P_HAX,dx
  421.         mov P_CX,SECTOR_SIZE
  422.         mov P_SI,si
  423.         clc
  424.         ret
  425. .err:
  426.         stc
  427.         ret
  428.  
  429.  
  430. ;
  431. ; INT 22h AX=0007h    Read file
  432. ;
  433. comapi_read:
  434.         mov es,P_ES
  435.         mov bx,P_BX
  436.         mov si,P_SI
  437.         mov cx,P_CX
  438.         call getfssec
  439.         jnc .noteof
  440.         xor si,si        ; SI <- 0 on EOF, CF <- 0
  441. .noteof:    mov P_SI,si
  442.         ret
  443.  
  444. ;
  445. ; INT 22h AX=0008h    Close file
  446. ;
  447. comapi_close:
  448.         ; Do nothing for now.  Eventually implement
  449.         ; an internal API for this.
  450.         clc
  451.         ret
  452.  
  453. ;
  454. ; INT 22h AX=0009h    Call PXE stack
  455. ;
  456. %if IS_PXELINUX
  457. comapi_pxecall:
  458.         mov bx,P_BX
  459.         mov es,P_ES
  460.         mov di,P_DI
  461.         call pxenv
  462.         mov P_AX,ax
  463.         clc
  464.         ret
  465. %else
  466. comapi_pxecall    equ comapi_err            ; Not available
  467. %endif
  468.  
  469. ;
  470. ; INT 22h AX=000Ah    Get Derivative-Specific Info
  471. ;
  472. comapi_derinfo:
  473.         mov P_AL,my_id
  474. %if IS_SYSLINUX || IS_MDSLINUX || IS_EXTLINUX
  475.         mov al,[DriveNumber]
  476.         mov P_DL,al
  477.         mov P_ES,cs
  478.         mov P_BX,PartInfo
  479. %elif IS_PXELINUX
  480.         mov ax,[APIVer]
  481.         mov P_DX,ax
  482.         mov ax,[StrucPtr]
  483.         mov P_BX,ax
  484.         mov ax,[StrucPtr+2]
  485.         mov P_ES,ax
  486.         mov ax,[InitStack]
  487.         mov P_SI,ax
  488.         mov ax,[InitStack+2]
  489.         mov P_FS,ax
  490. %elif IS_ISOLINUX
  491.         mov al,[DriveNo]
  492.         mov P_DL,al
  493.         mov P_ES,cs
  494.         mov P_BX,spec_packet
  495. %endif
  496.         clc
  497.         ret
  498.  
  499. ;
  500. ; INT 22h AX=000Bh    Get Serial Console Configuration
  501. ;
  502. comapi_serialcfg:
  503.         mov ax,[SerialPort]
  504.         mov P_DX,ax
  505.         mov ax,[BaudDivisor]
  506.         mov P_CX,ax
  507.         mov ax,[FlowControl]
  508.         or al,ah
  509.         mov ah,[FlowIgnore]
  510.         shr ah,4
  511.         test byte [DisplayCon],01h
  512.         jnz .normalconsole
  513.         or ah,80h
  514. .normalconsole:
  515.         mov P_BX,ax
  516.         clc
  517.         ret
  518.  
  519. ;
  520. ; INT 22h AX=000Ch    Perform final cleanup
  521. ;
  522. comapi_cleanup:
  523. %if IS_PXELINUX
  524.         ; Unload PXE if requested
  525.         test dl,3
  526.         setnz [KeepPXE]
  527.         sub bp,sp        ; unload_pxe may move the stack around
  528.         call unload_pxe
  529.         add bp,sp        ; restore frame pointer...
  530. %elif IS_SYSLINUX || IS_MDSLINUX || IS_EXTLINUX
  531.         ; Restore original FDC table
  532.         mov eax,[OrigFDCTabPtr]
  533.         mov [fdctab],eax
  534. %endif
  535.         ; Reset the floppy disk subsystem
  536.         xor ax,ax
  537.         xor dx,dx
  538.         int 13h
  539.         clc
  540.         ret
  541.  
  542. ;
  543. ; INT 22h AX=000Dh    Clean up then replace bootstrap
  544. ;
  545. comapi_chainboot:
  546.         call comapi_cleanup
  547.         mov eax,P_EDI
  548.         mov [trackbuf+4],eax        ; Copy from
  549.         mov eax,P_ECX
  550.         mov [trackbuf+8],eax        ; Total bytes
  551.         mov eax,7C00h
  552.         mov [trackbuf],eax        ; Copy to
  553.         mov [EntryPoint],eax        ; CS:IP entry point
  554.         mov esi,P_ESI
  555.         mov edx,P_EBX
  556.         mov bx,P_DS
  557.         jmp replace_bootstrap_one
  558.  
  559.  
  560. ;
  561. ; INT 22h AX=000Eh    Get configuration file name
  562. ;
  563. comapi_configfile:
  564.         mov P_ES,cs
  565.         mov P_BX,ConfigName
  566.         clc
  567.         ret
  568.  
  569. ;
  570. ; INT 22h AX=000Fh    Get IPAPPEND strings
  571. ;
  572. %if IS_PXELINUX
  573. comapi_ipappend:
  574.         mov P_ES,cs
  575.         mov P_CX,numIPAppends
  576.         mov P_BX,IPAppends
  577.         clc
  578.         ret
  579.  
  580.         section .data
  581.         alignb 2, db 0
  582. IPAppends    dw IPOption
  583.         dw BOOTIFStr
  584. numIPAppends    equ ($-IPAppends)/2
  585.  
  586. %else
  587. comapi_ipappend equ comapi_err
  588. %endif
  589.  
  590. ;
  591. ; INT 22h AX=0010h    Resolve hostname
  592. ;
  593. %if IS_PXELINUX
  594. comapi_dnsresolv:
  595.         mov ds,P_ES
  596.         mov si,P_BX
  597.         call dns_resolv
  598.         mov P_EAX,eax
  599.         ret
  600. %else
  601. comapi_dnsresolv equ comapi_err
  602. %endif
  603.         
  604.         section .data
  605. %macro         int21 2
  606.         db %1
  607.         dw %2
  608. %endmacro
  609.  
  610.  
  611. ;
  612. ; INT 22h AX=0011h    Maximum number of shuffle descriptors
  613. ;
  614. comapi_maxshuffle:
  615.         mov P_CX,(2*trackbufsize)/12
  616.         ret
  617.  
  618. ;
  619. ; INT 22h AX=0012h    Cleanup, shuffle and boot
  620. ;
  621. comapi_shuffle:
  622.         call comapi_cleanup
  623.         mov cx,P_CX
  624.         cmp cx,(2*trackbufsize)/12
  625.         ja .error
  626.  
  627.         push cx                ; On stack: descriptor count
  628.  
  629.         lea cx,[ecx+ecx*2]        ; CX *= 3
  630.  
  631.         mov fs,P_ES
  632.         mov si,P_DI
  633.         mov di,trackbuf
  634.         push di                ; On stack: descriptor list address
  635.         fs rep movsd            ; Copy the list
  636.  
  637.         mov eax,P_EBP
  638.         mov [EntryPoint],eax        ; CS:IP entry point
  639.         mov esi,P_ESI
  640.         mov edx,P_EBX
  641.         mov bx,P_DS
  642.         jmp replace_bootstrap
  643. .error:
  644.         stc
  645.         ret
  646.  
  647. int21_table:
  648.         int21    00h, comboot_return
  649.         int21    01h, comboot_getkey
  650.         int21    02h, comboot_writechr
  651.         int21    04h, comboot_writeserial
  652.         int21    08h, comboot_getkeynoecho
  653.         int21    09h, comboot_writestr
  654.         int21    0Bh, comboot_checkkey
  655.         int21    30h, comboot_checkver
  656.         int21    4Ch, comboot_return
  657.         int21     -1, comboot_bogus
  658. int21_count    equ ($-int21_table)/3
  659.  
  660.         align 2, db 0
  661. int22_table:
  662.         dw comapi_err        ; 0000 unimplemented syscall
  663.         dw comapi_get_version    ; 0001 get SYSLINUX version
  664.         dw comapi_writestr    ; 0002 write string
  665.         dw comapi_run        ; 0003 run specified command
  666.         dw comapi_run_default    ; 0004 run default command
  667.         dw comapi_textmode    ; 0005 force text mode
  668.         dw comapi_open        ; 0006 open file
  669.         dw comapi_read        ; 0007 read file
  670.         dw comapi_close        ; 0008 close file
  671.         dw comapi_pxecall    ; 0009 call PXE stack
  672.         dw comapi_derinfo    ; 000A derivative-specific info
  673.         dw comapi_serialcfg    ; 000B get serial port config
  674.         dw comapi_cleanup    ; 000C perform final cleanup
  675.         dw comapi_chainboot    ; 000D clean up then bootstrap
  676.         dw comapi_configfile    ; 000E get name of config file
  677.         dw comapi_ipappend    ; 000F get ipappend strings
  678.         dw comapi_dnsresolv    ; 0010 resolve hostname
  679.         dw comapi_maxshuffle    ; 0011 maximum shuffle descriptors
  680.         dw comapi_shuffle    ; 0012 cleanup, shuffle and boot
  681. int22_count    equ ($-int22_table)/2
  682.  
  683. APIKeyWait    db 0
  684. APIKeyFlag    db 0
  685.