summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/usr/runtime/runtime.H4
-rw-r--r--src/include/usr/runtime/runtime_reasoncodes.H3
-rw-r--r--src/include/usr/secureboot/service.H17
-rw-r--r--src/include/usr/vmmconst.h5
-rw-r--r--src/usr/isteps/istep16/call_host_ipl_complete.C20
-rw-r--r--src/usr/runtime/populate_hbruntime.C68
6 files changed, 117 insertions, 0 deletions
diff --git a/src/include/usr/runtime/runtime.H b/src/include/usr/runtime/runtime.H
index 5ae784b74..3ac97e81a 100644
--- a/src/include/usr/runtime/runtime.H
+++ b/src/include/usr/runtime/runtime.H
@@ -31,6 +31,7 @@
#include <errl/errlentry.H>
#include <hdat/hdat.H>
#include "../../../src/usr/runtime/hdatstructs.H"
+#include <vmmconst.h>
namespace RUNTIME
{
@@ -237,6 +238,9 @@ enum SbeUnsecureMemoryRegions
SP_HOST_UNTRUSTED_COMM_AREA_SIZE = 64*MEGABYTE,
SP_HOST_UNTRUSTED_OPAL_TRACE_ADDR = 0x31000000,
SP_HOST_UNTRUSTED_OPAL_TRACE_SIZE = 1*MEGABYTE,
+
+ SP_HOST_ATTN_SIZE_LIMIT = (SP_HOST_UNTRUSTED_COMM_AREA_SIZE
+ - PHYP_ATTN_AREA_OFFSET),
};
/**
diff --git a/src/include/usr/runtime/runtime_reasoncodes.H b/src/include/usr/runtime/runtime_reasoncodes.H
index 3dd2fc01e..79ebe37a8 100644
--- a/src/include/usr/runtime/runtime_reasoncodes.H
+++ b/src/include/usr/runtime/runtime_reasoncodes.H
@@ -65,6 +65,7 @@ namespace RUNTIME
MOD_RT_ATTR_SYNC_REQUEST = 0x25, /**< rt_fwnotify.C */
MOD_CHECK_HB_RES_MEM_LIMIT = 0x26, /**< populate_hbruntime.C */
MOD_INIT_RT_RES_MEM_TRACE_BUF = 0x27, /**< rt_rsvdtracebuffer.C */
+ MOD_OPEN_UNTRUSTED_SP_AREAS = 0x28, /**< populate_hbruntime.C */
};
enum RuntimeReasonCode
@@ -135,6 +136,8 @@ namespace RUNTIME
RC_HOST_TIMER_THREAD_FAIL = RUNTIME_COMP_ID | 0x3F,
RC_RT_RES_TRACE_BUF_DUMPED = RUNTIME_COMP_ID | 0x40,
RC_RT_RES_TRACE_BUF_INVALID = RUNTIME_COMP_ID | 0x41,
+ RC_SP_ATTN_AREA_OVERFLOW = RUNTIME_COMP_ID | 0x42,
+ RC_SP_ATTN_AREA1_SIZE_OVERFLOW = RUNTIME_COMP_ID | 0x43,
};
enum UserDetailsTypes
diff --git a/src/include/usr/secureboot/service.H b/src/include/usr/secureboot/service.H
index cb2829147..3060e9225 100644
--- a/src/include/usr/secureboot/service.H
+++ b/src/include/usr/secureboot/service.H
@@ -32,6 +32,9 @@
#include <cstdint>
#include <securerom/sha512.H>
#include <securerom/ROM.H>
+#include <vmmconst.h>
+#include <sys/misc.h>
+#include <kernel/vmmmgr.H>
/*
* @brief Used to capture the first 4 bytes of the hash for tracing purposes
@@ -363,6 +366,20 @@ namespace SECUREBOOT
*/
errlHndl_t setSbeSecurityMode(uint8_t i_sbeSecurityMode);
+ /*
+ * @brief Calculates the node's proposed start address for the system's
+ * SP ATTN areas, which becomes the effective configuration if it's
+ * elected as the master.
+ *
+ * @return uint64_t Absolute start address for the intended SP ATTN areas
+ */
+ inline uint64_t calcSpAttnAreaStart()
+ {
+ auto hrmorVal = cpu_spr_value(CPU_SPR_HRMOR);
+ return (hrmorVal - VMM_HRMOR_OFFSET + PHYP_ATTN_AREA_OFFSET)
+ | VmmManager::FORCE_PHYS_ADDR;
+ }
+
}
#endif
diff --git a/src/include/usr/vmmconst.h b/src/include/usr/vmmconst.h
index 5da954974..177802bab 100644
--- a/src/include/usr/vmmconst.h
+++ b/src/include/usr/vmmconst.h
@@ -144,6 +144,11 @@ enum BlockPriority
#define VMM_HRMOR_OFFSET (128*MEGABYTE)
#define VMM_HB_RSV_MEM_SIZE (256*MEGABYTE)
+/** PHYP ATTN AREA OFFSET */
+/** This offset is relative to the lowest address in a given node */
+#define PHYP_ATTN_AREA_OFFSET (59*MEGABYTE)
+#define PHYP_ATTN_AREA_1_SIZE (1*KILOBYTE)
+
/** Hardwired offsets from HRMOR to HOMER images in real mem */
/** HOMER starts immediately after our HB memory */
/** <n0p0 HRMOR = 128MB> + <memory size = 64MB> = 192 MB */
diff --git a/src/usr/isteps/istep16/call_host_ipl_complete.C b/src/usr/isteps/istep16/call_host_ipl_complete.C
index a96703191..1d2f711a7 100644
--- a/src/usr/isteps/istep16/call_host_ipl_complete.C
+++ b/src/usr/isteps/istep16/call_host_ipl_complete.C
@@ -51,6 +51,10 @@
#include <ipmi/ipmisensor.H>
#endif
+#include <vmmconst.h>
+#include <targeting/targplatutil.H>
+#include <secureboot/service.H>
+
using namespace ERRORLOG;
using namespace TARGETING;
using namespace ISTEP;
@@ -282,6 +286,22 @@ void* call_host_ipl_complete (void *io_pArgs)
break;
}
+ // populate PHYP ATTN Area Attributes with values
+ if ( INITSERVICE::spBaseServicesEnabled() && is_phyp_load())
+ {
+ // calculate absolute address for PHYP SP ATTN areas
+ auto l_abs = SECUREBOOT::calcSpAttnAreaStart();
+
+ auto spAttnArea1Addr = l_abs;
+ auto spAttnArea2Addr = l_abs + PHYP_ATTN_AREA_1_SIZE;
+
+ auto l_nodeTgt = TARGETING::UTIL::getCurrentNodeTarget();
+
+ l_nodeTgt->setAttr<ATTR_ATTN_AREA_1_ADDR>(spAttnArea1Addr);
+ l_nodeTgt->setAttr<ATTR_ATTN_AREA_2_ADDR>(spAttnArea2Addr);
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, INFO_MRK"Set attributes for PHYP ATTN areas. ATTN Area 1: 0x%.16llX ATTN Area 2: 0x%.16llX", spAttnArea1Addr, spAttnArea2Addr);
+ }
+
// Sync attributes to Fsp
l_err = syncAllAttributesToFsp();
diff --git a/src/usr/runtime/populate_hbruntime.C b/src/usr/runtime/populate_hbruntime.C
index 7672a572a..db2fa42c7 100644
--- a/src/usr/runtime/populate_hbruntime.C
+++ b/src/usr/runtime/populate_hbruntime.C
@@ -3403,6 +3403,74 @@ errlHndl_t openUntrustedSpCommArea(const uint64_t i_commBase)
l_spAttnStartAddr,
l_spAttnCombinedSize);
+ // If in phyp mode and the master
+ if (TARGETING::is_phyp_load() && TARGETING::UTIL::isCurrentMasterNode())
+ {
+ // make sure ATTN area never grows beyond the SP/PHyp untrusted region
+ if (l_spAttnCombinedSize > SP_HOST_ATTN_SIZE_LIMIT)
+ {
+ TRACFCOMP( g_trac_runtime,
+ ERR_MRK"openUntrustedSpCommArea(): Combined sizes of SP ATTN area 1 and area 2 are larger than 0x%.16llX. ATTN1 sz: 0x%.16llX, ATTN2 sz: 0x%.16llX",
+ SP_HOST_ATTN_SIZE_LIMIT,
+ l_pCpuCtrlInfo->spAttnArea1.size,
+ l_pCpuCtrlInfo->spAttnArea2.size);
+
+ /*@
+ * @errortype
+ * @moduleid RUNTIME::MOD_OPEN_UNTRUSTED_SP_AREAS
+ * @reasoncode RUNTIME::RC_SP_ATTN_AREA_OVERFLOW
+ * @userdata1 SP ATTN Area total size
+ * @userdata2 SP ATTN Area start address
+ * @devdesc SP ATTN Areas attempting to allocate past valid
+ * memory range.
+ * @custdesc Failure in the security subsystem.
+ */
+ l_err = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ RUNTIME::MOD_OPEN_UNTRUSTED_SP_AREAS,
+ RUNTIME::RC_SP_ATTN_AREA_OVERFLOW,
+ l_spAttnCombinedSize,
+ l_spAttnStartAddr,
+ true);
+ l_err->collectTrace(RUNTIME_COMP_NAME);
+ break;
+ }
+ // Make sure our intended ATTN area 1 size is not smaller than the ATTN
+ // area 1 size reported in HDAT
+ if (PHYP_ATTN_AREA_1_SIZE < l_pCpuCtrlInfo->spAttnArea1.size)
+ {
+ TRACFCOMP( g_trac_runtime,
+ ERR_MRK"openUntrustedSpCommArea(): Hostboot's proposed SP ATTN area 1 size is smaller than what is reported in HDAT. Proposed ATTN1 sz: 0x%.16llX, HDAT ATTN1 sz: 0x%.16llX",
+ PHYP_ATTN_AREA_1_SIZE,
+ l_pCpuCtrlInfo->spAttnArea1.size);
+
+ /*@
+ * @errortype
+ * @moduleid RUNTIME::MOD_OPEN_UNTRUSTED_SP_AREAS
+ * @reasoncode RUNTIME::RC_SP_ATTN_AREA1_SIZE_OVERFLOW
+ * @userdata1 SP ATTN Area 1 size proposed by hostboot
+ * @userdata2 SP ATTN Area 1 size reported in HDAT
+ * @devdesc SP ATTN Area 1 size exceeds the maximum.
+ * @custdesc Failure in the security subsystem.
+ */
+ l_err = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ RUNTIME::MOD_OPEN_UNTRUSTED_SP_AREAS,
+ RUNTIME::RC_SP_ATTN_AREA1_SIZE_OVERFLOW,
+ PHYP_ATTN_AREA_1_SIZE,
+ l_pCpuCtrlInfo->spAttnArea1.size,
+ true);
+ l_err->collectTrace(RUNTIME_COMP_NAME);
+ break;
+ }
+
+ // calculate absolute address for PHYP SP ATTN areas
+ auto l_abs = SECUREBOOT::calcSpAttnAreaStart();
+
+ l_pCpuCtrlInfo->spAttnArea1.address = l_abs;
+ l_pCpuCtrlInfo->spAttnArea2.address = l_abs + PHYP_ATTN_AREA_1_SIZE;
+ }
+
// Open unsecure SBE memory regions
// Loop through all functional Procs
TARGETING::TargetHandleList l_procChips;
OpenPOWER on IntegriCloud