Magellan Linux

Contents of /trunk/mkinitrd-magellan/isolinux/bootsect.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File size: 3666 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

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