[coreboot-gerrit] Patch set updated for coreboot: Add option to use Ada code in ramstage

Nico Huber (nico.h@gmx.de) gerrit at coreboot.org
Tue Nov 1 16:14:31 CET 2016


Nico Huber (nico.h at gmx.de) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/16944

-gerrit

commit 2d9255f42ad7770efd80aab60e11059471838d0a
Author: Nico Huber <nico.huber at secunet.com>
Date:   Fri Oct 7 12:58:17 2016 +0200

    Add option to use Ada code in ramstage
    
    If selected, libgnat will be linked into ramstage. And, to support Ada
    package intializations, we have to call ramstage_adainit().
    
    Change-Id: I11417db21f16bf3007739a097d63fd592344bce3
    Signed-off-by: Nico Huber <nico.huber at secunet.com>
---
 src/Kconfig               |  5 +++++
 src/include/adainit.h     | 35 +++++++++++++++++++++++++++++++++++
 src/lib/gnat/Makefile.inc |  4 ++++
 src/lib/hardwaremain.c    |  5 +++++
 4 files changed, 49 insertions(+)

diff --git a/src/Kconfig b/src/Kconfig
index e337a1a..d6af6eb 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -1243,3 +1243,8 @@ config CHECKLIST_DATA_FILE_LOCATION
 	  symbols contained only in <stage>_complete.dat will be flagged as
 	  required and not implemented if a weak implementation is found in the
 	  resulting image.
+
+config RAMSTAGE_ADA
+	def_bool n
+	help
+	  Selected by features that use Ada code in ramstage.
diff --git a/src/include/adainit.h b/src/include/adainit.h
new file mode 100644
index 0000000..34f45cb
--- /dev/null
+++ b/src/include/adainit.h
@@ -0,0 +1,35 @@
+/*
+ * This file is part of the coreboot 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; 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.
+ */
+
+#ifndef _ADAINIT_H
+#define _ADAINIT_H
+
+/**
+ * @file adainit.h
+ *
+ * Ada supports some complex constructs that result in code for runtime
+ * initialization. It's also possible to have explicit procedures for
+ * package level initialization (e.g. you can initialize huge arrays in
+ * a loop instead of cluttering the binary).
+ *
+ * When an Ada main() is in charge, GNAT emmits the call to the initia-
+ * lizations automatically. When not, we have to call it explicitly.
+ */
+
+#if IS_ENABLED(CONFIG_RAMSTAGE_ADA)
+void ramstage_adainit(void);
+#else
+static inline void ramstage_adainit(void) {}
+#endif
+
+#endif /* _ADAINIT_H */
diff --git a/src/lib/gnat/Makefile.inc b/src/lib/gnat/Makefile.inc
index 6ba274a..394c838 100644
--- a/src/lib/gnat/Makefile.inc
+++ b/src/lib/gnat/Makefile.inc
@@ -60,3 +60,7 @@ $(foreach arch,$(standard-archs), \
 
 $(foreach arch,$(standard-archs), \
 	$(eval $(call libgnat-template,$(arch))))
+
+ifeq ($(CONFIG_RAMSTAGE_ADA),y)
+ramstage-libs += $$(obj)/libgnat-$(ARCH-ramstage-y)/libgnat.a
+endif
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index ab4d9f4..f30f823 100644
--- a/src/lib/hardwaremain.c
+++ b/src/lib/hardwaremain.c
@@ -18,6 +18,7 @@
  * C Bootstrap code for the coreboot
  */
 
+#include <adainit.h>
 #include <arch/exception.h>
 #include <bootstate.h>
 #include <console/console.h>
@@ -429,6 +430,10 @@ static void boot_state_schedule_static_entries(void)
 
 void main(void)
 {
+	/* Since we don't have an Ada main(), initialize Ada packages
+	   explicitly. Has to be done before calling any Ada code. */
+	ramstage_adainit();
+
 	/* TODO: Understand why this is here and move to arch/platform code. */
 	/* For MMIO UART this needs to be called before any other printk. */
 	if (IS_ENABLED(CONFIG_ARCH_X86))



More information about the coreboot-gerrit mailing list