summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Carvalho <cclaudio@linux.vnet.ibm.com>2017-12-09 02:52:29 -0200
committerStewart Smith <stewart@linux.vnet.ibm.com>2017-12-18 21:30:57 -0600
commit48fd73cfc7073911a1ecdf0ff62e1800ef544d2a (patch)
treeb27fbf121782036044b0e31854b840a6bd10ea30
parentccdbfdac637c2ddabfcc36371344cd5c6c648e1b (diff)
downloadtalos-skiboot-48fd73cfc7073911a1ecdf0ff62e1800ef544d2a.tar.gz
talos-skiboot-48fd73cfc7073911a1ecdf0ff62e1800ef544d2a.zip
hdata/spira: add ibm, secureboot node in P9
In P9, skiboot builds the device tree from the HDAT. These are the "ibm,secureboot" node changes compared to P8: - The Container-Verification-Code (CVC), a.k.a. ROM code, is no longer stored in a secure ROM with static address. In P9, it is stored in a hostboot reserved memory and each service provided also has a version, not only an offset. - The hash-algo property is not provided via HDAT, instead it provides the hw-key-hash-size, which is indeed the information required by the CVC to verify containers. This parses the iplparams_sysparams HDAT structure and creates the "ibm,secureboot", which is bumped to "ibm,secureboot-v2". In "ibm,secureboot-v2": - hash-algo property is superseded by hw-key-hash-size. - container verification code is explicitly described by a child node. Added in a subsequent patch. Signed-off-by: Claudio Carvalho <cclaudio@linux.vnet.ibm.com> Reviewed-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> Reviewed-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--hdata/spira.c39
-rw-r--r--hdata/spira.h15
2 files changed, 48 insertions, 6 deletions
diff --git a/hdata/spira.c b/hdata/spira.c
index 532a50ab..edb140d2 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -938,6 +938,42 @@ static void add_nmmu(void)
}
}
+static void dt_init_secureboot_node(const struct iplparams_sysparams *sysparams)
+{
+ struct dt_node *node;
+ u16 sys_sec_setting;
+ u16 hw_key_hash_size;
+
+ node = dt_new(dt_root, "ibm,secureboot");
+ assert(node);
+
+ dt_add_property_string(node, "compatible", "ibm,secureboot-v2");
+
+ sys_sec_setting = be16_to_cpu(sysparams->sys_sec_setting);
+ if (sys_sec_setting & SEC_CONTAINER_SIG_CHECKING)
+ dt_add_property(node, "secure-enabled", NULL, 0);
+ if (sys_sec_setting & SEC_HASHES_EXTENDED_TO_TPM)
+ dt_add_property(node, "trusted-enabled", NULL, 0);
+
+ hw_key_hash_size = be16_to_cpu(sysparams->hw_key_hash_size);
+
+ /* Prevent hw-key-hash buffer overflow by truncating hw-key-hash-size if
+ * it is bigger than the hw-key-hash buffer.
+ * Secure boot will be enforced later in skiboot, if the hw-key-hash-size
+ * was not supposed to be SYSPARAMS_HW_KEY_HASH_MAX.
+ */
+ if (hw_key_hash_size > SYSPARAMS_HW_KEY_HASH_MAX) {
+ prlog(PR_ERR, "IPLPARAMS: hw-key-hash-size=%d too big, "
+ "truncating to %d\n", hw_key_hash_size,
+ SYSPARAMS_HW_KEY_HASH_MAX);
+ hw_key_hash_size = SYSPARAMS_HW_KEY_HASH_MAX;
+ }
+
+ dt_add_property(node, "hw-key-hash", sysparams->hw_key_hash,
+ hw_key_hash_size);
+ dt_add_property_cells(node, "hw-key-hash-size", hw_key_hash_size);
+}
+
static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)
{
const struct iplparams_sysparams *p;
@@ -1024,6 +1060,9 @@ static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)
sys_attributes = be32_to_cpu(p->sys_attributes);
if (sys_attributes & SYS_ATTR_RISK_LEVEL)
dt_add_property(node, "elevated-risk-level", NULL, 0);
+
+ if (version >= 0x60 && proc_gen >= proc_gen_p9)
+ dt_init_secureboot_node(p);
}
static void add_iplparams_ipl_params(const void *iplp, struct dt_node *node)
diff --git a/hdata/spira.h b/hdata/spira.h
index 190afad1..17c6a2a4 100644
--- a/hdata/spira.h
+++ b/hdata/spira.h
@@ -355,6 +355,7 @@ struct iplparams_sysparams {
__be32 abc_bus_speed;
__be32 wxyz_bus_speed;
__be32 sys_eco_mode;
+#define SYS_ATTR_MULTIPLE_TPM PPC_BIT32(0)
#define SYS_ATTR_RISK_LEVEL PPC_BIT32(3)
__be32 sys_attributes;
__be32 mem_scrubbing;
@@ -369,12 +370,14 @@ struct iplparams_sysparams {
uint8_t split_core_mode; /* >= 0x5c */
uint8_t reserved[3];
uint8_t sys_vendor[64]; /* >= 0x5f */
- /* >= 0x60 */
- __be16 sys_sec_setting;
- __be16 tpm_config_bit;
- __be16 tpm_drawer;
- __be16 reserved2;
- uint8_t hw_key_hash[64];
+#define SEC_CONTAINER_SIG_CHECKING PPC_BIT16(0)
+#define SEC_HASHES_EXTENDED_TO_TPM PPC_BIT16(1)
+ __be16 sys_sec_setting; /* >= 0x60 */
+ __be16 tpm_config_bit; /* >= 0x60 */
+ __be16 tpm_drawer; /* >= 0x60 */
+ __be16 hw_key_hash_size; /* >= 0x60 */
+#define SYSPARAMS_HW_KEY_HASH_MAX 64
+ uint8_t hw_key_hash[SYSPARAMS_HW_KEY_HASH_MAX]; /* >= 0x60 */
uint8_t sys_family_str[64]; /* vendor,name */
uint8_t sys_type_str[64]; /* vendor,type */
} __packed;
OpenPOWER on IntegriCloud