diff options
-rw-r--r-- | src/bootloader/bl_pnorAccess.C | 20 | ||||
-rw-r--r-- | src/bootloader/bl_start.S | 122 | ||||
-rw-r--r-- | src/bootloader/bl_terminate.C | 30 | ||||
-rw-r--r-- | src/bootloader/bootloader.C | 18 | ||||
-rw-r--r-- | src/build/debug/Hostboot/BlData.pm | 4 | ||||
-rw-r--r-- | src/include/bootloader/bootloader.H | 29 | ||||
-rw-r--r-- | src/include/bootloader/bootloader_data.H | 24 | ||||
-rw-r--r-- | src/include/bootloader/bootloader_trace.H | 4 |
8 files changed, 147 insertions, 104 deletions
diff --git a/src/bootloader/bl_pnorAccess.C b/src/bootloader/bl_pnorAccess.C index 2d924e1a6..5a7076afd 100644 --- a/src/bootloader/bl_pnorAccess.C +++ b/src/bootloader/bl_pnorAccess.C @@ -193,7 +193,7 @@ void bl_pnorAccess::readTOC(uint8_t i_tocBuffer[PNOR::TOC_SIZE], void bl_pnorAccess::findTOC(uint64_t i_pnorEnd, PNOR::SectionData_t * o_TOC, uint32_t& o_errCode, uint64_t& o_pnorStart) { - uint8_t *l_tocBuffer = Bootloader::g_blScratchSpace; + uint8_t *l_tocBuffer = g_blScratchSpace; //The first TOC is 1 TOC size + 1 page back from the end of the flash (+ 1) uint64_t l_mmioAddr = i_pnorEnd - PNOR::TOC_OFFSET_FROM_TOP_OF_FLASH; @@ -228,27 +228,23 @@ void bl_pnorAccess::findTOC(uint64_t i_pnorEnd, PNOR::SectionData_t * o_TOC, l_mmioAddr = o_pnorStart; // Reset saved trace index - Bootloader::g_blData->bl_trace_index_saved = - BOOTLOADER_TRACE_SIZE; + g_blData->bl_trace_index_saved = BOOTLOADER_TRACE_SIZE; } else { // Check if a trace index is not saved - if(Bootloader::g_blData->bl_trace_index_saved >= - BOOTLOADER_TRACE_SIZE) + if(g_blData->bl_trace_index_saved >= BOOTLOADER_TRACE_SIZE) { // Save trace index for future passes through loop - Bootloader::g_blData->bl_trace_index_saved = - Bootloader::g_blData->bl_trace_index; + g_blData->bl_trace_index_saved = g_blData->bl_trace_index; // Save this PNOR MMIO address - Bootloader::g_blData->bl_first_pnor_mmio = l_mmioAddr; + g_blData->bl_first_pnor_mmio = l_mmioAddr; } else // A trace index was saved { // Replace trace index, reuse trace entries for this loop - Bootloader::g_blData->bl_trace_index = - Bootloader::g_blData->bl_trace_index_saved; + g_blData->bl_trace_index = g_blData->bl_trace_index_saved; } // Adjust to new location in PNOR flash for next MMIO @@ -256,12 +252,12 @@ void bl_pnorAccess::findTOC(uint64_t i_pnorEnd, PNOR::SectionData_t * o_TOC, l_mmioAddr -= PAGESIZE; // Increment loop counter - Bootloader::g_blData->bl_pnor_loop_count++; + g_blData->bl_pnor_loop_count++; } // Check that address is still in FW space if(l_mmioAddr < - (Bootloader::g_blData->blToHbData.lpcBAR + LPC::LPCHC_FW_SPACE)) + (g_blData->blToHbData.lpcBAR + LPC::LPCHC_FW_SPACE)) { BOOTLOADER_TRACE_W_BRK(BTLDR_TRC_PA_FINDTOC_READTOC_ERR); diff --git a/src/bootloader/bl_start.S b/src/bootloader/bl_start.S index b8da64ae1..343d84263 100644 --- a/src/bootloader/bl_start.S +++ b/src/bootloader/bl_start.S @@ -26,16 +26,19 @@ .include "kernel/ppcconsts.S" -.set SBE_HB_VERSION, sbe_hb_structures ;// uint32_t -.set SBE_HB_SBEBOOTSIDE, sbe_hb_structures+4 ;// uint8_t -.set SBE_HB_PNORBOOTSIDE, sbe_hb_structures+5 ;// uint8_t -.set SBE_HB_PNORSIZEMB, sbe_hb_structures+6 ;// uint16_t +# .set SBE_HB_VERSION, sbe_hb_structures ;// uint32_t +# .set SBE_HB_SBEBOOTSIDE, sbe_hb_structures+4 ;// uint8_t +# .set SBE_HB_PNORBOOTSIDE, sbe_hb_structures+5 ;// uint8_t +# .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 SBE_HB_SECUREACCESSBIT, sbe_hb_structures+16 ;// uint8_t +# .set SBE_HB_XSCOMMMIOBAR, sbe_hb_structures+24 ;// uint64_t +# .set SBE_HB_LPCMMIOBAR, sbe_hb_structures+32 ;// uint64_t .set HBBL_BASE_ADDRESS, base_load_address .set HBBL_END_ADDRESS, end_load_address +.set HBBL_DATA_ADDR_OFFSET, 0x00008000 ;// offset of external data +.set HBBL_TI_OFFSET, 0x50 ;// offset within external data +.set HBBL_SCRATCH_ADDR_OFFSET, 0x00010000 ;// offset of scratch space .set HBBL_system_reset, 0x100 .set HBBL_machine_check, 0x200 .set HBBL_data_storage, 0x300 @@ -98,7 +101,69 @@ _main: lis r1, _start@h addis r1, r1, 1 ;// 64k (1 * 0x10000) + ;// Save HRMOR in r11 for use in multiple places + mfspr r11, HRMOR ;// save HRMOR + + ;// Do dcbz from end of Bootloader load to end of HBB ECC working space +_dcbz_after_bl: + lis r5, SBE_HB_BLLOADSIZE@h + ori r5, r5, SBE_HB_BLLOADSIZE@l + ld r5, 0(r5) ;// get ending EA from SBE HB structure + lis r6, 0 + addis r6, r6, 32 ;// 2M (32 * 0x10000) + addi r6, r6, -1 ;// end before 2M +_dcbz_after_bl_loop: + dcbz 0,r5 + addi r5, r5, 128 + cmpld cr7, r5, r6 + blt cr7, _dcbz_after_bl_loop + + ;// Do dcbz from start of HBB running space to start of Bootloader load +_dcbz_before_bl: + li r7, 1 + rotldi r7, r7, 63 ;// set bit mask for ignoring HRMOR + + subis r5, r11, 32 ;// start of HBB is HRMOR - 2MB (32 * 0x10000) + or r5, r5, r7 ;// ignore HRMOR + addi r8, r5, 0x2000 ;// add offset of TI info, save in r8 for later + + addi r6, r11, -1 ;// use HRMOR as Bootloader start, end before Bootloader + or r6, r6, r7 ;// ignore HRMOR +_dcbz_before_bl_loop: + dcbz 0,r5 + addi r5, r5, 128 + cmpld cr7, r5, r6 + blt cr7, _dcbz_before_bl_loop + + +_updates_and_setup: + ;// Update external data address with HRMOR + lis r5, g_blData@h + ori r5, r5, g_blData@l + ld r7, 0(r5) ;// get data address offset + or r7, r7, r11 ;// or HRMOR with offset to calculate address + addi r9, r7, HBBL_TI_OFFSET ;// add offset of HBBL's TI data, save in r9 + std r7, 0(r5) ;// set external data address + + + ;// Update scratch address with HRMOR + lis r5, g_blScratchSpace@h + ori r5, r5, g_blScratchSpace@l + ld r7, 0(r5) ;// get scratch address offset + or r7, r7, r11 ;// or HRMOR with offset to calculate address + std r7, 0(r5) ;// set scratch address + + + ;// Set up TI info + lis r5, hbb_ti_descriptor@h + ori r5, r5, hbb_ti_descriptor@l + ld r7, 0(r5) ;// get TI magic signature + std r7, 0(r8) ;// save using pointer for TI info put in r8 earlier + std r9, 8(r8) ;// store pointer to HBBL's TI data in next location + + ;// Set r5 to base load address where exception vectors are loaded +_load_exception_vectors: lis r5, HBBL_BASE_ADDRESS@h ori r5, r5, HBBL_BASE_ADDRESS@l @@ -215,38 +280,6 @@ _main: st r7, HBBL_debug(r5) - ;// Do dcbz from end of Bootloader load to end of HBB ECC working space -_dcbz_after_bl: - lis r5, SBE_HB_BLLOADSIZE@h - ori r5, r5, SBE_HB_BLLOADSIZE@l - ld r5, 0(r5) ;// get ending EA from SBE HB structure - lis r6, 0 - addis r6, r6, 32 ;// 2M (32 * 0x10000) - addi r6, r6, -1 ;// end before 2M -_dcbz_after_bl_loop: - dcbz 0,r5 - addi r5, r5, 128 - cmpld cr7, r5, r6 - blt cr7, _dcbz_after_bl_loop - - ;// Do dcbz from start of HBB running space to start of Bootloader load -_dcbz_before_bl: - li r7, 1 - rotldi r7, r7, 63 ;// set bit mask for ignoring HRMOR - - mfspr r5, HRMOR ;// start of HBB is HRMOR - 2MB - subis r5, r5, 32 ;// 2M (32 * 0x10000) is start of HBB - or r5, r5, r7 ;// ignore HRMOR - - mfspr r6, HRMOR ;// use HRMOR as start of Bootloader - addi r6, r6, -1 ;// end before Bootloader - or r6, r6, r7 ;// ignore HRMOR -_dcbz_before_bl_loop: - dcbz 0,r5 - addi r5, r5, 128 - cmpld cr7, r5, r6 - blt cr7, _dcbz_before_bl_loop - ;// Call main. bl main _main_loop: @@ -356,3 +389,14 @@ switchToHBB: .global bootloader_end_address bootloader_end_address: .quad HBBL_END_ADDRESS + +.global g_blData +g_blData: + .quad HBBL_DATA_ADDR_OFFSET + +.global g_blScratchSpace +g_blScratchSpace: + .quad HBBL_SCRATCH_ADDR_OFFSET + +hbb_ti_descriptor: + .byte 'H', 'O', 'S', 'T', 'B', 'O', 'O', 'T' diff --git a/src/bootloader/bl_terminate.C b/src/bootloader/bl_terminate.C index 9f639d7bb..cce210bc2 100644 --- a/src/bootloader/bl_terminate.C +++ b/src/bootloader/bl_terminate.C @@ -29,7 +29,7 @@ #define bl_terminate_C // Redefine kernel_TIDataArea to use space in Bootloader data -#define kernel_TIDataArea Bootloader::g_blData->bl_TIDataArea +#define kernel_TIDataArea g_blData->bl_TIDataArea #include <../kernel/terminate.C> @@ -37,6 +37,34 @@ #define UINT64_LOW(data) (data & 0x00000000FFFFFFFF) #define WORD7_WORD8(data) UINT64_HIGH(data), UINT64_LOW(data) +void bl_terminate(uint8_t i_moduleID, + uint16_t i_reasoncode, + uint32_t i_word7, + uint32_t i_word8, + bool i_executeTI, + uint64_t i_failAddr, + uint32_t i_error_info) +{ + termWriteSRC(TI_BOOTLOADER, + i_reasoncode, + i_failAddr, + i_error_info); + + termModifySRC(i_moduleID, + i_word7, + i_word8); + + // ptr to the TI data area structure + HB_TI_DataArea *TI_DataAreaPtr = reinterpret_cast<HB_TI_DataArea*>( + (HBB_WORKING_ADDR | Bootloader::IGNORE_HRMOR_MASK) + 0x2008); + *TI_DataAreaPtr = g_blData->bl_TIDataArea; + + if(i_executeTI) + { + terminateExecuteTI(); + } +} + extern "C" void kernel_std_exception() diff --git a/src/bootloader/bootloader.C b/src/bootloader/bootloader.C index 295577e6e..5b0048af5 100644 --- a/src/bootloader/bootloader.C +++ b/src/bootloader/bootloader.C @@ -59,22 +59,6 @@ const uint64_t LPC_BAR_MASK = 0xFF000000FFFFFFFFULL; namespace Bootloader{ /** - * @brief Pointer to bootloader scratch space - * - * Pointer to location in main storage which bootloader uses as - * scratch space - */ - uint8_t *g_blScratchSpace = nullptr; - - /** - * @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 * Hostboot code * @@ -291,7 +275,6 @@ namespace Bootloader{ int main() { // Initialization - g_blData = reinterpret_cast<blData_t *>(HBBL_DATA_ADDR); g_blData->bl_trace_index = 0; g_blData->bl_trace_index_saved = BOOTLOADER_TRACE_SIZE; BOOTLOADER_TRACE(BTLDR_TRC_MAIN_START); @@ -321,7 +304,6 @@ namespace Bootloader{ uint64_t l_pnorStart = 0; uint32_t l_errCode = PNOR::NO_ERROR; - g_blScratchSpace = reinterpret_cast<uint8_t*>(HBBL_SCRATCH_SPACE_ADDR); g_blData->secureRomValid = false; // Get location of HB base code in PNOR from TOC diff --git a/src/build/debug/Hostboot/BlData.pm b/src/build/debug/Hostboot/BlData.pm index b269305d0..76dc6875f 100644 --- a/src/build/debug/Hostboot/BlData.pm +++ b/src/build/debug/Hostboot/BlData.pm @@ -74,7 +74,7 @@ sub main $dataAddr = $args->{"addr"}; } - my ($dataSym, $dataSize) = ::findSymbolAddress("Bootloader::g_blData"); + my ($dataSym, $dataSize) = ::findSymbolAddress("g_blData"); if (not defined $dataSym) { ::userDisplay "Cannot find symbol.\n"; die; } my $dataSymStr = sprintf("0x%08X", $dataSym); my $dataAddress = ::read64($dataSym|$btLdrHrmorOffset); @@ -87,7 +87,7 @@ sub main ::userDisplay $dataAddrStr; my ($scratchSym, $scratchSize) = - ::findSymbolAddress("Bootloader::g_blScratchSpace"); + ::findSymbolAddress("g_blScratchSpace"); if (not defined $scratchSym) { ::userDisplay "Cannot find symbol.\n"; die; } my $scratchSymStr = sprintf("0x%08X", $scratchSym); my $scratchAddr = ::read64($scratchSym|$btLdrHrmorOffset); diff --git a/src/include/bootloader/bootloader.H b/src/include/bootloader/bootloader.H index f00927530..8020311ba 100644 --- a/src/include/bootloader/bootloader.H +++ b/src/include/bootloader/bootloader.H @@ -65,28 +65,13 @@ extern "C" void enterHBB(uint64_t i_hbb_hrmor, uint64_t i_hbb_offset); * @param[in] i_error_info Optional error data to go in the TI * data area * */ -inline void bl_terminate(uint8_t i_moduleID, - uint16_t i_reasoncode, - uint32_t i_word7 = 0, - uint32_t i_word8 = 0, - bool i_executeTI = true, - uint64_t i_failAddr = 0, - uint32_t i_error_info = 0) - { - termWriteSRC(TI_BOOTLOADER, - i_reasoncode, - i_failAddr, - i_error_info); - - termModifySRC(i_moduleID, - i_word7, - i_word8); - - if(i_executeTI) - { - terminateExecuteTI(); - } - } +void bl_terminate(uint8_t i_moduleID, + uint16_t i_reasoncode, + uint32_t i_word7 = 0, + uint32_t i_word8 = 0, + bool i_executeTI = true, + uint64_t i_failAddr = 0, + uint32_t i_error_info = 0); /** diff --git a/src/include/bootloader/bootloader_data.H b/src/include/bootloader/bootloader_data.H index 289e1c20d..0e65e6408 100644 --- a/src/include/bootloader/bootloader_data.H +++ b/src/include/bootloader/bootloader_data.H @@ -95,14 +95,22 @@ namespace Bootloader{ "size changed. Check bootloader_data.H alignment. " "Fix BlData.pm processing."); } 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 +/** + * @brief Pointer to bootloader external data + * + * Pointer to location in main storage which bootloader uses for + * storing data + */ +extern Bootloader::blData_t *g_blData; + +/** + * @brief Pointer to bootloader scratch space + * + * Pointer to location in main storage which bootloader uses as + * scratch space + */ +extern uint8_t *g_blScratchSpace; + #endif diff --git a/src/include/bootloader/bootloader_trace.H b/src/include/bootloader/bootloader_trace.H index 4a11dbf49..269a904f5 100644 --- a/src/include/bootloader/bootloader_trace.H +++ b/src/include/bootloader/bootloader_trace.H @@ -186,9 +186,9 @@ enum BootloaderTraces #ifndef BOOTLOADER_TRACE #define BOOTLOADER_TRACE(trace_value) \ { \ - Bootloader::g_blData->bl_trace[Bootloader::g_blData->bl_trace_index++] = \ + g_blData->bl_trace[g_blData->bl_trace_index++] = \ trace_value; \ - Bootloader::g_blData->bl_trace_index %= BOOTLOADER_TRACE_SIZE; \ + g_blData->bl_trace_index %= BOOTLOADER_TRACE_SIZE; \ lwsync(); \ } #endif |