diff options
| author | Stephen Cprek <smcprek@us.ibm.com> | 2017-06-22 16:50:25 -0500 |
|---|---|---|
| committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-07-20 15:54:41 -0400 |
| commit | 22d6e4636c815eecdcf778c417ef217e32878fba (patch) | |
| tree | 0e709eee941452f3d5b1b7b43b6257587d97d90d /src | |
| parent | 6744879ceba92b2b2a060cff929bfaaf5d26d762 (diff) | |
| download | blackbird-hostboot-22d6e4636c815eecdcf778c417ef217e32878fba.tar.gz blackbird-hostboot-22d6e4636c815eecdcf778c417ef217e32878fba.zip | |
Handle Compatability issues for new BltoHbData location
Change-Id: I9ec35ca8dd513a5e31f69cd899fa5d1e00d41c63
RTC: 175114
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/42442
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com>
Reviewed-by: Martin Gloff <mgloff@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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/bootloader/bootloader.C | 4 | ||||
| -rw-r--r-- | src/include/bootloader/bootloader.H | 8 | ||||
| -rw-r--r-- | src/include/bootloader/bootloaderif.H | 14 | ||||
| -rw-r--r-- | src/kernel/kernel.C | 46 |
4 files changed, 56 insertions, 16 deletions
diff --git a/src/bootloader/bootloader.C b/src/bootloader/bootloader.C index d9b9b5eb7..295577e6e 100644 --- a/src/bootloader/bootloader.C +++ b/src/bootloader/bootloader.C @@ -164,8 +164,8 @@ namespace Bootloader{ g_blData->blToHbData.sizeOfStructure = sizeof(BlToHbData); } - // Place structure into proper location for HB to find - memcpy(reinterpret_cast<void *>(BLTOHB_COMM_DATA_ADDR | + // Place BlToHb into proper location for HB to find + memcpy(reinterpret_cast<void *>(BLTOHB_COMM_DATA_ADDR_LATEST | IGNORE_HRMOR_MASK), &g_blData->blToHbData, sizeof(BlToHbData)); diff --git a/src/include/bootloader/bootloader.H b/src/include/bootloader/bootloader.H index afe2acc71..f00927530 100644 --- a/src/include/bootloader/bootloader.H +++ b/src/include/bootloader/bootloader.H @@ -226,10 +226,10 @@ namespace Bootloader{ #define HW_KEYS_HASH_ADDR (getHRMOR() + HBBL_EXCEPTION_VECTOR_SIZE \ + MAX_HBBL_SIZE - 64) /** Location of working copy of HBB with ECC */ -#define HBB_ECC_WORKING_ADDR (getHRMOR() + ( 1*MEGABYTE)) +#define HBB_ECC_WORKING_ADDR (getHRMOR() - ( 1*MEGABYTE)) /** Location of working copy of HBB without ECC */ -#define HBB_WORKING_ADDR (getHRMOR() - ( 1*MEGABYTE)) +#define HBB_WORKING_ADDR (getHRMOR() + ( 1*MEGABYTE)) /** Location of HBBL data */ #define HBBL_DATA_ADDR (getHRMOR() + HBBL_EXCEPTION_VECTOR_SIZE \ @@ -238,10 +238,6 @@ namespace Bootloader{ /** Location of HBBL scratch space */ #define HBBL_SCRATCH_SPACE_ADDR (getHRMOR() + (64*KILOBYTE)) - /** Location of running copy of HBB */ -#define HBB_HRMOR (getHRMOR() - ( 2*MEGABYTE)) -#define HBB_RUNNING_ADDR (getHRMOR() - ( 2*MEGABYTE)) - /** Location of SBE HB communication area Defined in SBE code and bootloader.ld */ #define SBE_HB_COMM_ADDR (getHRMOR() + 0x4) diff --git a/src/include/bootloader/bootloaderif.H b/src/include/bootloader/bootloaderif.H index fc810dc4b..a418d047b 100644 --- a/src/include/bootloader/bootloaderif.H +++ b/src/include/bootloader/bootloaderif.H @@ -42,13 +42,21 @@ namespace Bootloader{ #define MAX_HBB_SIZE (512 * KILOBYTE) -// The Bootloader to Hostboot communication area exists after the working HBB +// Location of running copy of HBB #ifdef BOOTLOADER -#define BLTOHB_COMM_DATA_ADDR (getHRMOR() - ( 2*MEGABYTE) + MAX_HBB_SIZE) +#define HBB_HRMOR (getHRMOR() - ( 2*MEGABYTE)) +#define HBB_RUNNING_ADDR (getHRMOR() - ( 2*MEGABYTE)) #else -#define BLTOHB_COMM_DATA_ADDR (getHRMOR() + MAX_HBB_SIZE) +#define HBB_HRMOR (getHRMOR()) +#define HBB_RUNNING_ADDR (getHRMOR()) #endif +// Different Locations of BlToHBData struct over time. +// New values make "_LATEST" and switch current "_LATEST" to "V<N>" +// NOTE: Done this way to limit code space. +#define BLTOHB_COMM_DATA_ADDR_V1 (HBB_HRMOR + 512*KILOBYTE) +#define BLTOHB_COMM_DATA_ADDR_LATEST (HBB_HRMOR + MAX_HBB_SIZE) + // Expected BlToHbData eye catch const uint64_t BLTOHB_EYECATCHER = 0x23626C746F686200; // #BLTOHB\0 diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C index d5952374a..970813ec8 100644 --- a/src/kernel/kernel.C +++ b/src/kernel/kernel.C @@ -61,6 +61,43 @@ class Kernel Kernel() {}; }; + +/** + * @brief Searches multiple locations for the BlToHbData structure. + * + * @description Due to the possibility of a mismatch between the bootloader and + * hostboot, we must check every location of this structure in + * history. Searches latest to oldest. + * + * @return if found, pointer to structure + * otherwise nullptr + */ +const Bootloader::BlToHbData* getBlToHbData() +{ + const Bootloader::BlToHbData* l_resultBltoHbData = nullptr; + + // Order bootloader addr versions from most recent to oldest + // Note: Defined here to limit code space in bootloader code + static const std::array<uint64_t,2> BlToHbDataAddrs = + { + BLTOHB_COMM_DATA_ADDR_LATEST, + BLTOHB_COMM_DATA_ADDR_V1 + }; + + for (auto addr : BlToHbDataAddrs) + { + const auto l_bltoHbData = + reinterpret_cast<const Bootloader::BlToHbData*>(addr); + if(Bootloader::BlToHbDataValid(l_bltoHbData)) + { + l_resultBltoHbData = l_bltoHbData; + break; + } + } + + return l_resultBltoHbData; +} + extern "C" int main() { @@ -75,13 +112,12 @@ int main() Kernel& kernel = Singleton<Kernel>::instance(); kernel.cppBootstrap(); - // Get pointer to BL and HB comm data - const auto l_pBltoHbData = reinterpret_cast<const Bootloader::BlToHbData*>( - BLTOHB_COMM_DATA_ADDR); - if ( Bootloader::BlToHbDataValid(l_pBltoHbData) ) + // Get pointer to BL and HB comm data + const auto l_pBltoHbData = getBlToHbData(); + if ( l_pBltoHbData != nullptr ) { - printk("BL to HB comm valid\n"); + printk("Valid BlToHbData found at 0x%lX\n", reinterpret_cast<uint64_t>(l_pBltoHbData)); // Initialize Secureboot Data class g_BlToHbDataManager.initValid(*l_pBltoHbData); } |

