wok-current rev 960

gpxe: fix prefix
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Jun 28 15:51:45 2008 +0000 (2008-06-28)
parents 39440972a796
children 1d1bb51299ff
files gpxe/stuff/prefix.u
line diff
     1.1 --- a/gpxe/stuff/prefix.u	Sat Jun 28 06:54:38 2008 +0000
     1.2 +++ b/gpxe/stuff/prefix.u	Sat Jun 28 15:51:45 2008 +0000
     1.3 @@ -1,6 +1,14 @@
     1.4  --- gpxe-0.9.3/src/arch/i386/prefix/lkrnprefix.S
     1.5  +++ gpxe-0.9.3/src/arch/i386/prefix/lkrnprefix.S
     1.6 -@@ -50,40 +50,343 @@
     1.7 +@@ -3,6 +3,7 @@
     1.8 + 
     1.9 + 	Authors: Gary Byers (gb@thinguin.org)
    1.10 + 		 Marty Connor (mdc@thinguin.org)
    1.11 ++		 Pascal Bellard (pascal.bellard@slitaz.org)
    1.12 + 
    1.13 + 	This software may be used and distributed according to the terms
    1.14 + 	of the GNU Public License (GPL), incorporated herein by reference.
    1.15 +@@ -50,40 +51,351 @@
    1.16   	.arch i386
    1.17   	.org	0
    1.18   	.section ".prefix", "ax", @progbits
    1.19 @@ -37,7 +45,8 @@
    1.20  +	/* Calculate segment address of image start */
    1.21  +	pushw	%cs
    1.22  +	popw	%ax
    1.23 -+	addw	$(0x100/16), %ax
    1.24 ++	addw	$(0x100/16), %ax	/* Adjust cs */
    1.25 ++	pushw	%ax
    1.26  +	jmp	go_setup_code
    1.27  +
    1.28  +bootsector:
    1.29 @@ -70,10 +79,7 @@
    1.30  + *
    1.31  + * Segments are as follows: ds=es=ss=cs - BOOTSEG
    1.32  + */
    1.33 - 
    1.34 --	movw	$0x0007, %bx		/* page 0, attribute 7 (normal) */
    1.35 --	movb	$0x0e, %ah		/* write char, tty mode */
    1.36 --prloop: 
    1.37 ++
    1.38  +	xorw	%cx,%cx
    1.39  +	movw	%cx,%es			/* access segment 0 */
    1.40  +	movw	$0x78, %bx		/* 0:bx is parameter table address */
    1.41 @@ -113,7 +119,10 @@
    1.42  + * 36 sectors if sector 36 can be read, 18 sectors if sector 18 can be read,
    1.43  + * 15 if sector 15 can be read.	Otherwise guess 9.
    1.44  + */
    1.45 -+
    1.46 + 
    1.47 +-	movw	$0x0007, %bx		/* page 0, attribute 7 (normal) */
    1.48 +-	movb	$0x0e, %ah		/* write char, tty mode */
    1.49 +-prloop: 
    1.50  +	movw	$disksizes, %si		/* table of sizes to try */
    1.51  +
    1.52  +probe_loop: 
    1.53 @@ -137,7 +146,6 @@
    1.54  +
    1.55  +/* ok, we've written the Loading... message, now we want to load the system */
    1.56  +
    1.57 -+	pushw	%es			/* = ds */
    1.58  +	movw	$SYSSEG, %ax
    1.59  +	movw	%ax,%es			/* segment of SYSSEG<<4 */
    1.60  +	pushw	%es
    1.61 @@ -152,7 +160,6 @@
    1.62  +
    1.63  +	call	print_nl
    1.64  +	pop	%es			/* = SYSSEG */
    1.65 -+	pop	%es			/* balance push/pop es */
    1.66  +sigok: 
    1.67  +
    1.68  +/* Restore original disk parameters */
    1.69 @@ -164,11 +171,21 @@
    1.70  +	movw	%di,(%bx)
    1.71  +	movw	%si,2(%bx)
    1.72  +
    1.73 -+/* after that (everything loaded), we call to the .ROM file loaded. */
    1.74 ++	/* Everything now loaded.  %es = SYSSEG, so %es:0000 points to
    1.75 ++	 * start of loaded image.
    1.76 ++	 */
    1.77  +
    1.78 -+	movw	$SYSSEG, %ax
    1.79 -+	jmp	go_setup_code
    1.80 ++	/* Jump to loaded copy */
    1.81 ++	ljmp	$SYSSEG, $run_etherboot
    1.82  +
    1.83 ++endseg:	.word SYSSEG + _load_size_pgh
    1.84 ++	.section ".zinfo.fixup", "a"	/* Compressor fixup information */
    1.85 ++	.ascii	"SUBW"
    1.86 ++	.long	endseg
    1.87 ++	.long	16
    1.88 ++	.long	0
    1.89 ++	.previous
    1.90 ++	
    1.91  +/* This routine loads the system at address SYSSEG<<4, making sure no 64kB
    1.92  + * boundaries are crossed. We try to load it as fast as possible, loading whole
    1.93  + * tracks whenever we can.
    1.94 @@ -187,8 +204,7 @@
    1.95  +	movb	$4, %cl
    1.96  +	shrw	%cl,%dx			/* bx is always divisible by 16 */
    1.97  +	addw	%dx,%ax
    1.98 -+.equ	SYSSIZE, _load_size_pgh - 32
    1.99 -+	cmpw	$SYSSEG+SYSSIZE, %ax	/* have we loaded all yet? */
   1.100 ++	cmpw	syssize, %ax		/* have we loaded all yet? */
   1.101  +	jb	ok1_read
   1.102  +	ret
   1.103  +ok1_read: 
   1.104 @@ -320,9 +336,11 @@
   1.105   	loop	prloop
   1.106  -freeze: jmp	freeze
   1.107  +	ret
   1.108 -+
   1.109 + 
   1.110 +-why:	.ascii	"This image cannot be loaded from a floppy disk.\r\n"
   1.111 +-why_end: 
   1.112  +/* print_hex prints the word pointed to by ss:bp in hexadecimal. */
   1.113 -+
   1.114 + 
   1.115  +print_hex: 
   1.116  +	movw	(%bp),%dx		/* load word into dx */
   1.117  +	movb	$4, %cl
   1.118 @@ -350,12 +368,10 @@
   1.119  +
   1.120  +sectors: 
   1.121  +	.word 0
   1.122 - 
   1.123 --why:	.ascii	"This image cannot be loaded from a floppy disk.\r\n"
   1.124 --why_end: 
   1.125 ++
   1.126  +dpseg:	.word 0
   1.127  +dpoff:	.word 0
   1.128 - 
   1.129 ++
   1.130  +disksizes: 
   1.131  +	.byte 36,18,15,9,0
   1.132  +
   1.133 @@ -365,13 +381,27 @@
   1.134   
   1.135   	.org	497
   1.136   setup_sects: 
   1.137 -@@ -123,14 +426,23 @@
   1.138 +@@ -106,13 +418,6 @@
   1.139 + 
   1.140 + 	.org	512
   1.141 + 
   1.142 +-	.section ".zinfo.fixup", "a"	/* Compressor fixup information */
   1.143 +-	.ascii	"SUBW"
   1.144 +-	.long	syssize
   1.145 +-	.long	16
   1.146 +-	.long	0
   1.147 +-	.previous
   1.148 +-	
   1.149 + /*
   1.150 + 	We're now at the beginning of the second sector of the image -
   1.151 + 	where the setup code goes.
   1.152 +@@ -123,14 +428,18 @@
   1.153   	executing the Etherboot image that's loaded at SYSSEG:0 and
   1.154   	whose entry point is SYSSEG:0.
   1.155   */
   1.156  -setup_code:
   1.157  +setup_code: 
   1.158 -+	movw	$(SYSSEG-(PREFIXSIZE/16)), %ax
   1.159 ++	pushw	$(SYSSEG-(PREFIXSIZE/16))
   1.160   	/* Etherboot expects to be contiguous in memory once loaded.
   1.161   	 * LILO doesn't do this, but since we don't need any
   1.162   	 * information that's left in the prefix, it doesn't matter:
   1.163 @@ -380,14 +410,20 @@
   1.164   	 */
   1.165  -	ljmp	$(SYSSEG-(PREFIXSIZE/16)), $run_etherboot
   1.166  +go_setup_code: 
   1.167 -+	xorw	%cx, %cx
   1.168 -+	pushw	%cx
   1.169 -+	pushw	%cx		/* No parameters to preserve for exit path */
   1.170 -+	pushw	%cx		/* Use prefix exit path mechanism */
   1.171 -+	pushw	%ax
   1.172  +	pushw	$run_etherboot
   1.173  +	/* Calculated lcall to _start with %cs:0000 = image start */
   1.174  +	lret
   1.175   
   1.176   
   1.177   	.org	PREFIXSIZE
   1.178 +@@ -140,6 +449,10 @@
   1.179 + run_etherboot:
   1.180 + 	call	install
   1.181 + 
   1.182 ++	/* Set up real-mode stack */
   1.183 ++	movw	%bx, %ss
   1.184 ++	movw	$_estack16, %sp
   1.185 ++
   1.186 + 	/* Jump to .text16 segment */
   1.187 + 	pushw	%ax
   1.188 + 	pushw	$1f