diff options
Diffstat (limited to 'contrib/syslinux-4.02/core/com32.inc')
-rw-r--r-- | contrib/syslinux-4.02/core/com32.inc | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/core/com32.inc b/contrib/syslinux-4.02/core/com32.inc new file mode 100644 index 0000000..111590c --- /dev/null +++ b/contrib/syslinux-4.02/core/com32.inc @@ -0,0 +1,145 @@ +;; ----------------------------------------------------------------------- +;; +;; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved +;; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, +;; Boston MA 02111-1307, USA; either version 2 of the License, or +;; (at your option) any later version; incorporated herein by reference. +;; +;; ----------------------------------------------------------------------- + +;; +;; com32.inc +;; +;; Common code for running a COM32 image +;; + + extern pm_api_vector + +; +; Load a COM32 image. A COM32 image is the 32-bit analogue to a DOS +; .com file. A COM32 image is loaded at address 0x101000, with %esp +; set to the high end of usable memory. +; +; A COM32 image should begin with the magic bytes: +; B8 FF 4C CD 21, which is "mov eax,0x21cd4cff" in 32-bit mode and +; "mov ax,0x4cff; int 0x21" in 16-bit mode. This will abort the +; program with an error if run in 16-bit mode. +; +com32_entry equ free_high_memory + + section .text16 +is_com32_image: + push si ; Save file handle + push eax ; Save file length + + call make_plain_cmdline + ; Copy the command line into the low cmdline buffer + mov ax,real_mode_seg + mov fs,ax + mov si,cmd_line_here + mov di,command_line + mov cx,[CmdLinePtr] + inc cx ; Include final null + sub cx,si + fs rep movsb + + mov si,KernelName + mov di,Com32Name + call strcpy + + call comboot_setup_api ; Set up the COMBOOT-style API + + mov edi,com32_entry ; Load address + pop eax ; File length + pop si ; File handle + xor dx,dx ; No padding + mov bx,abort_check ; Don't print dots, but allow abort + call load_high + + mov esi,com32_entry + mov edi,trackbuf + mov ecx,5 + call bcopy + cmp dword [trackbuf],0xcd4cfeb8 + jne not_com32r + cmp byte [trackbuf+4],0x21 + jne not_com32r + +com32_start: + ; + ; Point the stack to the end of (permitted) high memory + ; + mov eax,[HighMemRsvd] + xor ax,ax ; Align to a 64K boundary + mov [PMESP],eax + mov ebx,.pm ; Where to go in PM + jmp enter_pm + +; +; This is invoked right before the actually starting the COM32 +; progam, in 32-bit mode... +; + bits 32 + section .text +.pm: + ; Set up the calling stack frame + + push dword pm_api_vector + push dword Com32Name ; Module filename + push dword [HighMemSize] ; Memory managed by Syslinux + push dword core_cfarcall ; Cfarcall entry point + push dword core_farcall ; Farcall entry point + push dword (1 << 16) ; 64K bounce buffer + push dword core_real_mode ; Bounce buffer address + push dword core_intcall ; Intcall entry point + push dword command_line ; Command line pointer + push dword 9 ; Argument count + sti ; Interrupts OK now + call com32_entry ; Run the program... + ; ... on return, fall through to com32_exit ... +com32_exit: + mov bx,comboot_return + jmp enter_rm + + bits 16 + section .text16 +not_com32r: + mov si,KernelName + call writestr + mov si,not_com32r_msg + call writestr + jmp enter_command + + section .data16 +not_com32r_msg db ': not a COM32R image', CR, LF, 0 + + ; Ersatz com32 invocation structure, to make libcom32 + ; code run the same if linked to the core. This is in + ; the .data16 segment so HighMemSize can live here. + ; + ; Danger, Will Robinson: it's not clear the use of + ; core_xfer_buf is safe here. + global __entry_esp, __com32 + alignz 4 +__entry_esp: + dd 0 ; Dummy to avoid _exit issues +__com32: + dd 9 ; Argument count + dd 0 ; No command line + dd core_intcall ; Intcall entry point + dd 0 ; Bounce buffer address + dd 0 ; 64K bounce buffer + dd core_farcall ; Farcall entry point + dd core_cfarcall ; Cfarcall entry point +HighMemSize dd 0 ; End of memory pointer (bytes) + dd 0 ; No module name + dd pm_api_vector ; Protected mode functions + + section .uibss +Com32Name resb FILENAME_MAX + + section .text16 |