diff options
Diffstat (limited to 'src/usr/runtime')
| -rw-r--r-- | src/usr/runtime/hdatservice.C | 27 | ||||
| -rw-r--r-- | src/usr/runtime/hdatservice.H | 17 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/usr/runtime/hdatservice.C b/src/usr/runtime/hdatservice.C index 4fd752653..88e80e9a0 100644 --- a/src/usr/runtime/hdatservice.C +++ b/src/usr/runtime/hdatservice.C @@ -38,6 +38,7 @@ #include "hdatservice.H" #include "errlud_hdat.H" #include <errl/errlmanager.H> +#include <targeting/attrrp.H> //#define REAL_HDAT_TEST @@ -316,6 +317,7 @@ hdatService::hdatService(void) :iv_spiraL(NULL) ,iv_spiraH(NULL) ,iv_spiraS(NULL) +,iv_useRelocatedPayload(false) { for( uint8_t id = static_cast<uint8_t>(RUNTIME::FIRST_SECTION); id <= static_cast<uint8_t>(RUNTIME::LAST_SECTION); @@ -492,6 +494,26 @@ errlHndl_t hdatService::loadHostData(void) uint64_t hdat_start = payload_base*MEGABYTE; uint64_t hdat_size = HDAT_MEM_SIZE; + // OPAL relocates itself after boot. Hence get relocated payload + // address. If relocated address not available then use normal + // base address (as OPAL would have crashed during early init). + if (iv_useRelocatedPayload == true && + TARGETING::PAYLOAD_KIND_SAPPHIRE == payload_kind) + { + uint64_t reloc_base; + + reloc_base = TARGETING::AttrRP::getHbDataRelocPayloadAddr(); + if (reloc_base != 0) + { + hdat_start = reloc_base; + TRACFCOMP( g_trac_runtime, "Relocated payload base =%p", hdat_start); + } + else + { + TRACFCOMP( g_trac_runtime, "No relocated payload base found, continuing on"); + } + } + #ifdef REAL_HDAT_TEST hdat_start = 256*MEGABYTE; #endif @@ -1745,6 +1767,11 @@ errlHndl_t writeActualCount( SectionId i_id ) return Singleton<hdatService>::instance().writeActualCount(i_id); } +void useRelocatedPayloadAddr(bool val) +{ + return Singleton<hdatService>::instance().useRelocatedPayloadAddr(val); +} + /** * @brief Retrieve and log FFDC data relevant to a given section of * host data memory diff --git a/src/usr/runtime/hdatservice.H b/src/usr/runtime/hdatservice.H index 9e3be107b..44ff12a58 100644 --- a/src/usr/runtime/hdatservice.H +++ b/src/usr/runtime/hdatservice.H @@ -303,6 +303,12 @@ namespace RUNTIME uint16_t iv_actuals[RUNTIME::LAST_SECTION+1]; /** + * Used to identify whether to use relocated payload base address + * or normal address. + */ + bool iv_useRelocatedPayload; + + /** * Dummy value for unassigned actual */ enum { @@ -339,6 +345,17 @@ namespace RUNTIME } return l_err; } + + /** + * @brief Use relocated payload base address + * + * @param[in] val 'true' for post dump data collection + * + */ + void useRelocatedPayloadAddr(bool val) + { + iv_useRelocatedPayload = val; + } }; }; |

