< prev index next >

src/hotspot/cpu/x86/vm_version_x86.cpp

Print this page

        

*** 1669,1695 **** } 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); --- 1669,1692 ---- } else if (vrt == HyperV) { st->print_cr("HyperV virtualization detected"); } } ! void VM_Version::check_virt_cpuid(uint32_t *regs) { // 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 *regs) = (void(*)(uint32_t *regs))code; a->movq(r9, rbx); // save nonvolatile register // next line would not work on 32-bit ! a->movl(rax, 0x40000000); ! a->movptr(r8, c_rarg0 /* rcx */); 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);
*** 1699,1721 **** 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 --- 1696,1706 ---- uint32_t *code_end = (uint32_t *)a->pc(); a->flush(); // execute code ! (*test)(regs); } bool VM_Version::use_biased_locking() { #if INCLUDE_RTM_OPT
*** 1815,1857 **** // // 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; // check for extended metrics from guestlib VirtualizationSupport::initialize(); ! } ! ! 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 --- 1800,1832 ---- // // more information : // https://kb.vmware.com/s/article/1009458 // void VM_Version::check_virtualizations() { ! uint32_t registers[4] = {0}; ! char signature[13] = {0}; ! ! check_virt_cpuid(registers); ! memcpy(signature, &registers[1], 12); if (strncmp("VMwareVMware", signature, 12) == 0) { Abstract_VM_Version::_detected_virtualization = VMWare; // check for extended metrics from guestlib VirtualizationSupport::initialize(); ! } else if (strncmp("Microsoft Hv", signature, 12) == 0) { ! #ifdef _WINDOWS ! if (is_in_VM()) { Abstract_VM_Version::_detected_virtualization = HyperV; } ! #else ! Abstract_VM_Version::_detected_virtualization = HyperV; ! #endif ! } else if (strncmp("KVMKVMKVM", signature, 9) == 0) { Abstract_VM_Version::_detected_virtualization = KVM; ! } else if (strncmp("XenVMMXenVMM", signature, 12) == 0) { Abstract_VM_Version::_detected_virtualization = XenHVM; } } void VM_Version::initialize() { ResourceMark rm; // Making this stub must be FIRST use of assembler
*** 1867,1875 **** get_processor_features(); LP64_ONLY(Assembler::precompute_instructions();) ! if (cpu_family() > 4) { // it supports CPUID check_virtualizations(); } } --- 1842,1850 ---- get_processor_features(); LP64_ONLY(Assembler::precompute_instructions();) ! if (VM_Version::supports_hv()) { // Supports hypervisor check_virtualizations(); } }
< prev index next >