summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStephen Cprek <smcprek@us.ibm.com>2017-06-22 16:50:25 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-07-20 15:54:41 -0400
commit22d6e4636c815eecdcf778c417ef217e32878fba (patch)
tree0e709eee941452f3d5b1b7b43b6257587d97d90d /src
parent6744879ceba92b2b2a060cff929bfaaf5d26d762 (diff)
downloadblackbird-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.C4
-rw-r--r--src/include/bootloader/bootloader.H8
-rw-r--r--src/include/bootloader/bootloaderif.H14
-rw-r--r--src/kernel/kernel.C46
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);
}
OpenPOWER on IntegriCloud