From 943c5dc51d493fd89f8c1b0760656446d5653be6 Mon Sep 17 00:00:00 2001 From: Stefan Haberland Date: Thu, 25 Jun 2020 13:07:47 +0200 Subject: [PATCH] zipl/stage3: correctly handle diag308 response code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case diag308 gives a response code 0x102 the stage3 loader can safely assume that no secure IPL is required since no IPL report block exists. Suggested-by: Marc Hartmayer Signed-off-by: Stefan Haberland Reviewed-by: Marc Hartmayer Reviewed-by: Philipp Rudo Tested-by: Marc Hartmayer Signed-off-by: Jan Höppner --- include/boot/s390.h | 1 + zipl/boot/stage3.c | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/include/boot/s390.h b/include/boot/s390.h index 8262f5af..89397a22 100644 --- a/include/boot/s390.h +++ b/include/boot/s390.h @@ -286,6 +286,7 @@ enum diag308_subcode { enum diag308_rc { DIAG308_RC_OK = 0x0001, + DIAG308_RC_NO_CONF = 0x0102, }; static __always_inline unsigned long diag308(unsigned long subcode, void *addr) diff --git a/zipl/boot/stage3.c b/zipl/boot/stage3.c index bb490dc8..254872da 100644 --- a/zipl/boot/stage3.c +++ b/zipl/boot/stage3.c @@ -57,18 +57,6 @@ static inline void __noreturn start_kernel(void) while (1); } -unsigned int store_ipl_parmblock(struct ipl_pl_hdr *pl_hdr) -{ - int rc; - - rc = diag308(DIAG308_STORE, pl_hdr); - if (rc == DIAG308_RC_OK && - pl_hdr->version <= IPL_MAX_SUPPORTED_VERSION) - return 0; - - return 1; -} - unsigned int is_verified_address(unsigned long image_addr) { @@ -126,9 +114,18 @@ secure_boot_enabled() unsigned int rc; pl_hdr = (void *)get_zeroed_page(); - if (!pl_hdr || store_ipl_parmblock(pl_hdr)) + switch (diag308(DIAG308_STORE, pl_hdr)) { + case DIAG308_RC_OK: + rc = pl_hdr->version <= IPL_MAX_SUPPORTED_VERSION && + !!(pl_hdr->flags & IPL_FLAG_SECURE); + break; + case DIAG308_RC_NO_CONF: + rc = 0; + break; + default: panic(ESECUREBOOT, "%s", msg_sipl_noparm); - rc = !!(pl_hdr->flags & IPL_FLAG_SECURE); + break; + } free_page((unsigned long) pl_hdr); return rc;