1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
;; -----------------------------------------------------------------------
;;
;; Copyright 1994-2006 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,
;; Boston 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 || IS_MDSLINUX
; Transfer zero bytes
mov byte [CopySuper],0
jmp short load_bootsec
is_bss_sector:
; Transfer the superblock
mov byte [CopySuper],superblock_len
%endif
load_bootsec:
xchg dx,ax
shl eax,16
xchg dx,ax ; Now EAX = file length
mov edi, 100000h
mov [trackbuf+4],edi ; Copy from this address
push edi ; Save load address
xor dx,dx ; No padding
mov bx,abort_check ; Don't print dots, but allow abort
call load_high
sub edi,100000h
mov [trackbuf+8],edi ; Save length
mov eax,7C00h ; Entry point
mov [trackbuf],eax ; Copy to this address
mov [EntryPoint],eax ; Jump to this address when done
%if IS_SYSLINUX || IS_MDSLINUX
movzx ecx,byte [CopySuper]
jcxz .not_bss
; For a BSS boot sector we have to patch.
mov esi,superblock
mov edi,100000h+(superblock-bootsec)
call bcopy
.not_bss:
%endif
xor edx,edx
xor esi,esi
%if IS_SYSLINUX || IS_MDSLINUX || IS_EXTLINUX
; Restore original FDC table
mov eax,[OrigFDCTabPtr]
mov [fdctab],eax
mov dl,[DriveNumber]
mov si,PartInfo ; Partition info buffer
mov di,800h-18 ; Put partition info here
push di
mov cx,8 ; 16 bytes
xor ax,ax
rep movsw
pop si ; DS:SI points to partition info
%elif IS_ISOLINUX
mov dl,[DriveNo]
%elif IS_PXELINUX
mov byte [KeepPXE],1 ; Chainloading another NBP
call reset_pxe
%endif
xor bx,bx
;
; replace_bootstrap for the special case where we have exactly one
; descriptor, and it's the first entry in the trackbuf
;
replace_bootstrap_one:
push word trackbuf ; Address of descriptor list
push word 1 ; Length of descriptor list
; Fall through
;
; Entrypoint for "shut down and replace bootstrap" -- also invoked by
; the COMBOOT API. This routine expects two words on the stack:
; address of the copy list (versus DS) and count. Additionally,
; the values of ESI and EDX are passed on to the new bootstrap;
; the value of BX becomes the new DS.
;
replace_bootstrap:
;
; Prepare for shutting down
;
call vgaclearmode
;
; Set up initial stack frame (not used by PXE if keeppxe is
; set - we use the PXE stack then.)
; AFTER THIS POINT ONLY .earlybss IS AVAILABLE, NOT .bss
;
xor ax,ax
mov ds,ax
mov es,ax
%if IS_PXELINUX
test byte [KeepPXE],01h
jz .stdstack
les di,[InitStack] ; Reset stack to PXE original
jmp .stackok
%endif
.stdstack:
mov di,7C00h-44
push di
mov cx,22 ; 44 bytes
rep stosw
pop di
.stackok:
mov [es:di+28],edx
mov [es:di+12],esi
mov [es:di+6],bx
pop ax ; Copy list count
pop bx ; Copy from...
cli
mov cx,es
mov ss,cx
movzx esp,di
jmp shuffle_and_boot
%if IS_SYSLINUX || IS_MDSLINUX
; Nothing
%else
is_bss_sector:
mov si,err_bssimage
call cwritestr
jmp enter_command
%endif
|