< prev index next >
src/hotspot/cpu/x86/vm_version_x86.cpp
Print this page
@@ -1665,57 +1665,62 @@
st->print_cr("KVM virtualization detected");
} else if (vrt == VMWare) {
st->print_cr("VMWare virtualization detected");
VirtualizationSupport::print_virtualization_info(st);
} else if (vrt == HyperV) {
- st->print_cr("HyperV virtualization detected");
+ st->print_cr("Hyper-V virtualization detected");
+ } else if (vrt == HyperVRole) {
+ st->print_cr("Hyper-V role detected");
}
}
-void VM_Version::check_virt_cpuid(uint32_t idx, uint32_t *regs) {
-// TODO support 32 bit
-#if defined(_LP64)
-#if defined(_MSC_VER)
+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 idx, uint32_t *regs) = (void(*)(uint32_t idx, uint32_t *regs))code;
+ void (*test)(uint32_t *regs) = (void(*)(uint32_t *regs))a->pc();
- a->movq(r9, rbx); // save nonvolatile register
+ // save nonvolatile register
+ a->push(rbx);
+#ifdef _WINDOWS
+ a->push(rsi); // RSI is nonvolatile register for Windows
+#endif
+
+ // Copy 1st argument to SI
+#ifdef _LP64
+ a->movptr(rsi, c_rarg0);
+#else
+ int ofs = 8; // return address + EBX
+#ifdef _WINDOWS
+ ofs += 4; // ESI
+#endif
+ a->movptr(rsi, Address(rsp, ofs));
+#endif
+
+ a->movl(rax, 0x40000000);
- // 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->movl(Address(rsi, 0), rax);
+ a->movl(Address(rsi, 4), rbx);
+ a->movl(Address(rsi, 8), rcx);
+ a->movl(Address(rsi, 12), rdx);
+
+ // restore nonvolatile register
+#ifdef _WINDOWS
+ a->pop(rsi);
+#endif
+ a->pop(rbx);
+
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
+ test(regs);
}
bool VM_Version::use_biased_locking() {
#if INCLUDE_RTM_OPT
@@ -1815,43 +1820,31 @@
//
// 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];
+ uint32_t registers[4] = {0};
+ char signature[13] = {0};
+
+ check_virt_cpuid(registers);
+ memcpy(signature, ®isters[1], 12);
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) {
+ } else if (strncmp("Microsoft Hv", signature, 12) == 0) {
+#ifdef _WINDOWS
+ Abstract_VM_Version::_detected_virtualization = is_in_VM() ? HyperV : HyperVRole;
+#else
Abstract_VM_Version::_detected_virtualization = HyperV;
- }
-
- if (strncmp("KVMKVMKVM", signature, 9) == 0) {
+#endif
+ } else if (strncmp("KVMKVMKVM", signature, 9) == 0) {
Abstract_VM_Version::_detected_virtualization = KVM;
- }
-
- if (strncmp("XenVMMXenVMM", signature, 12) == 0) {
+ } else 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
@@ -1867,9 +1860,9 @@
get_processor_features();
LP64_ONLY(Assembler::precompute_instructions();)
- if (cpu_family() > 4) { // it supports CPUID
+ if (VM_Version::supports_hv()) { // Supports hypervisor
check_virtualizations();
}
}
< prev index next >