[coreboot-gerrit] Patch set updated for coreboot: eab321d libpayload: Provide selfboot function.

Marc Jones (marc.jones@se-eng.com) gerrit at coreboot.org
Tue Dec 30 06:08:28 CET 2014


Marc Jones (marc.jones at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/7907

-gerrit

commit eab321df3eb87e8e55c5bd097e4d2d0cbdc91036
Author: Hung-Te Lin <hungte at chromium.org>
Date:   Tue May 13 22:33:12 2014 +0800

    libpayload: Provide selfboot function.
    
    The calling convention of payload entry function is different by architecture.
    For example, X86 takes no arguments and ARM needs first param to be a
    cb_header_ptr*.
    
    To help payloads load and execute other payloads easily and correctly, we should
    provide the selfboot() function in libpayload, using same prototype as defined
    in Coreboot environment.
    
    BUG=none
    TEST=emerge-nyan libpayload # pass
    BRANCH=none
    
    Original-Change-Id: I8f1cb2c0df788794b2f6f7f5500a3910328a4f84
    Original-Signed-off-by: Hung-Te Lin <hungte at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/199503
    Original-Reviewed-by: Stefan Reinauer <reinauer at chromium.org>
    (cherry picked from commit 1e916cf021ce68886eb9668982c392eadedc7b7e)
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
    
    Change-Id: I7279ef27f49ef581d25a455dd8f1f2f7f1ba58cb
---
 payloads/libpayload/arch/arm/Makefile.inc |  1 +
 payloads/libpayload/arch/arm/selfboot.c   | 35 +++++++++++++++++++++++++++++++
 payloads/libpayload/arch/x86/Makefile.inc |  1 +
 payloads/libpayload/arch/x86/selfboot.c   | 28 +++++++++++++++++++++++++
 payloads/libpayload/include/cbfs.h        |  3 +--
 5 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/payloads/libpayload/arch/arm/Makefile.inc b/payloads/libpayload/arch/arm/Makefile.inc
index 5c22ea8..7009884 100644
--- a/payloads/libpayload/arch/arm/Makefile.inc
+++ b/payloads/libpayload/arch/arm/Makefile.inc
@@ -38,6 +38,7 @@ libc-y += virtual.c
 libc-y += memcpy.S memset.S memmove.S
 libc-y += exception_asm.S exception.c
 libc-y += cache.c cpu.S
+libc-y += selfboot.c
 libcbfs-$(CONFIG_LP_CBFS) += dummy_media.c
 
 # Add other classes here when you put assembly files into them!
diff --git a/payloads/libpayload/arch/arm/selfboot.c b/payloads/libpayload/arch/arm/selfboot.c
new file mode 100644
index 0000000..cbb7ef1
--- /dev/null
+++ b/payloads/libpayload/arch/arm/selfboot.c
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but without any warranty; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <libpayload.h>
+
+extern void *cb_header_ptr;
+
+void selfboot(void *entry)
+{
+	__asm__ __volatile__(
+		"mov r0, %[cb_header_ptr]\n"
+		"bx %[entry]\n"
+		:: [cb_header_ptr]"r"(cb_header_ptr), [entry]"r"(entry)
+		: "r0"
+	);
+}
diff --git a/payloads/libpayload/arch/x86/Makefile.inc b/payloads/libpayload/arch/x86/Makefile.inc
index 549a630..d9cc19e 100644
--- a/payloads/libpayload/arch/x86/Makefile.inc
+++ b/payloads/libpayload/arch/x86/Makefile.inc
@@ -31,6 +31,7 @@ head.o-y += head.S
 libc-y += main.c sysinfo.c
 libc-y += timer.c coreboot.c util.S
 libc-y += exec.S virtual.c
+libc-y += selfboot.c
 libc-y += string.c
 libc-y += exception_asm.S exception.c
 
diff --git a/payloads/libpayload/arch/x86/selfboot.c b/payloads/libpayload/arch/x86/selfboot.c
new file mode 100644
index 0000000..fc89859
--- /dev/null
+++ b/payloads/libpayload/arch/x86/selfboot.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but without any warranty; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <libpayload.h>
+
+void selfboot(void *entry)
+{
+	void (*entry_func)(void) = entry;
+	entry_func();
+}
diff --git a/payloads/libpayload/include/cbfs.h b/payloads/libpayload/include/cbfs.h
index df3bb1c..c5c811c 100644
--- a/payloads/libpayload/include/cbfs.h
+++ b/payloads/libpayload/include/cbfs.h
@@ -82,8 +82,7 @@ void *cbfs_simple_buffer_unmap(struct cbfs_simple_buffer *buffer,
 int run_address(void *f);
 
 /* Defined in src/lib/selfboot.c */
-struct lb_memory;
-int selfboot(struct lb_memory *mem, struct cbfs_payload *payload);
+void selfboot(void *entry);
 
 /* Defined in individual arch / board implementation. */
 int init_default_cbfs_media(struct cbfs_media *media);



More information about the coreboot-gerrit mailing list