< prev index next >

src/hotspot/cpu/x86/vm_version_x86.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 1571,1639 **** } } #endif // !PRODUCT } - void VM_Version::print_platform_virtualization_info(outputStream* st) { - VirtualizationType vrt = VM_Version::get_detected_virtualization(); - if (vrt == XenHVM) { - st->print_cr("Xen hardware-assisted virtualization detected"); - } else if (vrt == KVM) { - st->print_cr("KVM virtualization detected"); - } else if (vrt == VMWare) { - st->print_cr("VMWare virtualization detected"); - } else if (vrt == HyperV) { - st->print_cr("HyperV virtualization detected"); - } - } - - void VM_Version::check_virt_cpuid(uint32_t idx, uint32_t *regs) { - // TODO support 32 bit - #if defined(_LP64) - #if defined(_MSC_VER) - // Allocate space for the code - const int code_size = 100; - ResourceMark rm; - CodeBuffer cb("detect_virt", code_size, 0); - MacroAssembler* a = new MacroAssembler(&cb); - address code = a->pc(); - void (*test)(uint32_t idx, uint32_t *regs) = (void(*)(uint32_t idx, uint32_t *regs))code; - - a->movq(r9, rbx); // save nonvolatile register - - // next line would not work on 32-bit - a->movq(rax, c_rarg0 /* rcx */); - a->movq(r8, c_rarg1 /* rdx */); - a->cpuid(); - a->movl(Address(r8, 0), rax); - a->movl(Address(r8, 4), rbx); - a->movl(Address(r8, 8), rcx); - a->movl(Address(r8, 12), rdx); - - a->movq(rbx, r9); // restore nonvolatile register - a->ret(0); - - uint32_t *code_end = (uint32_t *)a->pc(); - a->flush(); - - // execute code - (*test)(idx, regs); - #elif defined(__GNUC__) - __asm__ volatile ( - " cpuid;" - " mov %%eax,(%1);" - " mov %%ebx,4(%1);" - " mov %%ecx,8(%1);" - " mov %%edx,12(%1);" - : "+a" (idx) - : "S" (regs) - : "ebx", "ecx", "edx", "memory" ); - #endif - #endif - } - - bool VM_Version::use_biased_locking() { #if INCLUDE_RTM_OPT // RTM locking is most useful when there is high lock contention and // low data contention. With high lock contention the lock is usually // inflated and biased locking is not suitable for that case. --- 1571,1580 ----
*** 1651,1708 **** } #endif return UseBiasedLocking; } - // On Xen, the cpuid instruction returns - // eax / registers[0]: Version of Xen - // ebx / registers[1]: chars 'XenV' - // ecx / registers[2]: chars 'MMXe' - // edx / registers[3]: chars 'nVMM' - // - // On KVM / VMWare / MS Hyper-V, the cpuid instruction returns - // ebx / registers[1]: chars 'KVMK' / 'VMwa' / 'Micr' - // ecx / registers[2]: chars 'VMKV' / 'reVM' / 'osof' - // edx / registers[3]: chars 'M' / 'ware' / 't Hv' - // - // more information : - // https://kb.vmware.com/s/article/1009458 - // - void VM_Version::check_virtualizations() { - #if defined(_LP64) - uint32_t registers[4]; - char signature[13]; - uint32_t base; - signature[12] = '\0'; - memset((void*)registers, 0, 4*sizeof(uint32_t)); - - for (base = 0x40000000; base < 0x40010000; base += 0x100) { - check_virt_cpuid(base, registers); - - *(uint32_t *)(signature + 0) = registers[1]; - *(uint32_t *)(signature + 4) = registers[2]; - *(uint32_t *)(signature + 8) = registers[3]; - - if (strncmp("VMwareVMware", signature, 12) == 0) { - Abstract_VM_Version::_detected_virtualization = VMWare; - } - - if (strncmp("Microsoft Hv", signature, 12) == 0) { - Abstract_VM_Version::_detected_virtualization = HyperV; - } - - if (strncmp("KVMKVMKVM", signature, 9) == 0) { - Abstract_VM_Version::_detected_virtualization = KVM; - } - - if (strncmp("XenVMMXenVMM", signature, 12) == 0) { - Abstract_VM_Version::_detected_virtualization = XenHVM; - } - } - #endif - } - void VM_Version::initialize() { ResourceMark rm; // Making this stub must be FIRST use of assembler stub_blob = BufferBlob::create("get_cpu_info_stub", stub_size); --- 1592,1601 ----
*** 1713,1721 **** VM_Version_StubGenerator g(&c); get_cpu_info_stub = CAST_TO_FN_PTR(get_cpu_info_stub_t, g.generate_get_cpu_info()); get_processor_features(); - if (cpu_family() > 4) { // it supports CPUID - check_virtualizations(); - } } --- 1606,1611 ----
< prev index next >