diff options
author | Mike Baiocchi <mbaiocch@us.ibm.com> | 2018-05-03 09:02:02 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-05-08 14:37:04 -0400 |
commit | 3d3d39d62a94da9dc9bc2da73474c9c3400762c4 (patch) | |
tree | d411a52560e6f8603b29ac60f47513793bf0a80e | |
parent | d44dfb65fa5d66ca123b3d844c5aaf103f50e1d1 (diff) | |
download | blackbird-hostboot-3d3d39d62a94da9dc9bc2da73474c9c3400762c4.tar.gz blackbird-hostboot-3d3d39d62a94da9dc9bc2da73474c9c3400762c4.zip |
Get Final HDAT Size from PAYLOAD's SPIRA section
This commit retrieves the amount of space the PAYLOAD has reserved
for the HDAT content in its SPIRA section. It then uses this size
when copying the HDAT from the temporary location (where the FSP
put it with DMAs-via-TCEs) to its final location.
Change-Id: I430a78a1655db85f448b3f5c30e6a83f5be4b1f6
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/58261
Reviewed-by: ILYA SMIRNOV <ismirno@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@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>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-rw-r--r-- | src/include/usr/isteps/istep_reasoncodes.H | 1 | ||||
-rw-r--r-- | src/include/usr/runtime/runtime.H | 5 | ||||
-rw-r--r-- | src/usr/isteps/istep21/call_host_runtime_setup.C | 53 | ||||
-rw-r--r-- | src/usr/runtime/hdatservice.C | 28 |
4 files changed, 65 insertions, 22 deletions
diff --git a/src/include/usr/isteps/istep_reasoncodes.H b/src/include/usr/isteps/istep_reasoncodes.H index 01aa61bca..1595210e3 100644 --- a/src/include/usr/isteps/istep_reasoncodes.H +++ b/src/include/usr/isteps/istep_reasoncodes.H @@ -117,6 +117,7 @@ namespace ISTEP RC_FAILED_WRITE_SPR = ISTEP_COMP_ID | 0x37, RC_FAILED_TO_BOOT_SBE = ISTEP_COMP_ID | 0x38, RC_REDISCOVERED_TARGETS = ISTEP_COMP_ID | 0x39, + RC_HDAT_SIZE_CHECK_FAILED = ISTEP_COMP_ID | 0x3A, }; }; diff --git a/src/include/usr/runtime/runtime.H b/src/include/usr/runtime/runtime.H index 9b8112a2b..042ff8002 100644 --- a/src/include/usr/runtime/runtime.H +++ b/src/include/usr/runtime/runtime.H @@ -351,8 +351,11 @@ errlHndl_t openUntrustedSpCommArea(uint64_t i_commbase); * * @param[in] payloadBase_va - Virtual Address pointing to start of PAYLOAD * @param[out] o_hdat_offset - Offset of HDAT Location from start of PAYLOAD + * @param[out] o_hdat_size - Size of HDAT Location reserved by PAYLOAD */ -void findHdatLocation(uint64_t payloadBase_va, uint64_t& o_hdat_offset); +void findHdatLocation(uint64_t payloadBase_va, + uint64_t& o_hdat_offset, + size_t& o_hdat_size); } diff --git a/src/usr/isteps/istep21/call_host_runtime_setup.C b/src/usr/isteps/istep21/call_host_runtime_setup.C index 4c3dca014..237f45691 100644 --- a/src/usr/isteps/istep21/call_host_runtime_setup.C +++ b/src/usr/isteps/istep21/call_host_runtime_setup.C @@ -374,6 +374,9 @@ errlHndl_t verifyAndMovePayload(void) payload_tmp_virt_addr, payload_size); + // 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 ); // Move HDAT into its proper place after it was temporarily put into // HDAT_TMP_ADDR-relative-to-HRMOR (HDAT_TMP_SIZE) by the FSP via TCEs @@ -395,14 +398,43 @@ errlHndl_t verifyAndMovePayload(void) break; } - // Determine location of HDAT from NACA section of PAYLOAD + // Determine location and size of HDAT from NACA section of PAYLOAD uint64_t hdat_cpy_offset = 0; + size_t hdat_cpy_size = 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, hdat_cpy_size); + + + // Check that the size PAYLOAD allocated for HDAT is less than + // temporary HDAT space + if ( hdat_cpy_size > HDAT_TMP_SIZE) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,ERR_MRK + "verifyAndMovePayload(): PAYLOAD's allocated HDAT size 0x%X " + "Exceeds Maximum Temporary HDAT Size 0x%X", + hdat_cpy_size, HDAT_TMP_SIZE); - RUNTIME::findHdatLocation(payloadBase_va, hdat_cpy_offset); + /*@ + * @errortype + * @reasoncode RC_HDAT_SIZE_CHECK_FAILED + * @severity ERRL_SEV_UNRECOVERABLE + * @moduleid MOD_VERIFY_AND_MOVE_PAYLOAD + * @userdata1 Allocated HDAT size from PAYLOAD + * @userdata2 Temporary HDAT size + * @devdesc PAYLOAD allocated more HDAT space than temporary + * space that Hostboot uses + * @custdesc A problem occurred during the IPL + * of the system. + */ + l_err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE, + MOD_VERIFY_AND_MOVE_PAYLOAD, + RC_HDAT_SIZE_CHECK_FAILED, + hdat_cpy_size, + HDAT_TMP_SIZE, + true /*Add HB SW Callout*/); + l_err ->collectTrace("ISTEPS_TRACE",256); + break; + } // PHYP images require adding 1 PAGESIZE since our virtual address starts // at the secure header of PAYLOAD before PAYLOAD_BASE @@ -412,13 +444,13 @@ errlHndl_t verifyAndMovePayload(void) } TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "verifyAndMovePayload(): hdat_copy_offset = 0x%X", - hdat_cpy_offset); + "verifyAndMovePayload(): hdat_copy_offset = 0x%X and size=0x%X", + hdat_cpy_offset, hdat_cpy_size); hdat_final_virt_addr = mm_block_map( reinterpret_cast<void*>(payloadBase + hdat_cpy_offset), - HDAT_TMP_SIZE); + hdat_cpy_size); // Check for nullptr being returned if (hdat_final_virt_addr == nullptr) @@ -436,11 +468,12 @@ errlHndl_t verifyAndMovePayload(void) "verifyAndMovePayload(): Copy HDAT from 0x%.16llX (va=" "0x%llX) to HDAT_FINAL = 0x%.16llX (va=0x%llX), size=0x%llX", hdat_tmp_phys_addr, hdat_tmp_virt_addr, - payloadBase+hdat_cpy_offset, hdat_final_virt_addr, HDAT_TMP_SIZE); + payloadBase+hdat_cpy_offset, hdat_final_virt_addr, + hdat_cpy_size); memcpy(hdat_final_virt_addr, hdat_tmp_virt_addr, - HDAT_TMP_SIZE); + hdat_cpy_size); } while(0); diff --git a/src/usr/runtime/hdatservice.C b/src/usr/runtime/hdatservice.C index 88e80e9a0..c2721fd68 100644 --- a/src/usr/runtime/hdatservice.C +++ b/src/usr/runtime/hdatservice.C @@ -1800,9 +1800,10 @@ errlHndl_t clear_host_data_section(const RUNTIME::SectionId i_section) } -void findHdatLocation(const uint64_t i_payloadBase_va, uint64_t& o_hdat_offset) +void findHdatLocation(const uint64_t i_payloadBase_va, + uint64_t& o_hdat_offset, + size_t& o_hdat_size) { - TRACFCOMP( g_trac_runtime, ENTER_MRK"findHdatLocation> i_payloadBase_va = 0x%.16llX", i_payloadBase_va); do { @@ -1814,22 +1815,27 @@ void findHdatLocation(const uint64_t i_payloadBase_va, uint64_t& o_hdat_offset) (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*> + // 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 ); + 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 ); + // 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: " + "hdatAbsAddr=0x%X, hdatAllocCnt=0x%X, hdatAllocSize=0x%X", + tuple, tuple->hdatAbsAddr, tuple->hdatAllocCnt, + tuple->hdatAllocSize ); o_hdat_offset = tuple->hdatAbsAddr; + o_hdat_size = tuple->hdatAllocCnt * tuple->hdatAllocSize; } while (0); - TRACFCOMP( g_trac_runtime, EXIT_MRK"findHdatLocation> o_hdat_offset = 0x%X", o_hdat_offset); - + TRACFCOMP( g_trac_runtime, EXIT_MRK"findHdatLocation> " + "o_hdat_offset = 0x%X, o_hdat_size=0x%X", + o_hdat_offset, o_hdat_size); } |