summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bootloader/bl_start.S23
-rw-r--r--src/bootloader/bl_terminate.C3
-rw-r--r--src/bootloader/bootloader.C86
-rw-r--r--src/build/debug/Hostboot/BlTrace.pm23
-rw-r--r--src/include/bootloader/bootloader.H5
-rw-r--r--src/include/bootloader/bootloader_data.H79
-rw-r--r--src/include/bootloader/bootloader_trace.H8
-rw-r--r--src/include/bootloader/bootloaderif.H12
-rw-r--r--src/kernel/terminate.C8
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
OpenPOWER on IntegriCloud