Skip to content

Commit

Permalink
Move HOMER BAR to Secure Memory in SMF Mode
Browse files Browse the repository at this point in the history
This commits enables HOMER BAR to point to the top
of the secure memory on SMF-enabled systems. Consequently,
the HOMER image and hostboot reserved memory will
be moved to the secure memory if SMF is enabled.

Change-Id: I37c7527b06688a41e57f14b4107ff53a507ffae8
RTC: 198825
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/66702
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@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>
  • Loading branch information
Ilya Smirnov authored and dcrowell77 committed Nov 13, 2018
1 parent de9ec8d commit 1aae1ba
Show file tree
Hide file tree
Showing 20 changed files with 562 additions and 185 deletions.
1 change: 1 addition & 0 deletions src/include/usr/isteps/istep15list.H
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ const DepModInfo g_istep15Dependancies = {
DEP_LIB(libpm.so),
DEP_LIB(libimageprocs.so),
DEP_LIB(libisteps_mss.so),
DEP_LIB(libsmf.so),
NULL
}
};
Expand Down
103 changes: 103 additions & 0 deletions src/include/usr/isteps/mem_utils.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/include/usr/isteps/mem_utils.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] 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 __MEM_UTILS_H
#define __MEM_UTILS_H

#include <errl/errlentry.H>

namespace ISTEP
{

/**
* @brief Utility function to obtain the highest known address in the system
*
* @return The highest address in the system in bytes
*/
uint64_t get_top_mem_addr();

/**
* @brief Utility function to obtain the highest known address in a given proc
*
* @param[in] i_proc: Proc that we want to calculate the top address for;
* must not be nullptr or the func will assert
* must be of TYPE_PROC or the func will assert
*
* @return The highest address in the given proc (in bytes)
*/
uint64_t get_top_mem_addr(const TARGETING::Target* i_proc);

/**
* @brief Utility function to obtain the lowest known address in the system
*
* @return the lowest know address in the system
*/
uint64_t get_bottom_mem_addr();

/**
* @brief Utility function to obtain the lowest known address in a given proc
*
* @param[in] i_proc: Proc that we want to calculate the bottom address for;
* must not be nullptr or the func will assert
* must be of TYPE_PROC or the func will assert
*
* @return the lowest know address on the specified proc
*/
uint64_t get_bottom_mem_addr(const TARGETING::Target* i_proc);

/**
* @brief Utility function to obtain the highest known SMF base address on
* the system.
*
* @return: the address (in bytes) of the top SMF memory
*
*/
uint64_t get_top_smf_mem_addr();

/**
* @brief Utility function to obtain the SMF base address on the given proc
*
* @param[in] i_proc: Proc to fetch the SMF BAR from;
* must not be nullptr or the func will assert
* must be of TYPE_PROC or the func will assert
*
*
* @return The SMF BAR of the given proc (in bytes)
*/
uint64_t get_top_smf_mem_addr(const TARGETING::Target* i_proc);

/**
* @brief Utility function to fetch the top of the HOMER memory
*
* @return the address of the HOMER mem
*
* @note When SMF is enabled, the highest available SMF BAR will be returned;
* when SMF is disabled, the function behaves exactly like
* get_top_mem_addr
*/
uint64_t get_top_homer_mem_addr();

} //namespace ISTEP

#endif
2 changes: 2 additions & 0 deletions src/include/usr/secureboot/secure_reasoncodes.H
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ namespace SECUREBOOT
MOD_SECURE_VALIDATE_ECID_COUNT = 0x10,
MOD_LOCK_ABUS_SEC_MAILBOXES = 0x11,
MOD_SECURE_LOG_PLAT_SECURITY_CONFIG = 0x12,
MOD_CHECK_RISK_LEVEL_FOR_SMF = 0x13,

// Use 0x20-0x2F range for Node Communications
MOD_NCDD_CHECK_FOR_ERRORS = 0x20,
Expand Down Expand Up @@ -89,6 +90,7 @@ namespace SECUREBOOT
RC_INVALID_ECID_COUNT = SECURE_COMP_ID | 0x13,
RC_LOCK_MAILBOXES_FAILED = SECURE_COMP_ID | 0x14,
RC_SECURE_LOG_PLAT_SECURITY_CONFIG = SECURE_COMP_ID | 0x15,
RC_RISK_LEVEL_TOO_LOW = SECURE_COMP_ID | 0x16,

// Use 0x20-0x2F range for Node Communications
RC_NCDD_HW_ERROR_FOUND = SECURE_COMP_ID | 0x20,
Expand Down
62 changes: 62 additions & 0 deletions src/include/usr/secureboot/smf_utils.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/include/usr/secureboot/smf_utils.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] 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 __SMF_UTILS_H
#define __SMF_UTILS_H

#include <stdint.h>
#include <errl/errlentry.H>

namespace SECUREBOOT
{

namespace SMF
{

// HW limitations dictate that SMF memory needs to be a power-of-two
// multiple of 256MB starting with 256MB.
extern const uint64_t MIN_SMF_MEMORY_AMT;

/**
* @brief Checks whether SMF mode is enabled on the system
*
* @return true: SMF is enabled; false: SMF is disabled.
*/
bool isSmfEnabled();

/**
* @brief Checks whether the system has the correct risk level to
* support SMF: SMF is supported on Axone by default or on
* NIMBUS or CUMULUS with risk level >= 4.
*
* @return nullptr: the current system supports SMF
* non-nullptr: an internal error occurred or the system
* does not support SMF
*/
errlHndl_t checkRiskLevelForSmf();

} // namespace SMF

} // namespace SECUREBOOT
#endif
26 changes: 1 addition & 25 deletions src/include/usr/targeting/common/util.H
Original file line number Diff line number Diff line change
Expand Up @@ -155,30 +155,6 @@ bool is_sapphire_load(void);
*/
bool is_avp_load(void);

/**
* @brief Utility function to obtain the highest known address in the system
*/
uint64_t get_top_mem_addr();

/**
* @brief Utility function to obtain the highest known address in a given proc
*
* @param[in] i_proc: Proc that we want to calculate the top address for
*/
uint64_t get_top_mem_addr(Target* i_proc);

/**
* @brief Utility function to obtain the lowest known address in the system
*/
uint64_t get_bottom_mem_addr();

/**
* @brief Utility function to obtain the lowest known address in a given proc
*
* @param[in] i_proc: Proc that we want to calculate the bottom address for
*/
uint64_t get_bottom_mem_addr(Target* i_proc);

/**
* Order two processor targets by NODE_ID then CHIP_ID.
* @param[in] First processor target
Expand All @@ -196,6 +172,6 @@ bool orderByNodeAndPosition( Target* i_firstProc,
*/
uint8_t is_fused_mode( );

}
} // TARGETING

#endif // __TARGETING_COMMON_UTIL_H
14 changes: 14 additions & 0 deletions src/include/usr/targeting/targplatutil.H
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,20 @@ namespace UTIL
// is reserved for invalid sensor
static const uint16_t INVALID_IPMI_SENSOR = 0xFF;

// WARNING: addition of risk levels that don't support SMF will have a
// significant effect on the behavior of SMF code. Please ensure that
// (at least) src/usr/secureboot/smf/smf_utils.C is updated
// accordingly!
typedef enum
{
P9N22_P9C12_RUGBY_FAVOR_SECURITY = 0x00,
P9N22_P9C12_RUGBY_FAVOR_PERFORMANCE = 0x01,
P9N22_NO_RUGBY_MITIGATIONS = 0x02,
P9N22_P9N23_JAVA_PERF = 0x03,
P9N23_P9C13_NATIVE_SMF_RUGBY_FAVOR_SECURITY = 0x04,
P9N23_P9C13_NATIVE_SMF_RUGBY_FAVOR_PERFORMANCE = 0x05,
} Risk_level;

/**
* @brief Creates a standard error log of tracing type
*
Expand Down
1 change: 1 addition & 0 deletions src/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ EXTENDED_MODULES += node_comm
EXTENDED_MODULES += $(if $(CONFIG_NVDIMM),nvdimm)
EXTENDED_MODULES += $(if $(CONFIG_FSP_BUILD),,nvram)
EXTENDED_MODULES += mmio
EXTENDED_MODULES += smf

#***************************************
# Working test modules
Expand Down
2 changes: 2 additions & 0 deletions src/usr/isteps/istep07/call_mss_attr_update.C
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@
//HRMOR
#include <sys/misc.h>

#include <isteps/mem_utils.H>

namespace ISTEP_07
{

Expand Down
2 changes: 2 additions & 0 deletions src/usr/isteps/istep14/call_proc_exit_cache_contained.C
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@
#include <scom/centaurScomCache.H>
#endif

#include <isteps/mem_utils.H>

using namespace ISTEP;
using namespace ISTEP_ERROR;
using namespace ERRORLOG;
Expand Down
53 changes: 6 additions & 47 deletions src/usr/isteps/istep15/host_build_stop_image.C
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@
#include <p9_xip_section_append.H>
#include <p9n2_quad_scom_addresses_fld.H>

#include <secureboot/smf_utils.H>
#include <isteps/mem_utils.H>

using namespace ERRORLOG;
using namespace ISTEP;
using namespace ISTEP_ERROR;
Expand Down Expand Up @@ -173,62 +176,18 @@ errlHndl_t applyHcodeGenCpuRegs( TARGETING::Target *i_procChipTarg,
uint64_t l_msrVal = cpu_spr_value(CPU_SPR_MSR);
uint64_t l_lpcrVal = cpu_spr_value(CPU_SPR_LPCR);

uint8_t l_smfEnabled = 0;
fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_ENABLED,
FAPI_SYSTEM,
l_smfEnabled));

if(l_smfEnabled)
if(SECUREBOOT::SMF::isSmfEnabled())
{
uint8_t l_riskLevel = 0;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_RISK_LEVEL,
FAPI_SYSTEM,
l_riskLevel));
TARGETING::Target* l_pMasterProc = nullptr;
l_errl = TARGETING::targetService()
.queryMasterProcChipTargetHandle(l_pMasterProc);
l_errl = SECUREBOOT::SMF::checkRiskLevelForSmf();
if(l_errl)
{
break;
}

auto l_masterProcModel =l_pMasterProc->getAttr<TARGETING::ATTR_MODEL>();

// SMF is enabled by default on Axone, so need to check the risk level
// only on P9C/P9N.
if(l_riskLevel < 4 &&
((l_masterProcModel == TARGETING::MODEL_CUMULUS) ||
(l_masterProcModel == TARGETING::MODEL_NIMBUS)))
{
/*@
* @errortype
* @reasoncode ISTEP::RC_RISK_LEVEL_TOO_LOW
* @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
* @moduleid ISTEP::MOD_APPLY_HCODE_GEN_CPU_REGS
* @userdata1 Current risk level of the system
* @devdesc SMF is enabled on the system of incorrect risk level
* @custdesc A problem occurred during the IPL of the system.
*/
l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
ISTEP::MOD_APPLY_HCODE_GEN_CPU_REGS,
ISTEP::RC_RISK_LEVEL_TOO_LOW,
l_riskLevel,
0,
ERRORLOG::ErrlEntry::ADD_SW_CALLOUT);
break;
}

// Set the secure bit (41) on if SMF is enabled
l_msrVal |= MSR_SMF_MASK;
}

if(l_errl)
{
fapi_try_exit:
break;
}

// See LPCR def, PECE "reg" in Power ISA AS Version: Power8 June 27, 2012
// and 23.7.3.5 - 6 in Murano Book 4
l_lpcrVal &= ~(0x0000000000002000) ;
Expand Down Expand Up @@ -482,7 +441,7 @@ void* host_build_stop_image (void *io_pArgs)
//If running Sapphire need to place this at the top of memory instead
if(is_sapphire_load())
{
l_memBase = get_top_mem_addr();
l_memBase = get_top_homer_mem_addr();
assert (l_memBase != 0,
"host_build_stop_image: Top of memory was 0!");
l_memBase -= VMM_ALL_HOMER_OCC_MEMORY_SIZE;
Expand Down
2 changes: 1 addition & 1 deletion src/usr/isteps/istep15/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2015,2017
# Contributors Listed Below - COPYRIGHT 2015,2018
# [+] International Business Machines Corp.
#
#
Expand Down
1 change: 1 addition & 0 deletions src/usr/isteps/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/utils/imageProcs/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/imageProcs/
EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc/

OBJS += mem_utils.o
OBJS += hwpisteperror.o
OBJS += hwpistepud.o
OBJS += istepHelperFuncs.o
Expand Down

0 comments on commit 1aae1ba

Please sign in to comment.