The current approach to enable secure boot relies on providing
secure-boot and boot-certs parameters of s390-ccw-virtio machine
type option, which apply to all boot devices.
With the possibility of multiple boot devices, secure boot expects all
provided devices to be supported and eligible (e.g.,
virtio-blk/virtio-scsi using the SCSI scheme).
If multiple boot devices are provided and include an unsupported (e.g.,
ECKD, VFIO) or a non-eligible (e.g., Net) device, the boot process will
terminate with an error logged to the console.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
---
hw/s390x/ipl.c | 79 ++++++++++++++++++++++++++++-------------
pc-bios/s390-ccw/main.c | 3 --
2 files changed, 54 insertions(+), 28 deletions(-)
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index f8dd50f69d..e46e655ef1 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -445,6 +445,58 @@ static bool s390_secure_boot_enabled(void)
return S390_CCW_MACHINE(qdev_get_machine())->secure_boot;
}
+static bool s390_validate_secure_boot_device(int devtype, Error **errp)
+{
+ switch (devtype) {
+ case CCW_DEVTYPE_VFIO:
+ error_setg(errp, "Passthrough (vfio) CCW device does not support secure boot!");
+ return false;
+ case CCW_DEVTYPE_VIRTIO_NET:
+ error_setg(errp, "Virtio net boot device does not support secure boot!");
+ return false;
+ default:
+ return true;
+ }
+}
+
+static void s390_apply_secure_boot(IplParameterBlock *iplb, int devtype,
+ bool secure_boot, bool audit_mode)
+{
+ Error *local_error = NULL;
+
+ if (!secure_boot && !audit_mode) {
+ return;
+ }
+
+ if (!s390_validate_secure_boot_device(devtype, &local_error)) {
+ error_report_err(local_error);
+ exit(1);
+ }
+
+ /*
+ * If secure-boot is enabled, then toggle the secure IPL flags (SIPL) to
+ * trigger secure boot in the s390 BIOS.
+ *
+ * Boot process will terminate if any error occurs during secure boot.
+ */
+ if (secure_boot) {
+ iplb->hdr_flags |= DIAG308_IPIB_FLAGS_SIPL;
+ }
+
+ /*
+ * For both secure boot and audit mode, enable the IPL Information
+ * Report (IPLIR) flag so that the firmware generates an IPL
+ * Information Report Block (IIRB).
+ *
+ * Results of secure boot will be stored in IIRB.
+ *
+ * Extend the IPL parameter block to its maximum length to ensure
+ * sufficient space for the BIOS to populate the IIRB.
+ */
+ iplb->hdr_flags |= DIAG308_IPIB_FLAGS_IPLIR;
+ iplb->len = cpu_to_be32(S390_IPLB_MAX_LEN);
+}
+
static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb)
{
CcwDevice *ccw_dev = NULL;
@@ -502,31 +554,8 @@ static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb)
s390_ipl_convert_loadparm((char *)lp, iplb->loadparm);
iplb->flags |= DIAG308_FLAGS_LP_VALID;
- /*
- * If secure-boot is enabled, then toggle the secure IPL flags to
- * trigger secure boot in the s390 BIOS.
- *
- * Boot process will terminate if any error occurs during secure boot.
- *
- * If SIPL is on, IPLIR must also be on.
- */
- if (s390_secure_boot_enabled()) {
- iplb->hdr_flags |= (DIAG308_IPIB_FLAGS_SIPL | DIAG308_IPIB_FLAGS_IPLIR);
- iplb->len = cpu_to_be32(S390_IPLB_MAX_LEN);
- }
- /*
- * Secure boot in audit mode will perform
- * if certificate(s) exist in the key store.
- *
- * IPL Information Report Block (IIRB) will exist
- * for secure boot in audit mode.
- *
- * Results of secure boot will be stored in IIRB.
- */
- else if (s390_has_certificate()) {
- iplb->hdr_flags |= DIAG308_IPIB_FLAGS_IPLIR;
- iplb->len = cpu_to_be32(S390_IPLB_MAX_LEN);
- }
+ s390_apply_secure_boot(iplb, devtype, s390_secure_boot_enabled(),
+ s390_has_certificate());
return true;
}
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 1678ede8fb..6633a2cbaf 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -276,9 +276,6 @@ static void ipl_boot_device(void)
switch (cutype) {
case CU_TYPE_DASD_3990:
case CU_TYPE_DASD_2107:
- IPL_assert((boot_mode == ZIPL_BOOT_MODE_NORMAL),
- "Passthrough (vfio) CCW device does not support secure boot!");
-
dasd_ipl(blk_schid, cutype);
break;
case CU_TYPE_VIRTIO:
--
2.53.0