⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kvm_para.h

📁 kvm 源代码
💻 H
字号:
#ifndef __X86_KVM_PARA_H#define __X86_KVM_PARA_H/* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx.  It * should be used to determine that a VM is running under KVM. */#define KVM_CPUID_SIGNATURE	0x40000000/* This CPUID returns a feature bitmap in eax.  Before enabling a particular * paravirtualization, the appropriate feature bit should be checked. */#define KVM_CPUID_FEATURES	0x40000001#ifdef __KERNEL__#include <asm/processor.h>/* This instruction is vmcall.  On non-VT architectures, it will generate a * trap that we will then rewrite to the appropriate instruction. */#define KVM_HYPERCALL ".byte 0x0f,0x01,0xc1"/* For KVM hypercalls, a three-byte sequence of either the vmrun or the vmmrun * instruction.  The hypervisor may replace it with something else but only the * instructions are guaranteed to be supported. * * Up to four arguments may be passed in rbx, rcx, rdx, and rsi respectively. * The hypercall number should be placed in rax and the return value will be * placed in rax.  No other registers will be clobbered unless explicited * noted by the particular hypercall. */static inline long kvm_hypercall0(unsigned int nr){	long ret;	asm volatile(KVM_HYPERCALL		     : "=a"(ret)		     : "a"(nr));	return ret;}static inline long kvm_hypercall1(unsigned int nr, unsigned long p1){	long ret;	asm volatile(KVM_HYPERCALL		     : "=a"(ret)		     : "a"(nr), "b"(p1));	return ret;}static inline long kvm_hypercall2(unsigned int nr, unsigned long p1,				  unsigned long p2){	long ret;	asm volatile(KVM_HYPERCALL		     : "=a"(ret)		     : "a"(nr), "b"(p1), "c"(p2));	return ret;}static inline long kvm_hypercall3(unsigned int nr, unsigned long p1,				  unsigned long p2, unsigned long p3){	long ret;	asm volatile(KVM_HYPERCALL		     : "=a"(ret)		     : "a"(nr), "b"(p1), "c"(p2), "d"(p3));	return ret;}static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,				  unsigned long p2, unsigned long p3,				  unsigned long p4){	long ret;	asm volatile(KVM_HYPERCALL		     : "=a"(ret)		     : "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4));	return ret;}static inline int kvm_para_available(void){	unsigned int eax, ebx, ecx, edx;	char signature[13];	cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx);	memcpy(signature + 0, &ebx, 4);	memcpy(signature + 4, &ecx, 4);	memcpy(signature + 8, &edx, 4);	signature[12] = 0;	if (strcmp(signature, "KVMKVMKVM") == 0)		return 1;	return 0;}static inline unsigned int kvm_arch_para_features(void){	return cpuid_eax(KVM_CPUID_FEATURES);}#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -