diff options
-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); } |