xref: /dpdk/lib/eal/x86/rte_hypervisor.c (revision 2454b37b3345c7cc05e7cf9faa727add1c259ceb)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2017 Mellanox Technologies, Ltd
3  */
4 
5 #include "rte_hypervisor.h"
6 
7 #include <stdint.h>
8 #include <string.h>
9 
10 #include "rte_cpuflags.h"
11 #include "rte_cpuid.h"
12 
13 /* See http://lwn.net/Articles/301888/ */
14 #define HYPERVISOR_INFO_LEAF 0x40000000
15 
16 enum rte_hypervisor
rte_hypervisor_get(void)17 rte_hypervisor_get(void)
18 {
19 	cpuid_registers_t regs;
20 	int reg;
21 	char name[13];
22 
23 	if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_HYPERVISOR))
24 		return RTE_HYPERVISOR_NONE;
25 
26 #ifdef RTE_TOOLCHAIN_MSVC
27 	__cpuid(regs, HYPERVISOR_INFO_LEAF);
28 #else
29 	__cpuid(HYPERVISOR_INFO_LEAF,
30 			regs[RTE_REG_EAX], regs[RTE_REG_EBX],
31 			regs[RTE_REG_ECX], regs[RTE_REG_EDX]);
32 #endif
33 	for (reg = 1; reg < 4; reg++)
34 		memcpy(name + (reg - 1) * 4, &regs[reg], 4);
35 	name[12] = '\0';
36 
37 	if (strcmp("KVMKVMKVM", name) == 0)
38 		return RTE_HYPERVISOR_KVM;
39 	if (strcmp("Microsoft Hv", name) == 0)
40 		return RTE_HYPERVISOR_HYPERV;
41 	if (strcmp("VMwareVMware", name) == 0)
42 		return RTE_HYPERVISOR_VMWARE;
43 	return RTE_HYPERVISOR_UNKNOWN;
44 }
45