More fixes to the extlinux installer; change back to writable types
[profile/ivi/syslinux.git] / bootsect.inc
1 ;; $Id$
2 ;; -----------------------------------------------------------------------
3 ;;   
4 ;;   Copyright 1994-2002 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 ;; bootsect.inc
16 ;; 
17 ;; Load a boot sector (or other bootstrap program.)
18 ;;
19 ;; Unlike previous versions of this software, this doesn't require that
20 ;; the length is 512 bytes.  This allows PXE bootstraps and WinNT
21 ;; "CD boot sectors" to be invoked.
22 ;;
23
24 ;
25 ; Load a boot sector
26 ;
27 is_bootsector:
28 %if IS_SYSLINUX || IS_MDSLINUX
29                 ; Transfer zero bytes
30                 mov byte [CopySuper],0
31                 jmp short load_bootsec
32
33 is_bss_sector:
34                 ; Transfer the superblock
35                 mov byte [CopySuper],superblock_len
36 %endif
37 load_bootsec:
38                 xchg dx,ax
39                 shl eax,16
40                 xchg dx,ax              ; Now EAX = file length
41                 mov edi, 100000h
42                 push edi                ; Save load address
43                 call load_high
44                 call crlf
45
46                 sub edi,100000h
47                 push edi                ; Save length
48
49 %if IS_SYSLINUX || IS_MDSLINUX
50                 movzx ecx,byte [CopySuper]
51                 jcxz .not_bss
52
53                 ; For a BSS boot sector we have to patch.
54                 mov esi,superblock
55                 mov edi,100000h+(superblock-bootsec)
56                 call bcopy
57
58 .not_bss:
59 %endif
60
61                 xor edx,edx
62                 xor esi,esi
63 %if IS_SYSLINUX || IS_MDSLINUX
64                 ; Restore original FDC table
65                 mov eax,[OrigFDCTabPtr]
66                 mov [fdctab],eax
67
68                 mov dl,[DriveNumber]
69                 mov si,PartInfo         ; Partition info buffer
70                 mov di,800h-18          ; Put partition info here
71                 push di
72                 mov cx,8                ; 16 bytes
73                 xor ax,ax
74                 rep movsw
75                 pop si                  ; DS:SI points to partition info
76 %elif IS_ISOLINUX
77                 mov dl,[DriveNo]
78 %elif IS_PXELINUX
79                 mov byte [KeepPXE],1    ; Chainloading another NBP
80                 call reset_pxe
81 %endif
82                 xor bx,bx
83
84
85 ; Entrypoint for "shut down and replace bootstrap" -- also invoked by
86 ; the COMBOOT API.  This routine expects two dword on the stack:
87 ; linear address and length.  Additionally, the values of ESI and EDX
88 ; are passed on to the new bootstrap; the value of BX becomes the new
89 ; DS.
90
91 replace_bootstrap:
92
93                 ;
94                 ; Prepare for shutting down
95                 ;
96                 call vgaclearmode
97
98                 ;
99                 ; Set up initial stack frame (not used by PXE if keeppxe is set)
100                 ;
101                 xor ax,ax
102                 mov ds,ax
103                 mov es,ax               
104
105 %if IS_PXELINUX
106                 test byte [KeepPXE],01h
107                 jz .stdstack
108                 les di,[InitStack]      ; Reset stack to PXE original
109                 jmp .stackok
110 %endif
111 .stdstack:
112                 mov di,7C00h-44
113                 push di
114                 mov cx,22               ; 44 bytes
115                 rep stosw
116                 pop di
117 .stackok:
118
119                 mov [es:di+28],edx
120                 mov [es:di+12],esi
121                 mov [es:di+6],bx
122
123                 pop ecx                 ; Byte count to copy
124                 pop esi                 ; Copy from...
125
126                 cli
127                 mov ax,es
128                 mov ss,ax
129                 movzx esp,di
130                 mov edi,7C00h           ; Copy to...
131
132                 jmp bcopy_over_self
133
134 %if IS_SYSLINUX || IS_MDSLINUX
135                 ; Nothing
136 %else
137 is_bss_sector:
138                 mov si,err_bssimage
139                 call cwritestr
140                 jmp enter_command
141 %endif