diff options
-rw-r--r-- | src/bootloader/bl_start.S | 23 | ||||
-rw-r--r-- | src/bootloader/bl_terminate.C | 3 | ||||
-rw-r--r-- | src/bootloader/bootloader.C | 86 | ||||
-rw-r--r-- | src/build/debug/Hostboot/BlTrace.pm | 23 | ||||
-rw-r--r-- | src/include/bootloader/bootloader.H | 5 | ||||
-rw-r--r-- | src/include/bootloader/bootloader_data.H | 79 | ||||
-rw-r--r-- | src/include/bootloader/bootloader_trace.H | 8 | ||||
-rw-r--r-- | src/include/bootloader/bootloaderif.H | 12 | ||||
-rw-r--r-- | src/kernel/terminate.C | 8 |
9 files changed, 167 insertions, 80 deletions
diff --git a/src/bootloader/bl_start.S b/src/bootloader/bl_start.S index 60bfc1ccc..0105380b8 100644 --- a/src/bootloader/bl_start.S +++ b/src/bootloader/bl_start.S @@ -31,6 +31,8 @@ .set SBE_HB_PNORSIZEMB, sbe_hb_structures+6 ;// uint16_t .set SBE_HB_BLLOADSIZE, sbe_hb_structures+8 ;// uint64_t .set SBE_HB_SECUREACCESSBIT, sbe_hb_structures+16 ;// uint8_t +.set SBE_HB_XSCOMMMIOBAR, sbe_hb_structures+17 ;// uint64_t +.set SBE_HB_LPCMMIOBAR, sbe_hb_structures+25 ;// uint64_t .set HBBL_BASE_ADDRESS, base_load_address .set HBBL_END_ADDRESS, end_load_address .set HBBL_system_reset, 0x100 @@ -397,28 +399,7 @@ switchToHBB: kernel_other_thread_spinlock: .space 8 - ;// @name bootloader_trace_index - ;// @brief Index for Bootloader Trace entries - ;// One-byte index for next entry to use in bootloader_trace. -.global bootloader_trace_index -bootloader_trace_index: - .space 1 - .balign 16 - ;// @name bootloader_trace - ;// @brief Buffer for Bootloader Trace data - ;// Buffer with bootloader trace entries. There are 64 one-byte entries - ;// in the buffer. They are used to track events that have occurred in - ;// the bootloader code. After all entries have been used, the buffer - ;// wraps and the oldest entry is overwritten by the newest trace data. -.global bootloader_trace -bootloader_trace: - .space 64 - -.global bootloader_hbbSection -bootloader_hbbSection: - .space 32 - .global hbi_ImageId hbi_ImageId: .space 128 diff --git a/src/bootloader/bl_terminate.C b/src/bootloader/bl_terminate.C index e0721bc37..9f639d7bb 100644 --- a/src/bootloader/bl_terminate.C +++ b/src/bootloader/bl_terminate.C @@ -28,6 +28,9 @@ #define bl_terminate_C +// Redefine kernel_TIDataArea to use space in Bootloader data +#define kernel_TIDataArea Bootloader::g_blData->bl_TIDataArea + #include <../kernel/terminate.C> #define UINT64_HIGH(data) ((data & 0xFFFFFFFF00000000) >> 32) diff --git a/src/bootloader/bootloader.C b/src/bootloader/bootloader.C index 13e58b8b9..cbdcb0ce2 100644 --- a/src/bootloader/bootloader.C +++ b/src/bootloader/bootloader.C @@ -49,10 +49,9 @@ #include <pnor/pnorif.H> -extern uint64_t kernel_other_thread_spinlock; -extern PNOR::SectionData_t bootloader_hbbSection; extern char bootloader_end_address; + namespace Bootloader{ /** * @brief Pointer to bootloader scratch space @@ -60,13 +59,15 @@ namespace Bootloader{ * Pointer to location in main storage which bootloader uses as * scratch space */ - uint8_t *g_blScratchSpace = NULL; - - // Global Object that will be stored where the SBE HB structure indicates - BlToHbData g_blToHbData; + uint8_t *g_blScratchSpace = nullptr; - // Global bool indicating if the secureROM is valid. Toggles verification. - bool g_secureRomValid = false; + /** + * @brief Pointer to bootloader external data + * + * Pointer to location in main storage which bootloader uses for + * storing data + */ + blData_t *g_blData = nullptr; /** * @brief Set Secureboot Config Data structure so it is accessible via @@ -86,7 +87,8 @@ namespace Bootloader{ // Ensure SBE to Bootloader structure has the SAB member if (l_blConfigData->version >= SAB_ADDED) { - g_blToHbData.secureAccessBit = l_blConfigData->secureAccessBit; + g_blData->blToHbData.secureAccessBit = + l_blConfigData->secureAccessBit; } // Find secure ROM addr @@ -101,10 +103,10 @@ namespace Bootloader{ // Create BlToHbData // Set Rom Size - memcpy (&g_blToHbData.secureRomSize, + memcpy (&g_blData->blToHbData.secureRomSize, l_pRomStart, - sizeof(g_blToHbData.secureRomSize)); - l_pRomStart += sizeof(g_blToHbData.secureRomSize); + sizeof(g_blData->blToHbData.secureRomSize)); + l_pRomStart += sizeof(g_blData->blToHbData.secureRomSize); // Get Secure ROM info const auto l_pSecRomInfo = reinterpret_cast<const SecureRomInfo*>( @@ -115,27 +117,43 @@ namespace Bootloader{ { // Store valid check local to bootloader, as another validation // is required in code outside the bootloader. - g_secureRomValid = true; + g_blData->secureRomValid = true; - g_blToHbData.eyeCatch = BLTOHB_EYECATCHER; - g_blToHbData.version = BLTOHB_SAB; - g_blToHbData.branchtableOffset = l_pSecRomInfo->branchtableOffset; - g_blToHbData.secureRom = l_pRomStart; + g_blData->blToHbData.eyeCatch = BLTOHB_EYECATCHER; + if (l_blConfigData->version == BLTOHB_SAB + 1 /* MMIO_BARS_ADDED @TODO RTC:173526*/ ) + { + g_blData->blToHbData.version = BLTOHB_MMIOBARS; + } + else + { + g_blData->blToHbData.version = BLTOHB_SAB; + } + g_blData->blToHbData.branchtableOffset = + l_pSecRomInfo->branchtableOffset; + g_blData->blToHbData.secureRom = l_pRomStart; // Set HW key hash pointer (20K - 64 bytes) and size - g_blToHbData.hwKeysHash = reinterpret_cast<const void *> + g_blData->blToHbData.hwKeysHash = reinterpret_cast<const void *> (HW_KEYS_HASH_ADDR); - g_blToHbData.hwKeysHashSize = SHA512_DIGEST_LENGTH; + g_blData->blToHbData.hwKeysHashSize = SHA512_DIGEST_LENGTH; // Set HBB header and size - g_blToHbData.hbbHeader = i_pHbbSrc; - g_blToHbData.hbbHeaderSize = PAGE_SIZE; + g_blData->blToHbData.hbbHeader = i_pHbbSrc; + g_blData->blToHbData.hbbHeaderSize = PAGE_SIZE; + + // Set the MMIO BAR information if appropriate + if (l_blConfigData->version >= BLTOHB_SAB + 1 /* MMIO_BARS_ADDED @TODO RTC:173526*/ ) + { + g_blData->blToHbData.xscomBAR = 0 /* l_blConfigData->xscomBAR @TODO RTC:173526*/ ; + g_blData->blToHbData.lpcBAR = 0 /* l_blConfigData->lpcBAR @TODO RTC:173526*/ ; + } + } // Place structure into proper location for HB to find memcpy(reinterpret_cast<void *>(BLTOHB_COMM_DATA_ADDR | IGNORE_HRMOR_MASK), - &g_blToHbData, + &g_blData->blToHbData, sizeof(BlToHbData)); } @@ -157,13 +175,13 @@ namespace Bootloader{ uint64_t l_rc = 0; // Check if Secure Access Bit is set - if (!g_blToHbData.secureAccessBit) + if (!g_blData->blToHbData.secureAccessBit) { BOOTLOADER_TRACE(BTLDR_TRC_MAIN_VERIFY_SAB_UNSET); } // # @TODO RTC:170136 terminate in this case // Ensure SecureRom is actually present - else if ( !g_secureRomValid ) + else if ( !g_blData->secureRomValid ) { BOOTLOADER_TRACE(BTLDR_TRC_MAIN_VERIFY_NO_EYECATCH); } @@ -177,9 +195,9 @@ namespace Bootloader{ { // Set startAddr to ROM_verify() function at an offset of Secure ROM uint64_t l_rom_verify_startAddr = - reinterpret_cast<const uint64_t>(g_blToHbData.secureRom) - + g_blToHbData.branchtableOffset - + ROM_VERIFY_FUNCTION_OFFSET; + reinterpret_cast<const uint64_t>(g_blData->blToHbData.secureRom) + + g_blData->blToHbData.branchtableOffset + + ROM_VERIFY_FUNCTION_OFFSET; // Declare local input struct ROM_hw_params l_hw_parms; @@ -189,7 +207,7 @@ namespace Bootloader{ memset(&l_hw_parms, 0, sizeof(ROM_hw_params)); // Use current hw hash key - memcpy (&l_hw_parms.hw_key_hash, g_blToHbData.hwKeysHash, + memcpy (&l_hw_parms.hw_key_hash, g_blData->blToHbData.hwKeysHash, sizeof(sha2_hash_t)); const auto l_container = reinterpret_cast<const ROM_container_raw*> @@ -235,7 +253,8 @@ namespace Bootloader{ int main() { // Initialization - bootloader_trace_index = 0; + g_blData = reinterpret_cast<blData_t *>(HBBL_DATA_ADDR); + g_blData->bl_trace_index = 0; BOOTLOADER_TRACE(BTLDR_TRC_MAIN_START); //Set core scratch 3 to say bootloader is active @@ -256,11 +275,12 @@ namespace Bootloader{ uint32_t l_errCode = PNOR::NO_ERROR; uint8_t l_tocUsed = 0; g_blScratchSpace = reinterpret_cast<uint8_t*>(HBBL_SCRATCH_SPACE_ADDR); + g_blData->secureRomValid = false; // Get location of HB base code in PNOR from TOC // @TODO RTC:138268 Support multiple sides of PNOR in bootloader bl_pnorAccess::getHBBSection(l_pnorEnd, - bootloader_hbbSection, + g_blData->bl_hbbSection, l_errCode, l_tocUsed, l_pnorStart); @@ -269,12 +289,12 @@ namespace Bootloader{ if(PNOR::NO_ERROR == l_errCode) { // get hbbFlashOffset - uint64_t l_hbbFlashOffset = bootloader_hbbSection.flashAddr; + uint64_t l_hbbFlashOffset = g_blData->bl_hbbSection.flashAddr; // get hbbLength without size of ECC data - uint32_t l_hbbLength = bootloader_hbbSection.size; + uint32_t l_hbbLength = g_blData->bl_hbbSection.size; // get hbbEcc bool l_hbbEcc = - ( bootloader_hbbSection.integrity == FFS_INTEG_ECC_PROTECT); + ( g_blData->bl_hbbSection.integrity == FFS_INTEG_ECC_PROTECT); // Copy HB base code from PNOR to working location handleMMIO(l_pnorStart + l_hbbFlashOffset, diff --git a/src/build/debug/Hostboot/BlTrace.pm b/src/build/debug/Hostboot/BlTrace.pm index 6a867f3de..1a3ee0ec2 100644 --- a/src/build/debug/Hostboot/BlTrace.pm +++ b/src/build/debug/Hostboot/BlTrace.pm @@ -129,30 +129,25 @@ sub main { ::setBootloader(); - my $btLdrHrmor = 0x0000000008200000; + my $dataAddr = 0x0000000008208000; - my ($indexAddr, $indexSize) = ::findSymbolAddress("bootloader_trace_index"); - if (not defined $indexAddr) { ::userDisplay "Cannot find symbol.\n"; die; } - - my $addr = $indexAddr + $btLdrHrmor; - ::sendIPCMsg("read-data", "$addr,1"); # Trace index is 1 byte + my $indexAddr = $dataAddr + 64; + ::sendIPCMsg("read-data", "$indexAddr,1"); # Trace index is 1 byte my ($type1, $index) = ::recvIPCMsg(); $index =~ s/\0+//g; #strip off nulls my $indexStr = sprintf("0x%02X", ord($index)); - my ($traceAddr, $traceSize) = ::findSymbolAddress("bootloader_trace"); - if (not defined $traceAddr) { ::userDisplay "Cannot find symbol.\n"; die; } + ::userDisplay "\n------------Bootloader Trace------------"; + ::userDisplay "\nNext Entry Index: "; + ::userDisplay $indexStr; - $addr = $traceAddr + $btLdrHrmor; - my $traceAddrStr = sprintf("0x%08X", $addr); - ::sendIPCMsg("read-data", "$addr,64"); # Trace buffer is 64 bytes + my $traceAddr = $dataAddr; + my $traceAddrStr = sprintf("0x%08X", $traceAddr); + ::sendIPCMsg("read-data", "$traceAddr,64"); # Trace buffer is 64 bytes my ($type2, $trace) = ::recvIPCMsg(); $trace =~ s/\0+//g; #strip off nulls my $traceData = formatTrace($trace); - ::userDisplay "------------Bootloader Trace------------"; - ::userDisplay "\nNext Entry Index: "; - ::userDisplay $indexStr; ::userDisplay "\n\nTrace Buffer Address: "; ::userDisplay $traceAddrStr; ::userDisplay "\n\nTrace Data:\n"; diff --git a/src/include/bootloader/bootloader.H b/src/include/bootloader/bootloader.H index 81515d4b9..ddd39bb0b 100644 --- a/src/include/bootloader/bootloader.H +++ b/src/include/bootloader/bootloader.H @@ -40,6 +40,7 @@ #include <kernel/hbterminatetypes.H> #include <bootloader/bootloaderif.H> #include <bootloader/bootloader_trace.H> +#include <bootloader/bootloader_data.H> #include <bootloader/hbblreasoncodes.H> extern "C" void task_end_stub(); @@ -225,6 +226,10 @@ namespace Bootloader{ /** Location of working copy of HBB without ECC */ #define HBB_WORKING_ADDR (getHRMOR() - ( 1*MEGABYTE)) + /** Location of HBBL data */ +#define HBBL_DATA_ADDR (getHRMOR() + HBBL_EXCEPTION_VECTOR_SIZE \ + + MAX_HBBL_SIZE) + /** Location of HBBL scratch space */ #define HBBL_SCRATCH_SPACE_ADDR (getHRMOR() + (64*KILOBYTE)) diff --git a/src/include/bootloader/bootloader_data.H b/src/include/bootloader/bootloader_data.H new file mode 100644 index 000000000..a28ea74cd --- /dev/null +++ b/src/include/bootloader/bootloader_data.H @@ -0,0 +1,79 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/bootloader/bootloader_data.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2017 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ + +#ifndef __BOOTLOADER_DATA_H +#define __BOOTLOADER_DATA_H + +/** + * @file bootloader_data.H + * + * Data struct for Bootloader data placed outside of Bootloader image. + */ + +#include <bootloader/bootloader_trace.H> +#include <bootloader/bootloaderif.H> +#include <bootloader/bl_pnorAccess.H> +#include <kernel/hbterminatetypes.H> + + +namespace Bootloader{ + typedef struct blData + { + // @name bl_trace + // @brief Buffer for Bootloader Trace data + // Buffer with bootloader trace entries. There are 64 one-byte entries + // in the buffer. They are used to track events that have occurred in + // the bootloader code. After all entries have been used, the buffer + // wraps and the oldest entry is overwritten by the newest trace data. + uint8_t bl_trace[BOOTLOADER_TRACE_SIZE]; + + // @name bl_trace_index + // @brief Index for Bootloader Trace entries + // One-byte index for next entry to use in bootloader_trace. + uint8_t bl_trace_index; + + // Object that will be stored where the SBE HB structure indicates + BlToHbData blToHbData; + + // Bool indicating if the secureROM is valid. Toggles verification. + bool secureRomValid; + + // Buffer to save HBB PNOR section data + PNOR::SectionData_t bl_hbbSection; + + // Instance of the TI Data Area + HB_TI_DataArea bl_TIDataArea; + } blData_t; + + /** + * @brief Pointer to bootloader external data + * + * Pointer to location in main storage which bootloader uses for + * storing data + */ + extern blData_t *g_blData; +} // end namespace Bootloader + +#endif diff --git a/src/include/bootloader/bootloader_trace.H b/src/include/bootloader/bootloader_trace.H index 2747e0d97..df6887890 100644 --- a/src/include/bootloader/bootloader_trace.H +++ b/src/include/bootloader/bootloader_trace.H @@ -38,8 +38,7 @@ #define BOOTLOADER_TRACE_SIZE 64 #endif -extern uint8_t bootloader_trace_index; -extern uint8_t bootloader_trace[BOOTLOADER_TRACE_SIZE]; +#include <bootloader/bootloader_data.H> // include after trace size is set /** @enum BootloaderTraces * @brief List of Hostboot Bootloader Trace values. @@ -187,8 +186,9 @@ enum BootloaderTraces #ifndef BOOTLOADER_TRACE #define BOOTLOADER_TRACE(trace_value) \ { \ - bootloader_trace[bootloader_trace_index++] = trace_value; \ - bootloader_trace_index %= BOOTLOADER_TRACE_SIZE; \ + Bootloader::g_blData->bl_trace[Bootloader::g_blData->bl_trace_index++] = \ + trace_value; \ + Bootloader::g_blData->bl_trace_index %= BOOTLOADER_TRACE_SIZE; \ lwsync(); \ } #endif diff --git a/src/include/bootloader/bootloaderif.H b/src/include/bootloader/bootloaderif.H index e4d422d20..9c7b73201 100644 --- a/src/include/bootloader/bootloaderif.H +++ b/src/include/bootloader/bootloaderif.H @@ -53,8 +53,9 @@ const uint64_t BLTOHB_EYECATCHER = 0x23626C746F686200; // #BLTOHB\0 enum BlToHbDataVersion { // [release:4][version:4] - BLTOHB_INIT = 0x0000000900000001, - BLTOHB_SAB = 0x0000000900000002 + BLTOHB_INIT = 0x0000000900000001, + BLTOHB_SAB = 0x0000000900000002, + BLTOHB_MMIOBARS = 0x0000000900000003 }; @@ -73,7 +74,8 @@ struct BlToHbData branchtableOffset(0), secureRom(nullptr), secureRomSize(0), hwKeysHash(nullptr), hwKeysHashSize(0), hbbHeader(nullptr), - hbbHeaderSize(0), secureAccessBit(false) {} + hbbHeaderSize(0), secureAccessBit(false), + xscomBAR(0), lpcBAR(0) {} // Simple way to tell if data is valid uint64_t eyeCatch; @@ -95,6 +97,10 @@ struct BlToHbData size_t hbbHeaderSize; // Secure Access Bit bool secureAccessBit; + // XSCOM MMIO BAR + uint64_t xscomBAR; + // LPC MMIO BAR + uint64_t lpcBAR; } __attribute__((packed)); /** diff --git a/src/kernel/terminate.C b/src/kernel/terminate.C index dd908b4e7..9b3fb7278 100644 --- a/src/kernel/terminate.C +++ b/src/kernel/terminate.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* Contributors Listed Below - COPYRIGHT 2012,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -38,6 +38,7 @@ extern "C" void p8_force_attn() NO_RETURN; +#ifndef bl_terminate_C /* Instance of the TI Data Area */ HB_TI_DataArea kernel_TIDataArea; @@ -45,13 +46,10 @@ HB_TI_DataArea kernel_TIDataArea; HB_Descriptor kernel_hbDescriptor = { &kernel_TIDataArea, -#ifndef bl_terminate_C &KernelIpc::ipc_data_area, -#else - NULL, -#endif // bl_terminate_C 0 }; +#endif // bl_terminate_C |