< prev index next >
src/hotspot/cpu/x86/vm_version_x86.cpp
Print this page
*** 1669,1721 ****
} 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
--- 1669,1724 ----
} 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);
! void (*test)(uint32_t *regs) = (void(*)(uint32_t *regs))a->pc();
! // 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);
a->cpuid();
! 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);
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
--- 1818,1850 ----
//
// 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, ®isters[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();
}
}
--- 1860,1868 ----
get_processor_features();
LP64_ONLY(Assembler::precompute_instructions();)
! if (VM_Version::supports_hv()) { // Supports hypervisor
check_virtualizations();
}
}
< prev index next >