aboutsummaryrefslogtreecommitdiffstats
path: root/lib/librte_eal/common/arch/x86/rte_hypervisor.c
blob: c38cfc09df8ee88c747a016b78ce84b5d81b794b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright 2017 Mellanox Technologies, Ltd
 */

#include "rte_hypervisor.h"

#include <stdint.h>
#include <string.h>

#include "rte_cpuflags.h"
#include "rte_cpuid.h"

/* See http://lwn.net/Articles/301888/ */
#define HYPERVISOR_INFO_LEAF 0x40000000

enum rte_hypervisor
rte_hypervisor_get(void)
{
	cpuid_registers_t regs;
	int reg;
	char name[13];

	if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_HYPERVISOR))
		return RTE_HYPERVISOR_NONE;

	__cpuid(HYPERVISOR_INFO_LEAF,
			regs[RTE_REG_EAX], regs[RTE_REG_EBX],
			regs[RTE_REG_ECX], regs[RTE_REG_EDX]);
	for (reg = 1; reg < 4; reg++)
		memcpy(name + (reg - 1) * 4, &regs[reg], 4);
	name[12] = '\0';

	if (strcmp("KVMKVMKVM", name) == 0)
		return RTE_HYPERVISOR_KVM;
	if (strcmp("Microsoft Hv", name) == 0)
		return RTE_HYPERVISOR_HYPERV;
	if (strcmp("VMwareVMware", name) == 0)
		return RTE_HYPERVISOR_VMWARE;
	return RTE_HYPERVISOR_UNKNOWN;
}