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>
Reviewed-on: https://review.coreboot.org/16944
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index ab4d9f4..ef78960 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,18 @@
 
 void main(void)
 {
+	/*
+	 * 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.
+	 */
+	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))