diff options
Diffstat (limited to 'payloads/libpayload/i386/head.S')
-rw-r--r-- | payloads/libpayload/i386/head.S | 29 |
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 |