diff options
| author | Patrick Williams <iawillia@us.ibm.com> | 2013-07-16 15:29:15 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-09-17 16:45:31 -0500 |
| commit | 5652d7c0c6a8db05699f2b4334e4615e1ba22127 (patch) | |
| tree | a04321010213943bc44a908a0de0e88149a7e7de /src/runtime/rt_main.C | |
| parent | 7c3226b7ef2b3e09bd40823732f05fbf0fe6778f (diff) | |
| download | blackbird-hostboot-5652d7c0c6a8db05699f2b4334e4615e1ba22127.tar.gz blackbird-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.C | 123 |
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(); +} |

