aboutsummaryrefslogtreecommitdiffstats
path: root/src/arch/i386/prefix
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/i386/prefix')
-rw-r--r--src/arch/i386/prefix/libprefix.S88
1 files changed, 39 insertions, 49 deletions
diff --git a/src/arch/i386/prefix/libprefix.S b/src/arch/i386/prefix/libprefix.S
index d78113c0..12cf9184 100644
--- a/src/arch/i386/prefix/libprefix.S
+++ b/src/arch/i386/prefix/libprefix.S
@@ -162,7 +162,7 @@ pm_call:
movl %eax, %cr0
/* Restore registers and flags */
- lret
+ lret /* will ljmp to 99f */
99: popw %ss
popw %ds
popw %es
@@ -298,16 +298,17 @@ alloc_basemem:
/****************************************************************************
* install_basemem (real-mode near call)
*
- * Install .text16 and .data16 into base memory
+ * Install source block into base memory
*
- * Parameters:
- * %ax : .text16 segment address
- * %bx : .data16 segment address
+ * Parameters:
* %esi : source physical address (must be a multiple of 16)
+ * %es : destination segment address
+ * %cx : length of (decompressed) data
+ * %dx : total length of block (including any uninitialised data portion)
* Returns:
* %esi : next source physical address (will be a multiple of 16)
* Corrupts:
- * none
+ * %edi, %ecx, %edx
****************************************************************************
*/
.section ".prefix.lib"
@@ -315,42 +316,24 @@ alloc_basemem:
install_basemem:
/* Preserve registers */
pushw %ds
- pushw %es
- pushl %edi
- pushl %ecx
- pushl %edx
- /* Install .text16 */
+ /* Preserve original %esi */
pushl %esi
- shrl $4, %esi
- movw %si, %ds
- xorw %si, %si
- movw %ax, %es
- xorl %edi, %edi
- movl $_text16_size, %ecx
- movl %ecx, %edx
- call install_block
- popl %ecx
- addl %ecx, %esi
- /* Install .data16 */
- pushl %esi
+ /* Install to specified address */
shrl $4, %esi
movw %si, %ds
xorw %si, %si
- movw %bx, %es
xorl %edi, %edi
- movl $_data16_progbits_size, %ecx
- movl $_data16_size, %edx
+ movzwl %cx, %ecx
+ movzwl %dx, %edx
call install_block
+
+ /* Fix up %esi for return */
popl %ecx
addl %ecx, %esi
/* Restore registers */
- popl %edx
- popl %ecx
- popl %edi
- popw %es
popw %ds
ret
.size install_basemem, . - install_basemem
@@ -358,15 +341,17 @@ install_basemem:
/****************************************************************************
* install_highmem (real-mode near call)
*
- * Install .text and .data into high memory
+ * Install source block into high memory
*
* Parameters:
* %esi : source physical address (must be a multiple of 16)
* %edi : destination physical address
+ * %ecx : length of (decompressed) data
+ * %edx : total length of block (including any uninitialised data portion)
* Returns:
* %esi : next source physical address (will be a multiple of 16)
* Corrupts:
- * none
+ * %edi, %ecx, %edx
****************************************************************************
*/
@@ -377,20 +362,12 @@ install_basemem:
install_highmem:
/* Preserve registers */
pushw %ax
- pushl %edi
- pushl %ecx
- pushl %edx
- /* Install .text and .data to specified address */
- movl $_textdata_progbits_size, %ecx
- movl $_textdata_size, %edx
+ /* Install to specified address */
movw $install_block, %ax
call pm_call
/* Restore registers */
- popl %edx
- popl %ecx
- popl %edi
popw %ax
ret
.size install_highmem, . - install_highmem
@@ -425,7 +402,10 @@ install:
install_prealloc:
/* Save registers */
pushw %ds
+ pushw %es
pushl %esi
+ pushl %ecx
+ pushl %edx
/* Sanity: clear the direction flag asap */
cld
@@ -436,7 +416,16 @@ install_prealloc:
shll $4, %esi
addl $_payload_offset, %esi
- /* Install .text16 and .data16 */
+ /* Install .text16 */
+ movw %ax, %es
+ movw $_text16_size, %cx
+ movw %cx, %dx
+ call install_basemem
+
+ /* Install .data16 */
+ movw %bx, %es
+ movw $_data16_progbits_size, %cx
+ movw $_data16_size, %dx
call install_basemem
/* Set up %ds for access to .data16 */
@@ -447,16 +436,16 @@ install_prealloc:
movw %ax, (init_libkir_vector+2)
lcall *init_libkir_vector
#else
- /* Save registers */
- pushl %edi
- pushl %ecx
-
/* Install .text and .data to temporary area in high memory,
* prior to reading the E820 memory map and relocating
* properly.
*/
movl $HIGHMEM_LOADPOINT, %edi
+ movl $_textdata_progbits_size, %ecx
+ movl $_textdata_size, %edx
+ pushl %edi
call install_highmem
+ popl %edi
/* Initialise librm at current location */
movw %ax, (init_librm_vector+2)
@@ -469,7 +458,7 @@ install_prealloc:
movw %ax, (prot_call_vector+2)
pushl $relocate
lcall *prot_call_vector
- addw $4, %sp
+ popl %edx /* discard */
/* Copy code to new location */
pushl %edi
@@ -482,11 +471,12 @@ install_prealloc:
/* Initialise librm at new location */
lcall *init_librm_vector
+#endif
/* Restore registers */
+ popl %edx
popl %ecx
- popl %edi
-#endif
popl %esi
+ popw %es
popw %ds
ret
.size install_prealloc, . - install_prealloc