Nico Huber (nico.h@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@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@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))