Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.4:Update
s390-tools.16701
s390-tools-sles15sp2-02-zipl-stage3-correctly-h...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File s390-tools-sles15sp2-02-zipl-stage3-correctly-handle-diag308-response-code.patch of Package s390-tools.16701
Subject: [PATCH] [BZ 186940] zipl/stage3: correctly handle diag308 response code From: Stefan Haberland <sth@linux.ibm.com> Description: zipl: Fix KVM IPL without bootindex Symptom: Failed IPL on KVM when no bootindex is specified. Problem: Without bootindex specified there is no IPL parmblock on KVM which can be read by the stage3 loader. Solution: 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. Reproduction: IPL on KVM without 'bootindex=' attached. Upstream-ID: b7f1977d3f9332f82e7f388fb18076b89b83944e Problem-ID: 186940 Upstream-Description: zipl/stage3: correctly handle diag308 response code 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 <mhartmay@linux.ibm.com> Signed-off-by: Stefan Haberland <sth@linux.ibm.com> Reviewed-by: Marc Hartmayer <mhartmay@linux.ibm.com> Reviewed-by: Philipp Rudo <prudo@linux.ibm.com> Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com> Signed-off-by: Stefan Haberland <sth@linux.ibm.com> --- include/boot/s390.h | 1 + zipl/boot/stage3.c | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) --- a/include/boot/s390.h +++ b/include/boot/s390.h @@ -279,6 +279,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) --- a/zipl/boot/stage3.c +++ b/zipl/boot/stage3.c @@ -55,18 +55,6 @@ static inline void __noreturn start_kern 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) { @@ -124,9 +112,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;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor