[coreboot-gerrit] Patch set updated for coreboot: libpayload: x86/head - implement argc/argv handling
Mathias Krause (minipli@googlemail.com)
gerrit at coreboot.org
Sun Feb 12 22:06:40 CET 2017
Mathias Krause (minipli at googlemail.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/18336
-gerrit
commit 2dadc1faa0563da5978d84233847de998b34e890
Author: Mathias Krause <minipli at googlemail.com>
Date: Sat Feb 11 22:47:04 2017 +0100
libpayload: x86/head - implement argc/argv handling
Implement the argc/argv passing as described in coreboot’s payload API:
http://www.coreboot.org/Payload_API
While at it, give the code some love by not needlessly trashing register
values.
Change-Id: Ib830f2c67b631b7216843203cefd55d9bb780d83
Signed-off-by: Mathias Krause <minipli at googlemail.com>
---
payloads/libpayload/arch/x86/head.S | 40 ++++++++++++++++++++-----------------
1 file changed, 22 insertions(+), 18 deletions(-)
diff --git a/payloads/libpayload/arch/x86/head.S b/payloads/libpayload/arch/x86/head.S
index fa9bb73..698df43 100644
--- a/payloads/libpayload/arch/x86/head.S
+++ b/payloads/libpayload/arch/x86/head.S
@@ -28,7 +28,7 @@
*/
.code32
- .global _entry, _leave
+ .global _entry
.text
.align 4
@@ -55,6 +55,11 @@ mb_header:
.long _end
.long _init
+#define CB_MAGIC_VALUE 0x12345678
+#define CB_MAGIC 0x04
+#define CB_ARGV 0x08
+#define CB_ARGC 0x10
+
/*
* This function saves off the previous stack and switches us to our
* own execution environment.
@@ -63,34 +68,33 @@ _init:
/* No interrupts, please. */
cli
- /* There is a bunch of stuff missing here to take arguments on the stack
- * See http://www.coreboot.org/Payload_API and exec.S.
- */
- /* Store current stack pointer. */
- movl %esp, %esi
-
/* Store EAX and EBX */
- movl %eax,loader_eax
- movl %ebx,loader_ebx
+ movl %eax, loader_eax
+ movl %ebx, loader_ebx
- /* Setup new stack. */
- movl $_stack, %ebx
+ /* Copy argv[] and argc as demanded by the Payload API,
+ * see http://www.coreboot.org/Payload_API and exec.S.
+ */
+ cmpl $CB_MAGIC_VALUE, CB_MAGIC(%esp)
+ jne 1f
- movl %ebx, %esp
+ movl CB_ARGV(%esp), %eax
+ movl %eax, main_argv
- /* Save old stack pointer. */
- pushl %esi
+ movl CB_ARGC(%esp), %eax
+ movl %eax, main_argc
+1:
+ /* Store current stack pointer and set up new stack. */
+ movl %esp, _stack
+ movl $(_stack - 4), %esp
/* Let's rock. */
call start_main
/* %eax has the return value - pass it on unmolested */
_leave:
- /* Get old stack pointer. */
- popl %ebx
-
/* Restore old stack. */
- movl %ebx, %esp
+ movl 4(%esp), %esp
/* Return to the original context. */
ret
More information about the coreboot-gerrit
mailing list