From d53d9f226aaa8080eb65717ae895dac06a855bf8 Mon Sep 17 00:00:00 2001 From: crgeddes Date: Wed, 9 Aug 2017 13:42:03 -0500 Subject: Pass Key-Addr info through bootloader RTC: 165369 Change-Id: If15f6ccc7a7c3649b8352467ae10173a15f3f501 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44426 Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Tested-by: Jenkins OP Build CI Reviewed-by: Matt Derksen Reviewed-by: Martin Gloff Tested-by: Jenkins OP HW Reviewed-by: Daniel M. Crowell --- src/bootloader/bootloader.C | 32 +++++++++++++++++++++++++++++--- src/build/debug/Hostboot/BlData.pm | 2 +- src/include/bootloader/bootloader_data.H | 2 +- src/include/bootloader/bootloaderif.H | 29 ++++++++++++++++++++++++++++- src/include/kernel/bltohbdatamgr.H | 7 +++++++ src/kernel/bltohbdatamgr.C | 12 ++++++++++++ 6 files changed, 78 insertions(+), 6 deletions(-) diff --git a/src/bootloader/bootloader.C b/src/bootloader/bootloader.C index f3ba3d525..55969fa0b 100644 --- a/src/bootloader/bootloader.C +++ b/src/bootloader/bootloader.C @@ -110,6 +110,9 @@ namespace Bootloader{ switch(l_blConfigData->version) { // Add cases as additional versions are created + case ADDR_STASH_SUPPORT_ADDED: + g_blData->blToHbData.version = BLTOHB_KEYADDR; + break; default: g_blData->blToHbData.version = BLTOHB_SIZE; break; @@ -147,15 +150,33 @@ namespace Bootloader{ // Set Bootloader preceived size of structure g_blData->blToHbData.sizeOfStructure = sizeof(BlToHbData); } + } + + void setKeyAddrMapData(const void * i_pHbbSrc) + { + // Read SBE HB shared data. + const auto l_blConfigData = reinterpret_cast( + SBE_HB_COMM_ADDR); + // Set copy keyaddr stash data + // Ensure SBE to Bootloader structure has key addr stash info + if (l_blConfigData->version >= ADDR_STASH_SUPPORT_ADDED) + { + memcpy(&g_blData->blToHbData.keyAddrStashData, + &l_blConfigData->pair, + sizeof(keyAddrPair_t)); + } + } + + void copyBlToHbtoHbLocation() + { // Place BlToHb into proper location for HB to find memcpy(reinterpret_cast(BLTOHB_COMM_DATA_ADDR_LATEST | IGNORE_HRMOR_MASK), - &g_blData->blToHbData, - sizeof(BlToHbData)); + &g_blData->blToHbData, + sizeof(BlToHbData)); } - /** * @brief Verify Container against system hash keys * @@ -366,6 +387,11 @@ namespace Bootloader{ // Get Secure Data from SBE HBBL communication area setSecureData(l_src_addr); + // Get Key-Addr Mapping from SBE HBBL communication area + setKeyAddrMapData(l_src_addr); + + copyBlToHbtoHbLocation(); + // ROM verification of HBB image verifyContainer(l_src_addr); diff --git a/src/build/debug/Hostboot/BlData.pm b/src/build/debug/Hostboot/BlData.pm index 76dc6875f..0a4b91329 100644 --- a/src/build/debug/Hostboot/BlData.pm +++ b/src/build/debug/Hostboot/BlData.pm @@ -208,7 +208,7 @@ sub main my $blToHbAddr = $dataAddr + $dataOffset; my $blToHbAddrStr = sprintf("0x%08X", $blToHbAddr); - my $blToHbSize = 99; + my $blToHbSize = 171; my $blToHb = ::readData($blToHbAddr,$blToHbSize); my $blToHbData = formatData($blToHb); $dataOffset += ::alignUp($blToHbSize, 16); diff --git a/src/include/bootloader/bootloader_data.H b/src/include/bootloader/bootloader_data.H index 0e65e6408..2e302c20a 100644 --- a/src/include/bootloader/bootloader_data.H +++ b/src/include/bootloader/bootloader_data.H @@ -91,7 +91,7 @@ namespace Bootloader{ // Object that will be stored where the SBE HB structure indicates BlToHbData blToHbData; uint8_t bl_reserved5[(512 - sizeof(BlToHbData)) % 16]; - static_assert( sizeof(BlToHbData) == 99, "BlToHbData " + static_assert( sizeof(BlToHbData) == 171, "BlToHbData " "size changed. Check bootloader_data.H alignment. " "Fix BlData.pm processing."); } blData_t; diff --git a/src/include/bootloader/bootloaderif.H b/src/include/bootloader/bootloaderif.H index 82410235d..38b155230 100644 --- a/src/include/bootloader/bootloaderif.H +++ b/src/include/bootloader/bootloaderif.H @@ -43,6 +43,9 @@ namespace Bootloader{ // Size of PNOR partition without ECC, page algined down, minus 4K header #define MAX_HBB_SIZE (904 * KILOBYTE) +// Max Pairs +#define MAX_ROW_COUNT 8 + // Location of running copy of HBB #ifdef BOOTLOADER #define HBB_HRMOR (getHRMOR() - ( 2*MEGABYTE)) @@ -70,6 +73,7 @@ enum BlToHbDataVersion BLTOHB_MMIOBARS = 0x0000000900000003, BLTOHB_SECURE_OVERRIDES = 0x0000000900000004, BLTOHB_SIZE = 0x0000000900000005, + BLTOHB_KEYADDR = 0x0000000900000006, }; enum @@ -79,6 +83,27 @@ enum INITIAL_BLTOHB_PADDED_SIZE = 256 }; + +//----------------------------------------------------------------------------------- +// Structure definitions +//----------------------------------------------------------------------------------- + + +// To keep all the Stashed Keys & Addrs together within this struct +struct keyAddrPair_t +{ + keyAddrPair_t(uint8_t initVal) { + for(uint8_t i=0; i < MAX_ROW_COUNT; i++) + { + key[i] = initVal; + addr[i] = initVal; + } + } + uint8_t key[MAX_ROW_COUNT]; + uint64_t addr[MAX_ROW_COUNT]; +} __attribute__((packed)); + + /** @struct BlToHbData * @brief Shared data between bootloader and Hostboot. * @@ -98,7 +123,7 @@ struct BlToHbData xscomBAR(MMIO_GROUP0_CHIP0_XSCOM_BASE_ADDR), lpcBAR(MMIO_GROUP0_CHIP0_LPC_BASE_ADDR), securityOverride(0), allowAttrOverrides(0), - sizeOfStructure(0) {} + sizeOfStructure(0), keyAddrStashData(0) {} // Simple way to tell if data is valid uint64_t eyeCatch; @@ -130,6 +155,8 @@ struct BlToHbData bool allowAttrOverrides; // Size of this structure (Use for backwards compatibility) size_t sizeOfStructure; + //keyAddr stash data + keyAddrPair_t keyAddrStashData; } __attribute__((packed)); /** diff --git a/src/include/kernel/bltohbdatamgr.H b/src/include/kernel/bltohbdatamgr.H index 42ded91cc..cbbdb40d2 100644 --- a/src/include/kernel/bltohbdatamgr.H +++ b/src/include/kernel/bltohbdatamgr.H @@ -210,6 +210,13 @@ class BlToHbDataManager * @return size_t BlToHbData size */ const size_t getBlToHbDataSize() const; + + /* + * @brief Returns internal BlToHbData keyAddr pairs + * + * @return keyAddrPair_t Key Address Pairs Struct + */ + const Bootloader::keyAddrPair_t getKeyAddrPairs() const; }; // Extern global instance of the class diff --git a/src/kernel/bltohbdatamgr.C b/src/kernel/bltohbdatamgr.C index 537958214..3d33715b2 100644 --- a/src/kernel/bltohbdatamgr.C +++ b/src/kernel/bltohbdatamgr.C @@ -182,6 +182,13 @@ printk("lpc=%lX, xscom=%lX, iv_data=%p\n", iv_data.lpcBAR, iv_data.xscomBAR, iv_data.sizeOfStructure = Bootloader::INITIAL_BLTOHB_PADDED_SIZE; } + if(iv_data.version >= Bootloader::BLTOHB_KEYADDR) + { + memcpy(&iv_data.keyAddrStashData, + &i_data.keyAddrStashData, + sizeof(Bootloader::keyAddrPair_t)); + } + // Size of data that needs to be preserved and pinned. iv_preservedSize = ALIGN_PAGE(iv_data.secureRomSize + iv_data.hwKeysHashSize + @@ -346,6 +353,11 @@ const uint64_t BlToHbDataManager::getXscomBAR() const return reinterpret_cast(iv_data.xscomBAR); } +const Bootloader::keyAddrPair_t BlToHbDataManager::getKeyAddrPairs() const +{ + return iv_data.keyAddrStashData; +} + const size_t BlToHbDataManager::getBlToHbDataSize() const { return iv_data.sizeOfStructure; -- cgit v1.2.1