summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/isteps/istep15/host_build_stop_image.C8
-rw-r--r--src/usr/isteps/pm/pm_common.C6
-rw-r--r--src/usr/sbe/sbe_update.C69
3 files changed, 80 insertions, 3 deletions
diff --git a/src/usr/isteps/istep15/host_build_stop_image.C b/src/usr/isteps/istep15/host_build_stop_image.C
index 9109df54d..b63fc4390 100644
--- a/src/usr/isteps/istep15/host_build_stop_image.C
+++ b/src/usr/isteps/istep15/host_build_stop_image.C
@@ -366,10 +366,11 @@ void* host_build_stop_image (void *io_pArgs)
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "host_build_stop_image entry" );
- // allocate three temporary work buffers
+ // allocate four temporary work buffers
void* l_temp_buffer0 = malloc(HW_IMG_RING_SIZE);
void* l_temp_buffer1 = malloc(MAX_RING_BUF_SIZE);
void* l_temp_buffer2 = malloc(MAX_RING_BUF_SIZE);
+ void* l_temp_buffer3 = malloc(MAX_RING_BUF_SIZE);
do {
//Determine top-level system target
@@ -528,7 +529,9 @@ void* host_build_stop_image (void *io_pArgs)
l_temp_buffer1,
MAX_RING_BUF_SIZE,
l_temp_buffer2,
- MAX_RING_BUF_SIZE );
+ MAX_RING_BUF_SIZE,
+ l_temp_buffer3,
+ MAX_RING_BUF_SIZE);
if ( l_errl )
{
@@ -592,6 +595,7 @@ void* host_build_stop_image (void *io_pArgs)
if( l_temp_buffer0 ) { free(l_temp_buffer0); }
if( l_temp_buffer1 ) { free(l_temp_buffer1); }
if( l_temp_buffer2 ) { free(l_temp_buffer2); }
+ if( l_temp_buffer3 ) { free(l_temp_buffer3); }
#ifdef CONFIG_SECUREBOOT
// securely unload HCODE PNOR section, if necessary
diff --git a/src/usr/isteps/pm/pm_common.C b/src/usr/isteps/pm/pm_common.C
index 995686747..15a91c5a1 100644
--- a/src/usr/isteps/pm/pm_common.C
+++ b/src/usr/isteps/pm/pm_common.C
@@ -238,6 +238,7 @@ namespace HBPM
void *l_buffer0 = (void*)malloc(HW_IMG_RING_SIZE);
void *l_buffer1 = (void*)malloc(MAX_RING_BUF_SIZE);
void *l_buffer2 = (void*)malloc(MAX_RING_BUF_SIZE);
+ void *l_buffer3 = (void*)malloc(MAX_RING_BUF_SIZE);
do
{
@@ -323,7 +324,9 @@ namespace HBPM
l_buffer1,
MAX_RING_BUF_SIZE,
l_buffer2,
- MAX_RING_BUF_SIZE );
+ MAX_RING_BUF_SIZE,
+ l_buffer3,
+ MAX_RING_BUF_SIZE);
if (l_errl)
{
@@ -413,6 +416,7 @@ namespace HBPM
free(l_buffer0);
free(l_buffer1);
free(l_buffer2);
+ free(l_buffer3);
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
EXIT_MRK"loadHcode: RC=0x%X, PLID=0x%lX",
diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
index 5c4068631..b3366adf0 100644
--- a/src/usr/sbe/sbe_update.C
+++ b/src/usr/sbe/sbe_update.C
@@ -962,6 +962,7 @@ namespace SBE
/////////////////////////////////////////////////////////////////////
errlHndl_t procCustomizeSbeImg(TARGETING::Target* i_target,
+ void* i_hwImgPtr,
void* i_sbeImgPtr,
size_t i_maxImgSize,
void* io_imgPtr,
@@ -1035,6 +1036,7 @@ namespace SBE
FAPI_INVOKE_HWP( err,
p9_xip_customize,
l_fapiTarg,
+ i_hwImgPtr,
io_imgPtr, //image in/out
tmpImgSize,
(void*)RING_SEC_VADDR,
@@ -1045,6 +1047,8 @@ namespace SBE
(uint32_t)MAX_RING_BUF_SIZE,
(void*)RING_BUF2_VADDR,
(uint32_t)MAX_RING_BUF_SIZE,
+ (void*)RING_BUF3_VADDR,
+ (uint32_t)MAX_RING_BUF_SIZE,
procIOMask ); // Bits(8:31) = EC00:EC23
// Check for no error and use of input cores
@@ -1705,6 +1709,36 @@ namespace SBE
}
/////////////////////////////////////////////////////////////////////
+ errlHndl_t sbeLoadHcode(char*& o_hcodeAddr)
+ {
+ errlHndl_t l_errl = NULL;
+ PNOR::SectionInfo_t l_info;
+
+ do
+ {
+
+ // Get HCODE PNOR section info from PNOR RP
+ l_errl = PNOR::getSectionInfo( PNOR::HCODE, l_info );
+ if( l_errl )
+ {
+ //No need to commit error here, it gets handled later
+ //just break out to escape this function
+ break;
+ }
+
+ o_hcodeAddr = reinterpret_cast<char*>(l_info.vaddr);
+
+ TRACUCOMP( g_trac_sbe,
+ ERR_MRK"sbeLoadHcode() - Error from "
+ "HCODE addr = 0x%p ",
+ o_hcodeAddr);
+
+ } while ( 0 );
+
+ return l_errl;
+ }
+
+ /////////////////////////////////////////////////////////////////////
errlHndl_t getSbeInfoState(sbeTargetState_t& io_sbeState)
{
@@ -1965,7 +1999,25 @@ namespace SBE
/* Calculate CRC of the image */
/*******************************************/
size_t sbeImgSize = 0;
+
+
+ // get a pointer to the hcode for the .overlays
+ char* l_hCodeAddr = NULL;
+
+ err = sbeLoadHcode(l_hCodeAddr);
+
+ if(err)
+ {
+ TRACFCOMP( g_trac_sbe, ERR_MRK"ge() - "
+ "Error from sbeLoadHcode(), "
+ "RC=0x%X, PLID=0x%lX",
+ ERRL_GETRC_SAFE(err),
+ ERRL_GETPLID_SAFE(err));
+ break;
+ }
+
err = procCustomizeSbeImg(io_sbeState.target,
+ l_hCodeAddr, // HCODE in memory
sbeHbblImgPtr, //SBE, HBBL in memory
sbeHbblImgSize,
reinterpret_cast<void*>
@@ -1982,6 +2034,8 @@ namespace SBE
break;
}
+
+
// Verify that HW Key Hash is included in customized image
SHA512_t hash = {0};
err = getHwKeyHashFromSbeImage(io_sbeState.target, // ignored
@@ -3800,6 +3854,14 @@ namespace SBE
TRACFCOMP( g_trac_sbe, ERR_MRK,"createSbeImageVmmSpace() - Error from loadSecureSection(PNOR::HB_BOOTLOADER)");
break;
}
+
+ err = loadSecureSection(PNOR::HCODE);
+
+ if (err)
+ {
+ TRACFCOMP( g_trac_sbe, ERR_MRK,"createSbeImageVmmSpace() - Error from loadSecureSection(PNOR::HCODE)");
+ break;
+ }
#endif
}while(0);
@@ -3911,6 +3973,13 @@ namespace SBE
TRACFCOMP( g_trac_sbe, ERR_MRK,"cleanupSbeImageVmmSpace() - Error from unloadSecureSection(PNOR::HB_BOOTLOADER)");
break;
}
+ err = unloadSecureSection(PNOR::HCODE);
+ if (err)
+ {
+ TRACFCOMP( g_trac_sbe, ERR_MRK,"cleanupSbeImageVmmSpace() - Error from unloadSecureSection(PNOR::HCODE)");
+ break;
+ }
+
#endif
}while(0);
OpenPOWER on IntegriCloud