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