|
@@ -8,6 +8,39 @@
|
|
|
|
|
|
typedef int (*init_fnc_t)(void);
|
|
|
|
|
|
-int initcall_run_list(const init_fnc_t init_sequence[]);
|
|
|
+#include <common.h>
|
|
|
+#include <initcall.h>
|
|
|
+#include <efi.h>
|
|
|
+
|
|
|
+DECLARE_GLOBAL_DATA_PTR;
|
|
|
+
|
|
|
+static inline int initcall_run_list(const init_fnc_t init_sequence[])
|
|
|
+{
|
|
|
+ const init_fnc_t *init_fnc_ptr;
|
|
|
+
|
|
|
+ for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
|
|
|
+ unsigned long reloc_ofs = 0;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (gd->flags & GD_FLG_RELOC)
|
|
|
+ reloc_ofs = gd->reloc_off;
|
|
|
+#ifdef CONFIG_EFI_APP
|
|
|
+ reloc_ofs = (unsigned long)image_base;
|
|
|
+#endif
|
|
|
+ debug("initcall: %p", (char *)*init_fnc_ptr - reloc_ofs);
|
|
|
+ if (gd->flags & GD_FLG_RELOC)
|
|
|
+ debug(" (relocated to %p)\n", (char *)*init_fnc_ptr);
|
|
|
+ else
|
|
|
+ debug("\n");
|
|
|
+ ret = (*init_fnc_ptr)();
|
|
|
+ if (ret) {
|
|
|
+ printf("initcall sequence %p failed at call %p (err=%d)\n",
|
|
|
+ init_sequence,
|
|
|
+ (char *)*init_fnc_ptr - reloc_ofs, ret);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
#endif
|