summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/core/com32.inc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/core/com32.inc')
-rw-r--r--contrib/syslinux-4.02/core/com32.inc145
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