[coreboot-gerrit] Patch set updated for coreboot: be34961 cbfs/rmodule: add architecture specific operations at stage load

Aaron Durbin (adurbin@google.com) gerrit at coreboot.org
Fri Mar 20 20:27:54 CET 2015


Aaron Durbin (adurbin at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8837

-gerrit

commit be3496159d64c753fbb936a088d3dffd79206e3a
Author: Ionela Voinescu <ionela.voinescu at imgtec.com>
Date:   Fri Jan 9 13:14:20 2015 +0000

    cbfs/rmodule: add architecture specific operations at stage load
    
    Two weak functions were added so that architecture specific operations
    on each segment of payload or stage can be performed.
    Each architecture must define its own operations, otherwise the
    behavior will default to do-nothing functions.
    
    This patch has been updated by to fit more in line with
    how program loading is currently being done. The API is the
    same as the original, but all call sites to stages/payloads
    have been updated. This is known to break any archs that use
    rmodule loading that needs cache maintenance. That will be fixed
    in a forthcoming patch. Also, the vboot paths are left as is
    for easier upstreaming of the rest of the vboot patches.
    
    Original-Change-Id: Ie29e7f9027dd430c8b4dde9848fa3413c5dbfbfa
    Original-Signed-off-by: Ionela Voinescu <ionela.voinescu at imgtec.com>
    Original-Reviewed-on: https://chromium-review.googlesource.com/239881
    Original-Reviewed-by: Vadim Bendebury <vbendeb at chromium.org>
    (cherry picked from commit c82c21ce87a4c02bd9219548a4226a58e77beef0)
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
    
    Change-Id: Ifcee5cd9ac5dbca991556296eb5e170b47b77af7
---
 src/include/program_loading.h |  7 +++++++
 src/lib/Makefile.inc          |  4 ++++
 src/lib/arch_ops.c            | 33 +++++++++++++++++++++++++++++++++
 src/lib/cbfs.c                |  3 +++
 src/lib/rmodule.c             |  6 ++++--
 src/lib/selfboot.c            | 14 ++++++++++++++
 6 files changed, 65 insertions(+), 2 deletions(-)

diff --git a/src/include/program_loading.h b/src/include/program_loading.h
index 68a8368..ca61c16 100644
--- a/src/include/program_loading.h
+++ b/src/include/program_loading.h
@@ -2,6 +2,7 @@
  * This file is part of the coreboot project.
  *
  * Copyright 2015 Google Inc.
+ * Copyright (C) 2014 Imagination Technologies
  *
  * 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
@@ -22,6 +23,12 @@
 #include <stdint.h>
 #include <stddef.h>
 
+/* For each segment of a program loaded this function is called*/
+void arch_program_segment_loaded(uintptr_t start, size_t size);
+
+/* Upon completion of loading a program this function is called */
+void arch_program_loaded(void);
+
 /************************
  *   ROMSTAGE LOADING   *
  ************************/
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index d1e3a92..3b15537 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -18,6 +18,7 @@
 #
 subdirs-y += loaders
 
+bootblock-y += arch_ops.c
 bootblock-y += cbfs.c cbfs_core.c
 bootblock-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
 
@@ -25,6 +26,7 @@ bootblock-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c
 bootblock-y += memchr.c
 bootblock-y += memcmp.c
 
+verstage-y += arch_ops.c
 verstage-y += delay.c
 verstage-y += cbfs.c
 verstage-y += memcmp.c
@@ -34,6 +36,7 @@ verstage-y += tlcl.c
 verstage-$(CONFIG_GENERIC_UDELAY) += timer.c
 
 
+romstage-y += arch_ops.c
 romstage-y += memchr.c
 romstage-y += memcmp.c
 $(foreach arch,$(ARCH_SUPPORTED),\
@@ -58,6 +61,7 @@ romstage-$(CONFIG_ARCH_ROMSTAGE_X86_32) += gcc.c
 ramstage-$(CONFIG_ARCH_RAMSTAGE_X86_32) += gcc.c
 endif
 
+ramstage-y += arch_ops.c
 ramstage-y += hardwaremain.c
 ramstage-y += selfboot.c
 ramstage-y += coreboot_table.c
diff --git a/src/lib/arch_ops.c b/src/lib/arch_ops.c
new file mode 100644
index 0000000..f02b342
--- /dev/null
+++ b/src/lib/arch_ops.c
@@ -0,0 +1,33 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2014 Imagination Technologies
+ *
+ * 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; version 2 of the License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <program_loading.h>
+
+/* For each segment of a program loaded this function is called*/
+__attribute__ ((weak)) void arch_program_segment_loaded(uintptr_t start,
+							size_t size)
+{
+	/* do nothing */
+}
+
+/* Upon completion of loading a program this function is called */
+__attribute__ ((weak)) void arch_program_loaded(void)
+{
+	/* do nothing */
+}
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index 9e9f4a7..fb83962 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -19,6 +19,7 @@
  */
 
 
+#include <program_loading.h>
 #include "cbfs_core.h"
 
 #ifndef __SMM__
@@ -102,6 +103,8 @@ void * cbfs_load_stage(struct cbfs_media *media, const char *name)
 	memset((void *)((uintptr_t)stage->load + final_size), 0,
 	       stage->memlen - final_size);
 
+	arch_program_segment_loaded(stage->load, final_size);
+	arch_program_loaded();
 	DEBUG("stage loaded.\n");
 
 	entry = stage->entry;
diff --git a/src/lib/rmodule.c b/src/lib/rmodule.c
index 8d96e8d..c2bf33c 100644
--- a/src/lib/rmodule.c
+++ b/src/lib/rmodule.c
@@ -22,8 +22,8 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
-#include <arch/cache.h>
 #include <console/console.h>
+#include <program_loading.h>
 #include <rmodule.h>
 
 /* Change this define to get more verbose debugging for module loading. */
@@ -200,7 +200,9 @@ int rmodule_load(void *base, struct rmodule *module)
 		return -1;
 	rmodule_clear_bss(module);
 
-	cache_sync_instructions();
+	arch_program_segment_loaded((uintptr_t)module->location,
+					rmodule_memory_size(module));
+	arch_program_loaded();
 
 	return 0;
 }
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index 4c5fbad..fe73c0c 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -437,8 +437,22 @@ static int load_self_segments(
 					memcpy((char*)to, (char*)from, amount);
 				}
 			}
+
+			/*
+			 * Each architecture can perform additonal operations
+			 * on the loaded segment
+			 */
+			arch_program_segment_loaded((uintptr_t)dest,
+							ptr->s_memsz);
 		}
 	}
+
+	/*
+	 * Each architecture can perform additonal operations once the entire
+	 * program is loaded
+	 */
+	arch_program_loaded();
+
 	return 1;
 }
 



More information about the coreboot-gerrit mailing list