RFR: 8250598: Hyper-V is detected in spite of running on host OS
Yasumasa Suenaga
suenaga at oss.nttdata.com
Mon Jul 27 08:42:21 UTC 2020
On 2020/07/27 17:33, Yasumasa Suenaga wrote:
...snip...
>>> VM_Version::check_virtualizations() would check whether the process is running on virtual machine with CPUID (EAX = 40000000h to 4000ff00h, however it would detect Hyper-V (CPUID returns "Microsoft Hv") even if the process is running on host OS. It should be check in other solution (e.g. WMI)
>>>
>>> This is a problem in Hyper-V, but I found out some related issues in hypervisor detection code, so I want to fix them together:
>>>
>>> - Lack of x86 (32 bit) support
>>> - Lack of hypervisor present bit (bit 31) check
>>
>> Okay so I'm going to assume that a system might fill out the CPUID leaf values unconditionally and expect the programmers to check bit 31 and only if it is enabled use the information from the leaf. Hence the current code reports Hyper-V when it isn't enabled. But the new code can just skip all the leaf reading when it isn't enabled - right? (so startup should be marginally faster)
>
> The current code reports Hyper-V even if it is running on native OS (root partition - not a guest OS).
> In root partition, bit 31 is always 1 and Hyper-V is always reported (CPUID always returns "Microsoft Hv")
>
> To avoid this problem, the new code would check with WMI whether it is running on Virtual Machine or not.
I cannot evaluate, but I guess bit 31 is 0 when Hyper-V is not installed.
If so, the new code skip all the leaf reading as you said.
Thanks,
Yasumasa
>> Thanks,
>> David
>> -----
>>
>>> - Calling CPUID with other than EAX = 40000000h
>>>
>>> If they are the cause of confusing, I can separate them in other issues.
>>> (They are not Hyper-V specific issues)
>>>
>>>
>>> Thanks,
>>>
>>> Yasumasa
>>>
>>>
>>>> Thanks,
>>>> David
>>>>
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Yasumasa
>>>>>
>>>>>
>>>>>> Thanks,
>>>>>> David
>>>>>> -----
>>>>>>
>>>>>>>> According to [1], root partition is as a host OS, so I guess JVM would detect which is running on Hyper-V even if it is running on host OS.
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>>
>>>>>>>> Yasumasa
>>>>>>>>
>>>>>>>>
>>>>>>>> [1] https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-architecture
>>>>>>>>
>>>>>>>>
>>>>>>>>> David
>>>>>>>>> -----
>>>>>>>>>
>>>>>>>>>> - Does not check CPUID hypervisor present bit [1]
>>>>>>>>>> - Does not support x86 (32bit) platform
>>>>>>>>>>
>>>>>>>>>> I've tested this change on submit repo, and have checked output from VM.info jcmd on following environment:
>>>>>>>>>>
>>>>>>>>>> - Windows x64 (host)
>>>>>>>>>> - Windows x64 (Hyper-V guest)
>>>>>>>>>> - Fedora32 x64 (Hyper-V guest)
>>>>>>>>>> - 32 bit JDK on Fedora32 x64 (Hyper-V guest)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>>
>>>>>>>>>> Yasumasa
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> [1] https://kb.vmware.com/s/article/1009458
More information about the hotspot-runtime-dev
mailing list