*              Heiko Carstens <heiko.carstens@de.ibm.com>
  */
 
+#include <linux/compiler.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <asm/processor.h>
 #include <asm/sections.h>
 #include <asm/setup.h>
+#include <asm/sysinfo.h>
 #include <asm/cpcmd.h>
 #include <asm/sclp.h>
 #include "entry.h"
                page_set_storage_key(init_pfn << PAGE_SHIFT, PAGE_DEFAULT_KEY);
 }
 
+static __initdata struct sysinfo_3_2_2 vmms __aligned(PAGE_SIZE);
+
 static noinline __init void detect_machine_type(void)
 {
-       struct cpuinfo_S390 *cpuinfo = &S390_lowcore.cpu_data;
-
-       get_cpu_id(&S390_lowcore.cpu_data.cpu_id);
-
-       /* Running under z/VM ? */
-       if (cpuinfo->cpu_id.version == 0xff)
-               machine_flags |= MACHINE_FLAG_VM;
+       /* No VM information? Looks like LPAR */
+       if (stsi(&vmms, 3, 2, 2) == -ENOSYS)
+               return;
+       if (!vmms.count)
+               return;
 
-       /* Running under KVM ? */
-       if (cpuinfo->cpu_id.version == 0xfe)
+       /* Running under KVM? If not we assume z/VM */
+       if (!memcmp(vmms.vm[0].cpi, "\xd2\xe5\xd4", 3))
                machine_flags |= MACHINE_FLAG_KVM;
+       else
+               machine_flags |= MACHINE_FLAG_VM;
 }
 
 static __init void early_pgm_check_handler(void)
 
        setup_timer(&vcpu->arch.ckc_timer, kvm_s390_idle_wakeup,
                 (unsigned long) vcpu);
        get_cpu_id(&vcpu->arch.cpu_id);
-       vcpu->arch.cpu_id.version = 0xfe;
+       vcpu->arch.cpu_id.version = 0xff;
        return 0;
 }