[Skiboot] [PATCH 1/5] hdata: add secure and trusted boot ntuple to SPIRA-H/S

Claudio Carvalho cclaudio at linux.vnet.ibm.com
Thu Aug 31 17:42:48 AEST 2017


This adds to spira-h/s the overall tpmrel structure, which defines
secure and trusted boot related data. The internal data structures will
be added in separated patches.

Signed-off-by: Claudio Carvalho <cclaudio at linux.vnet.ibm.com>
---
 hdata/Makefile.inc       |  2 +-
 hdata/hdata.h            |  1 +
 hdata/spira.c            |  4 ++++
 hdata/spira.h            | 12 +++++++++---
 hdata/test/hdata_to_dt.c |  1 +
 hdata/tpmrel.c           | 40 ++++++++++++++++++++++++++++++++++++++++
 6 files changed, 56 insertions(+), 4 deletions(-)
 create mode 100644 hdata/tpmrel.c

diff --git a/hdata/Makefile.inc b/hdata/Makefile.inc
index 5b79dfe..c17b04f 100644
--- a/hdata/Makefile.inc
+++ b/hdata/Makefile.inc
@@ -2,7 +2,7 @@
 
 SUBDIRS += hdata
 HDATA_OBJS = spira.o paca.o pcia.o hdif.o memory.o fsp.o iohub.o vpd.o slca.o
-HDATA_OBJS += cpu-common.o vpd-common.o hostservices.o i2c.o
+HDATA_OBJS += cpu-common.o vpd-common.o hostservices.o i2c.o tpmrel.o
 DEVSRC_OBJ = hdata/built-in.o
 
 $(DEVSRC_OBJ): $(HDATA_OBJS:%=hdata/%)
diff --git a/hdata/hdata.h b/hdata/hdata.h
index 6da9b55..31223c8 100644
--- a/hdata/hdata.h
+++ b/hdata/hdata.h
@@ -65,6 +65,7 @@ extern void slca_dt_add_sai_node(void);
 extern bool hservices_from_hdat(const void *fdt, size_t size);
 int parse_i2c_devs(const struct HDIF_common_hdr *hdr, int idata_index,
 	struct dt_node *xscom);
+extern void node_stb_parse(void);
 
 #endif /* __HDATA_H */
 
diff --git a/hdata/spira.c b/hdata/spira.c
index b58be7c..220ae9e 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -1278,6 +1278,7 @@ static void fixup_spira(void)
 	spira.ntuples.proc_chip = spiras->ntuples.proc_chip;
 	spira.ntuples.hs_data = spiras->ntuples.hs_data;
 	spira.ntuples.ipmi_sensor = spiras->ntuples.ipmi_sensor;
+	spira.ntuples.node_stb_data = spiras->ntuples.node_stb_data;
 }
 
 int parse_hdat(bool is_opal)
@@ -1347,6 +1348,9 @@ int parse_hdat(bool is_opal)
 
 	add_stop_levels();
 
+	/* Parse node secure and trusted boot data */
+	node_stb_parse();
+
 	prlog(PR_DEBUG, "Parsing HDAT...done\n");
 
 	return 0;
diff --git a/hdata/spira.h b/hdata/spira.h
index 0276d4a..d2a70c1 100644
--- a/hdata/spira.h
+++ b/hdata/spira.h
@@ -40,7 +40,7 @@ struct spira_ntuple {
 	__be64		padding;
 } __packed;
 
-#define SPIRA_NTUPLES_COUNT	0x18
+#define SPIRA_NTUPLES_COUNT	0x19
 
 struct spira_ntuples {
 	struct HDIF_array_hdr	array_hdr;
@@ -69,6 +69,7 @@ struct spira_ntuples {
 	struct spira_ntuple	proc_chip;		/* 0x300 */
 	struct spira_ntuple	hs_data;		/* 0x320 */
 	struct spira_ntuple	ipmi_sensor;		/* 0x360 */
+	struct spira_ntuple	node_stb_data;		/* 0x380 */
 };
 
 struct spira {
@@ -82,7 +83,7 @@ struct spira {
 	 *
 	 * According to FSP engineers, this is an okay thing to do.
 	 */
-	u8			reserved[0xa0];
+	u8			reserved[0x80];
 } __packed __align(0x100);
 
 extern struct spira spira;
@@ -146,7 +147,7 @@ struct spiras_ntuples {
 	struct spira_ntuple	hs_data;		/* 0x200 */
 	struct spira_ntuple	hbrt_data;		/* 0x220 */
 	struct spira_ntuple	ipmi_sensor;		/* 0x240 */
-	struct spira_ntuple	node_data;		/* 0x260 */
+	struct spira_ntuple	node_stb_data;		/* 0x260 */
 };
 
 struct spiras {
@@ -1092,6 +1093,11 @@ struct ipmi_sensors {
 /* Idata index 1 : LED - sensors ID mapping data */
 #define IPMI_SENSORS_IDATA_LED		1
 
+/*
+ * Node Secure and Trusted Boot Related Data
+ */
+#define STB_HDIF_SIG	"TPMREL"
+
 static inline const char *cpu_state(u32 flags)
 {
 	switch ((flags & CPU_ID_VERIFY_MASK) >> CPU_ID_VERIFY_SHIFT) {
diff --git a/hdata/test/hdata_to_dt.c b/hdata/test/hdata_to_dt.c
index 155e41b..6da80a5 100644
--- a/hdata/test/hdata_to_dt.c
+++ b/hdata/test/hdata_to_dt.c
@@ -124,6 +124,7 @@ static bool spira_check_ptr(const void *ptr, const char *file, unsigned int line
 #include "../slca.c"
 #include "../hostservices.c"
 #include "../i2c.c"
+#include "../tpmrel.c"
 #include "../../core/vpd.c"
 #include "../../core/device.c"
 #include "../../core/chip.c"
diff --git a/hdata/tpmrel.c b/hdata/tpmrel.c
new file mode 100644
index 0000000..7ded404
--- /dev/null
+++ b/hdata/tpmrel.c
@@ -0,0 +1,40 @@
+/* Copyright 2013-2017 IBM 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.
+ */
+
+#ifndef pr_fmt
+#define pr_fmt(fmt) "HDAT TPMREL: " fmt
+#endif
+
+#include <skiboot.h>
+
+#include "spira.h"
+#include "hdata.h"
+#include "hdif.h"
+
+void node_stb_parse(void)
+{
+	struct HDIF_common_hdr *hdif_hdr;
+
+	hdif_hdr = get_hdif(&spira.ntuples.node_stb_data, "TPMREL");
+	if (!hdif_hdr) {
+		prlog(PR_INFO, "could not find TPMREL data\n");
+		return;
+	}
+
+	/* TODO: Idata 0: Secure Boot and TPM Instance Info */
+	/* TODO: Idata 1: User Physical Interaction Mechanism Info */
+	/* TODO: Idata 2: Hash and Verification Function Offset Array */
+}
-- 
2.7.4



More information about the Skiboot mailing list