;; $Id$ ;; ----------------------------------------------------------------------- ;; ;; Copyright 1994-2002 H. Peter Anvin - All Rights Reserved ;; ;; 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, ;; Bostom MA 02111-1307, USA; either version 2 of the License, or ;; (at your option) any later version; incorporated herein by reference. ;; ;; ----------------------------------------------------------------------- ;; ;; bootsect.inc ;; ;; Load a boot sector (or other bootstrap program.) ;; ;; Unlike previous versions of this software, this doesn't require that ;; the length is 512 bytes. This allows PXE bootstraps and WinNT ;; "CD boot sectors" to be invoked. ;; ; ; Load a boot sector ; is_bootsector: %if IS_SYSLINUX ; Transfer zero bytes xor cx,cx jmp short load_bootsec is_bss_sector: ; Transfer the superblock mov cx,superblock_len load_bootsec: push cx %endif xchg dx,ax shr eax,16 xchg dx,ax ; Now EAX = file length mov edi, 100000h call load_high call crlf %if IS_SYSLINUX pop cx %endif sub edi,100000h push edi ; Save length %if IS_SYSLINUX jcxz .not_bss ; For a BSS boot sector we have to patch. mov esi,superblock mov edi,100000h+(superblock-bootsec) movzx ecx,cx call bcopy .not_bss: %endif ; ; Prepare for shutting down ; call vgaclearmode xor edx,edx xor eax,eax %if IS_SYSLINUX mov dl,[bsDriveNumber] mov si,PartInfo mov di,800h-18 ; Put partition info here push di mov cx,8 ; 16 bytes rep movsw pop si ; DS:SI points to partition info %elif IS_ISOLINUX mov dl,[DriveNo] %elif IS_PXELINUX ; Close the UDP stack so the PXE stack is in a known state for ; the new NBP call reset_pxe %endif pop ecx ; Byte count to copy cli %if IS_PXELINUX lss sp,[Stack] ; Reset stack to PXE original pop es %else xor ebx,ebx mov ds,bx mov es,bx mov esp,7C00h pushad pushfd push bx ; ds push bx ; es push bx ; fs push bx ; gs %endif mov esi,100000h ; Copy from... mov edi,7C00h ; Copy to... jmp bcopy_over_self %if IS_SYSLINUX = 0 is_bss_image: mov si,err_bssimage call cwritestr jmp enter_command %endif