summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/usr/isteps/istep_reasoncodes.H1
-rw-r--r--src/include/usr/runtime/runtime.H5
-rw-r--r--src/usr/isteps/istep21/call_host_runtime_setup.C53
-rw-r--r--src/usr/runtime/hdatservice.C28
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);
}
OpenPOWER on IntegriCloud