summaryrefslogtreecommitdiff
path: root/payloads/libpayload/i386/head.S
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload/i386/head.S')
-rw-r--r--payloads/libpayload/i386/head.S29
1 files changed, 12 insertions, 17 deletions
diff --git a/payloads/libpayload/i386/head.S b/payloads/libpayload/i386/head.S
index e05cb3ed30..e548329c66 100644
--- a/payloads/libpayload/i386/head.S
+++ b/payloads/libpayload/i386/head.S
@@ -50,31 +50,26 @@ _init:
/* No interrupts, please. */
cli
- /* Get the current stack pointer. */
+ /* Store current stack pointer. */
movl %esp, %esi
+ /* Setup new stack. */
movl _istack, %ebx
- /* lret needs %cs in the stack, so copy it over. */
- movw %cs, 4(%ebx)
+ movl (%ebx), %esp
- /*
- * Exchange the current stack pointer for the one in the initial
- * stack (which happens to be the new stack pointer).
- */
- xchgl %esi, 16(%ebx)
-
- /* Set the new stack pointer. */
- movl %esi, %esp
-
- /* Return into the main entry function and go. */
- lret
+ /* Save old stack pointer. */
+ pushl %esi
+ /* Let's rock. */
+ call start_main
+
_leave:
- movl _istack, %ebx
+ /* Get old stack pointer. */
+ popl %ebx
- /* Restore the stack pointer from the storage area. */
- movl 16(%ebx), %esp
+ /* Restore old stack. */
+ movl %esp, %ebx
/* Return to the original context. */
lret