Add option to use Ada code in romstage
If selected, libgnat is linked into romstage. In addition, a call to romstage_adainit() is added to support Ada program data initialization. BUG=b:252792591 BRANCH=firmware-brya-14505.B TEST=Ada code compiles for romstage and loads successfully Change-Id: I74f0460f6b14fde2b4bd6391e1782b2e5b217707 Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/70274 Reviewed-by: Tarun Tuli <taruntuli@google.com> Reviewed-by: Nick Vaccaro <nvaccaro@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
e6b96dceab
commit
fa83887e48
3
Makefile
3
Makefile
|
@ -316,6 +316,9 @@ $(eval $(postinclude-hooks))
|
|||
$(foreach class,$(classes),$(eval $(class)-srcs:=$(sort $($(class)-srcs))))
|
||||
|
||||
# Build Kconfig .ads if necessary
|
||||
ifeq ($(CONFIG_ROMSTAGE_ADA),y)
|
||||
romstage-srcs += $(obj)/romstage/$(notdir $(KCONFIG_AUTOADS))
|
||||
endif
|
||||
ifeq ($(CONFIG_RAMSTAGE_ADA),y)
|
||||
ramstage-srcs += $(obj)/ramstage/$(notdir $(KCONFIG_AUTOADS))
|
||||
endif
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#include <adainit.h>
|
||||
#include <arch/romstage.h>
|
||||
#include <arch/symbols.h>
|
||||
#include <commonlib/helpers.h>
|
||||
|
@ -40,6 +41,18 @@ void __noreturn romstage_main(void)
|
|||
if (CONFIG(VBOOT_EARLY_EC_SYNC))
|
||||
vboot_sync_ec();
|
||||
|
||||
/*
|
||||
* We can generally jump between C and Ada code back and forth
|
||||
* without trouble. But since we don't have an Ada main() we
|
||||
* have to do some Ada package initializations that GNAT would
|
||||
* do there. This has to be done before calling any Ada code.
|
||||
*
|
||||
* The package initializations should not have any dependen-
|
||||
* cies on C code. So we can call them here early, and don't
|
||||
* have to worry at which point we can start to use Ada.
|
||||
*/
|
||||
romstage_adainit();
|
||||
|
||||
mainboard_romstage_entry();
|
||||
|
||||
/* Check the stack. */
|
||||
|
|
|
@ -15,6 +15,12 @@
|
|||
* lizations automatically. When not, we have to call it explicitly.
|
||||
*/
|
||||
|
||||
#if CONFIG(ROMSTAGE_ADA)
|
||||
void romstage_adainit(void);
|
||||
#else
|
||||
static inline void romstage_adainit(void) {}
|
||||
#endif
|
||||
|
||||
#if CONFIG(RAMSTAGE_ADA)
|
||||
void ramstage_adainit(void);
|
||||
#else
|
||||
|
|
|
@ -5,6 +5,11 @@ config MISSING_BOARD_RESET
|
|||
implementation. This activates a stub that logs the missing
|
||||
board reset and halts execution.
|
||||
|
||||
config ROMSTAGE_ADA
|
||||
bool
|
||||
help
|
||||
Selected by features that use Ada code in romstage.
|
||||
|
||||
config RAMSTAGE_ADA
|
||||
bool
|
||||
help
|
||||
|
|
|
@ -339,6 +339,7 @@ $(objcbfs)/%.debug.rmod: $(objcbfs)/%.debug | $(RMODTOOL)
|
|||
$(obj)/%.elf.rmod: $(obj)/%.elf | $(RMODTOOL)
|
||||
$(RMODTOOL) -i $< -o $@
|
||||
|
||||
romstage-$(CONFIG_ROMSTAGE_ADA) += cb.ads
|
||||
ramstage-$(CONFIG_RAMSTAGE_ADA) += cb.ads
|
||||
|
||||
ifeq ($(CONFIG_RAMSTAGE_LIBHWBASE),y)
|
||||
|
|
|
@ -51,6 +51,9 @@ $(foreach arch,$(standard-archs), \
|
|||
$(foreach arch,$(standard-archs), \
|
||||
$(eval $(call libgnat-template,$(arch))))
|
||||
|
||||
ifeq ($(CONFIG_ROMSTAGE_ADA),y)
|
||||
romstage-libs += $(obj)/libgnat-$(ARCH-romstage-y)/libgnat.a
|
||||
endif
|
||||
ifeq ($(CONFIG_RAMSTAGE_ADA),y)
|
||||
ramstage-libs += $(obj)/libgnat-$(ARCH-ramstage-y)/libgnat.a
|
||||
endif
|
||||
|
|
Loading…
Reference in New Issue