[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