| From 03aa047ef2db4985e444af6ee1c1dd084ad9fb4c Mon Sep 17 00:00:00 2001 |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| Date: Fri, 9 Nov 2018 09:21:47 +0100 |
| Subject: s390/early: improve machine detection |
| |
| From: Christian Borntraeger <borntraeger@de.ibm.com> |
| |
| commit 03aa047ef2db4985e444af6ee1c1dd084ad9fb4c upstream. |
| |
| Right now the early machine detection code check stsi 3.2.2 for "KVM" |
| and set MACHINE_IS_VM if this is different. As the console detection |
| uses diagnose 8 if MACHINE_IS_VM returns true this will crash Linux |
| early for any non z/VM system that sets a different value than KVM. |
| So instead of assuming z/VM, do not set any of MACHINE_IS_LPAR, |
| MACHINE_IS_VM, or MACHINE_IS_KVM. |
| |
| CC: stable@vger.kernel.org |
| Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/s390/kernel/early.c | 4 ++-- |
| arch/s390/kernel/setup.c | 2 ++ |
| 2 files changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/arch/s390/kernel/early.c |
| +++ b/arch/s390/kernel/early.c |
| @@ -63,10 +63,10 @@ static noinline __init void detect_machi |
| if (stsi(vmms, 3, 2, 2) || !vmms->count) |
| return; |
| |
| - /* Running under KVM? If not we assume z/VM */ |
| + /* Detect known hypervisors */ |
| if (!memcmp(vmms->vm[0].cpi, "\xd2\xe5\xd4", 3)) |
| S390_lowcore.machine_flags |= MACHINE_FLAG_KVM; |
| - else |
| + else if (!memcmp(vmms->vm[0].cpi, "\xa9\x61\xe5\xd4", 4)) |
| S390_lowcore.machine_flags |= MACHINE_FLAG_VM; |
| } |
| |
| --- a/arch/s390/kernel/setup.c |
| +++ b/arch/s390/kernel/setup.c |
| @@ -1006,6 +1006,8 @@ void __init setup_arch(char **cmdline_p) |
| pr_info("Linux is running under KVM in 64-bit mode\n"); |
| else if (MACHINE_IS_LPAR) |
| pr_info("Linux is running natively in 64-bit mode\n"); |
| + else |
| + pr_info("Linux is running as a guest in 64-bit mode\n"); |
| |
| /* Have one command line that is parsed and saved in /proc/cmdline */ |
| /* boot_command_line has been already set up in early.c */ |