summaryrefslogtreecommitdiffstats
path: root/src/arch
diff options
context:
space:
mode:
authorMichael Brown2016-02-18 17:32:37 +0100
committerMichael Brown2016-02-18 17:42:33 +0100
commitdf2509db9587ee0d93cdab84496cbc468db6da08 (patch)
tree7952b7d737cc9bee5d146e9fb40c775221c1e37d /src/arch
parent[librm] Simplify definitions for prot_call() and real_call() stack frames (diff)
downloadipxe-df2509db9587ee0d93cdab84496cbc468db6da08.tar.gz
ipxe-df2509db9587ee0d93cdab84496cbc468db6da08.tar.xz
ipxe-df2509db9587ee0d93cdab84496cbc468db6da08.zip
[prefix] Standardise calls to prot_call()
Use the standard "pushl $function ; pushw %cs ; call prot_call" sequence everywhere that prot_call() is used. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/prefix/libprefix.S22
-rw-r--r--src/arch/x86/prefix/undiloader.S17
2 files changed, 28 insertions, 11 deletions
diff --git a/src/arch/x86/prefix/libprefix.S b/src/arch/x86/prefix/libprefix.S
index 186f3d5b1..94c32455b 100644
--- a/src/arch/x86/prefix/libprefix.S
+++ b/src/arch/x86/prefix/libprefix.S
@@ -867,6 +867,15 @@ payload_death_message:
movw %ax, (init_librm_vector+2)
lcall *init_librm_vector
+ /* Prepare for return to .prefix segment */
+ pushw %cs
+
+ /* Jump to .text16 segment */
+ pushw %ax
+ pushw $1f
+ lret
+ .section ".text16.install_prealloc", "ax", @progbits
+1:
/* Inhibit INT 15,e820 and INT 15,e801 if applicable */
testl %ebp, %ebp
jnz 1f
@@ -878,10 +887,15 @@ payload_death_message:
* ready for the copy to the new location.
*/
progress " relocate\n"
- movw %ax, (prot_call_vector+2)
pushl $relocate
- lcall *prot_call_vector
+ pushw %cs
+ call prot_call
+ /* Jump back to .prefix segment */
+ pushw $1f
+ lret
+ .section ".prefix.install_prealloc", "awx", @progbits
+1:
/* Copy code to new location */
progress " copy\n"
pushl %edi
@@ -929,10 +943,6 @@ init_librm_vector:
.word init_librm
.word 0
.size init_librm_vector, . - init_librm_vector
-prot_call_vector:
- .word prot_call
- .word 0
- .size prot_call_vector, . - prot_call_vector
#endif
close_payload_vector:
.word close_payload
diff --git a/src/arch/x86/prefix/undiloader.S b/src/arch/x86/prefix/undiloader.S
index 952661330..0376afa88 100644
--- a/src/arch/x86/prefix/undiloader.S
+++ b/src/arch/x86/prefix/undiloader.S
@@ -18,13 +18,16 @@ undiloader:
pushw %ds
pushw %es
pushw %bx
+
/* ROM segment address to %ds */
pushw %cs
popw %ds
+
/* UNDI loader parameter structure address into %es:%di */
movw %sp, %bx
movw %ss:22(%bx), %di
movw %ss:24(%bx), %es
+
/* Install to specified real-mode addresses */
pushw %di
movw %es:12(%di), %bx
@@ -34,13 +37,18 @@ undiloader:
orl $0xffffffff, %ebp /* Allow arbitrary relocation */
call install_prealloc
popw %di
+
+ /* Jump to .text16 segment */
+ pushw %ax
+ pushw $1f
+ lret
+ .section ".text16", "ax", @progbits
+1:
/* Call UNDI loader C code */
pushl $pxe_loader_call
pushw %cs
- pushw $1f
- pushw %ax
- pushw $prot_call
- lret
+ call prot_call
+
1: /* Restore registers and return */
popw %bx
popw %es
@@ -49,4 +57,3 @@ undiloader:
popl %edi
popl %esi
lret
- .size undiloader, . - undiloader