david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Don't trash the %ecx value returned by relocate(). This was causing

us to round down the size for the relocation copy to the nearest 64kB
(+0x10 bytes); this just happened to work on most machines because the
last 64kB of the image is all-zeroes anyway (it's the .bss).
This commit is contained in:
Michael Brown 2007-07-19 15:54:33 +01:00
parent a8111e8ab7
commit 2cfe0dee1f
1 changed files with 8 additions and 6 deletions

View File

@ -277,7 +277,7 @@ gdt_end:
* Sets limits on the data segments %ds and %es.
*
* Parameters:
* %cx : segment type (FLAT_DS for 4GB or REAL_DS for 64kB)
* %dx : segment type (FLAT_DS for 4GB or REAL_DS for 64kB)
****************************************************************************
*/
@ -309,8 +309,8 @@ set_real_mode_limits:
movl %eax, %cr0
/* Set flat segment limits */
movw %cx, %ds
movw %cx, %es
movw %dx, %ds
movw %dx, %es
/* Switch back to real mode */
movl %cr0, %eax
@ -355,6 +355,7 @@ install:
install_prealloc:
/* Save registers */
pushl %esi
pushw %dx
/* Install .text16 and .data16 */
movl $_payload_offset, %esi
call install_basemem
@ -385,7 +386,7 @@ install_prealloc:
* prior to reading the E820 memory map and relocating
* properly.
*/
movw $FLAT_DS, %cx
movw $FLAT_DS, %dx
call set_real_mode_limits
movl $HIGHMEM_LOADPOINT, %edi
call install_highmem
@ -400,7 +401,7 @@ install_prealloc:
addw $4, %sp
/* Move code to new location, set up new protected-mode GDT */
movw $FLAT_DS, %cx
movw $FLAT_DS, %dx
call set_real_mode_limits
pushl %edi
es rep addr32 movsb
@ -408,7 +409,7 @@ install_prealloc:
lcall *init_librm_vector
/* Restore real-mode segment limits */
movw $REAL_DS, %cx
movw $REAL_DS, %dx
call set_real_mode_limits
/* Restore registers and interrupt status */
@ -417,6 +418,7 @@ install_prealloc:
popw %ds
popfw
#endif
popw %dx
popl %esi
ret
.size install_prealloc, . - install_prealloc