Execution of DIAGNOSE 0x318 is fenced by checking an SCLP bit for the availability of hardware support for the instruction. In order to support this instruction for a KVM/QEMU guest, we would need to provide modifications to the SCLP Read SCP Info data, which will in turn reduce the maximum number of CPUs that may be provided to the guest. This issue introduces compatability and legacy concerns. Let's circumvent this issue by removing the bit check and blindly executing the instruction. An exception table rule is in place to catch the case where hardware does not support this instruction. While we're at it, let's condense the version code fields in the diag318_info struct until we can determine how it will be used. This modifies commit 4ad78b8651aacf26b3ab6d1e784952eb70469c43 Signed-off-by: Collin Walling <walling@xxxxxxxxxxxxx> --- arch/s390/include/asm/diag.h | 6 ++---- arch/s390/kernel/setup.c | 12 ++++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/arch/s390/include/asm/diag.h b/arch/s390/include/asm/diag.h index 19562be22b7e..215516284175 100644 --- a/arch/s390/include/asm/diag.h +++ b/arch/s390/include/asm/diag.h @@ -298,10 +298,8 @@ struct diag26c_mac_resp { union diag318_info { unsigned long val; struct { - unsigned int cpnc : 8; - unsigned int cpvc_linux : 24; - unsigned char cpvc_distro[3]; - unsigned char zero; + unsigned long cpnc : 8; + unsigned long cpvc : 56; }; }; diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 2c642af526ce..fe70201f8b5d 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -1011,15 +1011,15 @@ static void __init setup_control_program_code(void) { union diag318_info diag318_info = { .cpnc = CPNC_LINUX, - .cpvc_linux = 0, - .cpvc_distro = {0}, + .cpvc = 0, }; - if (!sclp.has_diag318) - return; - diag_stat_inc(DIAG_STAT_X318); - asm volatile("diag %0,0,0x318\n" : : "d" (diag318_info.val)); + asm volatile( + " diag %0,0,0x318\n" + "0: nopr %%r7\n" + EX_TABLE(0b,0b) + : : "d" (diag318_info.val)); } /* -- 2.20.1