diff options
Diffstat (limited to 'src/usr')
-rw-r--r-- | src/usr/isteps/istep15/host_build_stop_image.C | 8 | ||||
-rw-r--r-- | src/usr/isteps/pm/pm_common.C | 6 | ||||
-rw-r--r-- | src/usr/sbe/sbe_update.C | 69 |
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); |