summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMike Baiocchi <mbaiocch@us.ibm.com>2018-02-07 10:08:45 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-02-08 14:21:57 -0500
commitb1d0900ad706cd8e2a91a1acab016f5b681e23ef (patch)
treef881039f56e4ed423401bd54d3f10fb90800d10e /src
parent03de84e713fb21f0e091ff29f05a77fec9e240b3 (diff)
downloadtalos-hostboot-b1d0900ad706cd8e2a91a1acab016f5b681e23ef.tar.gz
talos-hostboot-b1d0900ad706cd8e2a91a1acab016f5b681e23ef.zip
Find location of HDAT relocation dynamically from PAYLOAD
This commit looks at the NACA structure in the Primary PAYLOAD lid to determine the final destination of the HDAT structure that the FSP loaded into a temporary memory space using TCEs. Change-Id: I82b94f5fc133e4222d4efdcc7444012d7bcb5166 RTC:168745 Backport:release-fips910 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/53564 Reviewed-by: ILYA SMIRNOV <ismirno@us.ibm.com> Reviewed-by: Marshall J. Wilks <mjwilks@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/runtime/runtime.H12
-rw-r--r--src/usr/isteps/istep21/call_host_runtime_setup.C33
-rw-r--r--src/usr/runtime/hdatservice.C34
3 files changed, 68 insertions, 11 deletions
diff --git a/src/include/usr/runtime/runtime.H b/src/include/usr/runtime/runtime.H
index 798b15807..855ef86ac 100644
--- a/src/include/usr/runtime/runtime.H
+++ b/src/include/usr/runtime/runtime.H
@@ -264,6 +264,18 @@ void rediscover_hdat( void );
*/
errlHndl_t openUntrustedSpCommArea();
+/**
+ * @brief Locates the offset of the HDAT structure as directed by the PAYLOAD
+ *
+ * Walks the NACA in the PAYLOAD to find the SpiraH structure. The SpiraH
+ * structure contains the offset to the SpiraS structure which is where the
+ * PAYLOAD expects the HDAT structure to be placed.
+ *
+ * @param[in] payloadBase_va - Virtual Address pointing to start of PAYLOAD
+ * @param[out] o_hdat_offset - Offset of HDAT Location from start of PAYLOAD
+ */
+void findHdatLocation(uint64_t payloadBase_va, uint64_t& o_hdat_offset);
+
}
#endif
diff --git a/src/usr/isteps/istep21/call_host_runtime_setup.C b/src/usr/isteps/istep21/call_host_runtime_setup.C
index b91e83fd3..056de3191 100644
--- a/src/usr/isteps/istep21/call_host_runtime_setup.C
+++ b/src/usr/isteps/istep21/call_host_runtime_setup.C
@@ -258,18 +258,9 @@ errlHndl_t verifyAndMovePayload(void)
payload_tmp_virt_addr,
payload_size);
- // Move HDAT temporarily put into HDAT_TMP_ADDR (HDAT_TMP_SIZE) into
- // its proper place
- // @TODO RTC 168745 - Update hdatservices calls to return Spira-S offset
- // Currently just using this known offset 80MB=0x5000000 used in current
- // PHYP images and then adding 1 PAGESIZE since our virtual address starts
- // at the secure header of PAYLOAD before PAYLOAD_BASE
- size_t hdat_cpy_offset = 0x5001000;
- if (!is_phyp)
- {
- hdat_cpy_offset = 0x31200000;
- }
+ // Move HDAT into its proper place after it was temporarily put into
+ // HDAT_TMP_ADDR (HDAT_TMP_SIZE) by the FSP via TCEs
hdat_tmp_virt_addr = mm_block_map(
reinterpret_cast<void*>(HDAT_TMP_ADDR),
HDAT_TMP_SIZE);
@@ -286,6 +277,26 @@ errlHndl_t verifyAndMovePayload(void)
break;
}
+ // Determine location of HDAT from NACA section of PAYLOAD
+ uint64_t hdat_cpy_offset = 0;
+
+ // Convert the move payloadBase_va to after secure header for PHYP
+ uint64_t payloadBase_va = reinterpret_cast<uint64_t>(payloadBase_virt_addr);
+ payloadBase_va += (is_phyp ? PAGESIZE : 0 );
+
+ RUNTIME::findHdatLocation(payloadBase_va, hdat_cpy_offset);
+
+ // PHYP images require adding 1 PAGESIZE since our virtual address starts
+ // at the secure header of PAYLOAD before PAYLOAD_BASE
+ if (is_phyp)
+ {
+ hdat_cpy_offset += PAGESIZE;
+ }
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "verifyAndMovePayload(): hdat_copy_offset = 0x%X",
+ hdat_cpy_offset);
+
hdat_final_virt_addr = mm_block_map(
reinterpret_cast<void*>(payloadBase +
hdat_cpy_offset),
diff --git a/src/usr/runtime/hdatservice.C b/src/usr/runtime/hdatservice.C
index 3986efce6..4fd752653 100644
--- a/src/usr/runtime/hdatservice.C
+++ b/src/usr/runtime/hdatservice.C
@@ -1772,6 +1772,40 @@ errlHndl_t clear_host_data_section(const RUNTIME::SectionId i_section)
return Singleton<hdatService>::instance().clearHostDataSection(i_section);
}
+
+void findHdatLocation(const uint64_t i_payloadBase_va, uint64_t& o_hdat_offset)
+{
+
+ TRACFCOMP( g_trac_runtime, ENTER_MRK"findHdatLocation> i_payloadBase_va = 0x%.16llX", i_payloadBase_va);
+
+ do {
+
+ // Everything starts at the NACA
+ // The NACA is part of the platform dependent LID which
+ // is loaded at relative memory address 0x0
+ const hdatNaca_t* naca = reinterpret_cast<const hdatNaca_t*>
+ (HDAT_NACA_OFFSET + i_payloadBase_va);
+ TRACFCOMP( g_trac_runtime, "findHdatLocation> NACA=0x%.X->0x%p", HDAT_NACA_OFFSET, naca );
+
+ // Find SpiraH information in NACA
+ const hdatSpira_t* spiraH = reinterpret_cast<const hdatSpira_t*>
+ (naca->spiraH + i_payloadBase_va);
+ TRACFCOMP( g_trac_runtime, "findHdatLocation> SPIRA-H=0x%X->0x%p", naca->spiraH, spiraH );
+
+ // SPIRA-S is at the beginning of the Host Data Area Tuple of SpiraH
+ const hdat5Tuple_t* tuple = reinterpret_cast<const hdat5Tuple_t*>
+ (&(spiraH->hdatDataArea[SPIRAH_HOST_DATA_AREAS]));
+ TRACFCOMP( g_trac_runtime, "findHdatLocation> SPIRA-S tuple at 0x%p, tuple->hdatAbsAddr=0x%X", tuple, tuple->hdatAbsAddr );
+
+ o_hdat_offset = tuple->hdatAbsAddr;
+
+ } while (0);
+
+ TRACFCOMP( g_trac_runtime, EXIT_MRK"findHdatLocation> o_hdat_offset = 0x%X", o_hdat_offset);
+
+}
+
+
};
void hdatMsVpdRhbAddrRange_t::set(const HDAT::hdatMsVpdRhbAddrRangeType i_type,
OpenPOWER on IntegriCloud