summaryrefslogtreecommitdiffstats
path: root/src/runtime/rt_main.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2013-07-16 15:29:15 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-09-17 16:45:31 -0500
commit5652d7c0c6a8db05699f2b4334e4615e1ba22127 (patch)
treea04321010213943bc44a908a0de0e88149a7e7de /src/runtime/rt_main.C
parent7c3226b7ef2b3e09bd40823732f05fbf0fe6778f (diff)
downloadtalos-hostboot-5652d7c0c6a8db05699f2b4334e4615e1ba22127.tar.gz
talos-hostboot-5652d7c0c6a8db05699f2b4334e4615e1ba22127.zip
Initial Hostboot Runtime image support.
RTC: 76675 Change-Id: Ibd21cf5b555e6dcee182a2f1a292b47d4f384ba0 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6127 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/runtime/rt_main.C')
-rw-r--r--src/runtime/rt_main.C123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/runtime/rt_main.C b/src/runtime/rt_main.C
new file mode 100644
index 000000000..910a0d1d8
--- /dev/null
+++ b/src/runtime/rt_main.C
@@ -0,0 +1,123 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/runtime/rt_main.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+#include <builtins.h>
+#include <limits.h>
+#include <runtime/interface.h>
+#include <util/singleton.H>
+#include <stdio.h>
+#include <util/align.H>
+
+// Address of the first writable page, initialized by the linker.
+extern void* data_load_address;
+// Forward declaration to vfs code.
+void vfs_module_init();
+
+
+/** @fn _main
+ *
+ * @brief Entry point called from Sapphire to initialize RT image.
+ *
+ * @param[in] intf - Runtime interfaces structure from Sapphire.
+ * @param[in] base - Memory address of the start of the RT image.
+ *
+ * @return - runtimeInterfaces_t* - Pointer to RT image's interfaces.
+ *
+ * This function is required to be in the .text.intvects section so that
+ * it is placed into the first page (4k) of the image. When HB IPL
+ * loads the RT image for CxxTest execution it will only mark the first
+ * page executable. The remainder is marked execute via callbacks from
+ * within _main.
+ */
+extern "C"
+{
+ runtimeInterfaces_t* _main(hostInterfaces_t*, uint64_t base)
+ SYMB_SECTION(".text.intvects");
+}
+
+/** @fn rt_start
+ *
+ * @brief Remainder of RT image initializion.
+ *
+ * After _main marks pages executable we can leave the first page of the
+ * image. This function performs the bulk of the initialization:
+ *
+ * 1) Call C++ constructors for this image.
+ * 2) Load all modules in the image.
+ *
+ * @param[in] intf - Runtime interfaces structure from Sapphire.
+ */
+runtimeInterfaces_t* rt_start(hostInterfaces_t*) NEVER_INLINE;
+
+/** Call C++ constructors present in this image. */
+void rt_cppBootstrap();
+
+runtimeInterfaces_t* _main(hostInterfaces_t* intf, uint64_t base)
+{
+ // Ensure remainder of image has text pages marked execute.
+ for (uint64_t i = base;
+ i < ALIGN_PAGE_DOWN((uint64_t)&data_load_address);
+ i += PAGESIZE)
+ {
+ (intf->set_page_execute)(reinterpret_cast<void*>(i));
+ }
+
+ // Tail-recurse to real entry point.
+ return rt_start(intf);
+}
+
+runtimeInterfaces_t* rt_start(hostInterfaces_t* intf)
+{
+ (intf->puts)("Starting Runtime Services....\n");
+
+ // Save a pointer to interfaces from Sapphire.
+ g_hostInterfaces = intf;
+
+ // Call C++ constructors.
+ rt_cppBootstrap();
+
+ // Initialize all modules.
+ vfs_module_init();
+
+ // Return our interface pointer structure.
+ return getRuntimeInterfaces();
+}
+
+void rt_cppBootstrap()
+{
+ // Call default constructors for any static objects.
+ extern void (*ctor_start_address)();
+ extern void (*ctor_end_address)();
+ void(**ctors)() = &ctor_start_address;
+ while(ctors != &ctor_end_address)
+ {
+ (*ctors)();
+ ctors++;
+ }
+}
+
+hostInterfaces_t* g_hostInterfaces = NULL;
+
+runtimeInterfaces_t* getRuntimeInterfaces()
+{
+ return &Singleton<runtimeInterfaces_t>::instance();
+}
OpenPOWER on IntegriCloud