kvm: decode the argument of KVM_CHECK_EXTENSION

xlat/kvm_cap.in has been generated using the following command line:

grep '#define\s\+KVM_CAP' $linux/include/uapi/linux/kvm.h |
sed -E -e 's/^#define\s+([^ \t]+)\s*([0-9]+).*$/printf "%-40s%s\n" \1 \2/e' \
       -e 's/ {8}/\t/g; s/ +/\t/g'

* xlat/kvm_cap.in: New file.
* kvm.c: Include "xlat/kvm_cap.h".
(kvm_ioctl_decode_check_extension): New function.
(kvm_ioctl): Use it.
* tests/ioctl_kvm_run_common.c (main): Check decoding
of KVM_CHECK_EXTENSION command.

Signed-off-by: Pierre Marsais <pierre.marsais@lse.epita.fr>
This commit is contained in:
Pierre Marsais 2018-08-16 20:04:41 +01:00 committed by Dmitry V. Levin
parent 0f09267db0
commit e38143b00e
3 changed files with 170 additions and 0 deletions

13
kvm.c
View File

@ -323,6 +323,16 @@ kvm_ioctl_decode_sregs(struct tcb *const tcp, const unsigned int code,
}
# endif /* HAVE_STRUCT_KVM_SREGS */
# include "xlat/kvm_cap.h"
static int
kvm_ioctl_decode_check_extension(struct tcb *const tcp, const unsigned int code,
const kernel_ulong_t arg)
{
tprints(", ");
printxval_index(kvm_cap, arg, "KVM_CAP_???");
return RVAL_IOCTL_DECODED;
}
# include "xlat/kvm_exit_reason.h"
static void
kvm_ioctl_run_attach_auxstr(struct tcb *const tcp,
@ -403,6 +413,9 @@ kvm_ioctl(struct tcb *const tcp, const unsigned int code, const kernel_ulong_t a
return kvm_ioctl_decode_cpuid2(tcp, code, arg);
# endif
case KVM_CHECK_EXTENSION:
return kvm_ioctl_decode_check_extension(tcp, code, arg);
case KVM_CREATE_VM:
return RVAL_DECODED | RVAL_FD;

View File

@ -306,6 +306,11 @@ main(void)
printf("ioctl(%d<%s>, KVM_GET_API_VERSION, 0) = %d\n",
kvm, dev, ret);
ret = KVM_IOCTL(kvm, KVM_CHECK_EXTENSION,
(void *) (uintptr_t) KVM_CAP_USER_MEMORY);
printf("ioctl(%d<%s>, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY) = %d\n",
kvm, dev, ret);
int vm_fd = KVM_IOCTL(kvm, KVM_CREATE_VM, 0);
printf("ioctl(%d<%s>, KVM_CREATE_VM, 0) = %d<%s>\n",
kvm, dev, vm_fd, vm_dev);

152
xlat/kvm_cap.in Normal file
View File

@ -0,0 +1,152 @@
#value_indexed
KVM_CAP_IRQCHIP 0
KVM_CAP_HLT 1
KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2
KVM_CAP_USER_MEMORY 3
KVM_CAP_SET_TSS_ADDR 4
KVM_CAP_VAPIC 6
KVM_CAP_EXT_CPUID 7
KVM_CAP_CLOCKSOURCE 8
KVM_CAP_NR_VCPUS 9
KVM_CAP_NR_MEMSLOTS 10
KVM_CAP_PIT 11
KVM_CAP_NOP_IO_DELAY 12
KVM_CAP_PV_MMU 13
KVM_CAP_MP_STATE 14
KVM_CAP_COALESCED_MMIO 15
KVM_CAP_SYNC_MMU 16
KVM_CAP_IOMMU 18
KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
KVM_CAP_USER_NMI 22
KVM_CAP_SET_GUEST_DEBUG 23
KVM_CAP_REINJECT_CONTROL 24
KVM_CAP_IRQ_ROUTING 25
KVM_CAP_IRQ_INJECT_STATUS 26
KVM_CAP_ASSIGN_DEV_IRQ 29
KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
KVM_CAP_MCE 31
KVM_CAP_IRQFD 32
KVM_CAP_PIT2 33
KVM_CAP_SET_BOOT_CPU_ID 34
KVM_CAP_PIT_STATE2 35
KVM_CAP_IOEVENTFD 36
KVM_CAP_SET_IDENTITY_MAP_ADDR 37
KVM_CAP_XEN_HVM 38
KVM_CAP_ADJUST_CLOCK 39
KVM_CAP_INTERNAL_ERROR_DATA 40
KVM_CAP_VCPU_EVENTS 41
KVM_CAP_S390_PSW 42
KVM_CAP_PPC_SEGSTATE 43
KVM_CAP_HYPERV 44
KVM_CAP_HYPERV_VAPIC 45
KVM_CAP_HYPERV_SPIN 46
KVM_CAP_PCI_SEGMENT 47
KVM_CAP_PPC_PAIRED_SINGLES 48
KVM_CAP_INTR_SHADOW 49
KVM_CAP_DEBUGREGS 50
KVM_CAP_X86_ROBUST_SINGLESTEP 51
KVM_CAP_PPC_OSI 52
KVM_CAP_PPC_UNSET_IRQ 53
KVM_CAP_ENABLE_CAP 54
KVM_CAP_XSAVE 55
KVM_CAP_XCRS 56
KVM_CAP_PPC_GET_PVINFO 57
KVM_CAP_PPC_IRQ_LEVEL 58
KVM_CAP_ASYNC_PF 59
KVM_CAP_TSC_CONTROL 60
KVM_CAP_GET_TSC_KHZ 61
KVM_CAP_PPC_BOOKE_SREGS 62
KVM_CAP_SPAPR_TCE 63
KVM_CAP_PPC_SMT 64
KVM_CAP_PPC_RMA 65
KVM_CAP_MAX_VCPUS 66
KVM_CAP_PPC_HIOR 67
KVM_CAP_PPC_PAPR 68
KVM_CAP_SW_TLB 69
KVM_CAP_ONE_REG 70
KVM_CAP_S390_GMAP 71
KVM_CAP_TSC_DEADLINE_TIMER 72
KVM_CAP_S390_UCONTROL 73
KVM_CAP_SYNC_REGS 74
KVM_CAP_PCI_2_3 75
KVM_CAP_KVMCLOCK_CTRL 76
KVM_CAP_SIGNAL_MSI 77
KVM_CAP_PPC_GET_SMMU_INFO 78
KVM_CAP_S390_COW 79
KVM_CAP_PPC_ALLOC_HTAB 80
KVM_CAP_READONLY_MEM 81
KVM_CAP_IRQFD_RESAMPLE 82
KVM_CAP_PPC_BOOKE_WATCHDOG 83
KVM_CAP_PPC_HTAB_FD 84
KVM_CAP_S390_CSS_SUPPORT 85
KVM_CAP_PPC_EPR 86
KVM_CAP_ARM_PSCI 87
KVM_CAP_ARM_SET_DEVICE_ADDR 88
KVM_CAP_DEVICE_CTRL 89
KVM_CAP_IRQ_MPIC 90
KVM_CAP_PPC_RTAS 91
KVM_CAP_IRQ_XICS 92
KVM_CAP_ARM_EL1_32BIT 93
KVM_CAP_SPAPR_MULTITCE 94
KVM_CAP_EXT_EMUL_CPUID 95
KVM_CAP_HYPERV_TIME 96
KVM_CAP_IOAPIC_POLARITY_IGNORED 97
KVM_CAP_ENABLE_CAP_VM 98
KVM_CAP_S390_IRQCHIP 99
KVM_CAP_IOEVENTFD_NO_LENGTH 100
KVM_CAP_VM_ATTRIBUTES 101
KVM_CAP_ARM_PSCI_0_2 102
KVM_CAP_PPC_FIXUP_HCALL 103
KVM_CAP_PPC_ENABLE_HCALL 104
KVM_CAP_CHECK_EXTENSION_VM 105
KVM_CAP_S390_USER_SIGP 106
KVM_CAP_S390_VECTOR_REGISTERS 107
KVM_CAP_S390_MEM_OP 108
KVM_CAP_S390_USER_STSI 109
KVM_CAP_S390_SKEYS 110
KVM_CAP_MIPS_FPU 111
KVM_CAP_MIPS_MSA 112
KVM_CAP_S390_INJECT_IRQ 113
KVM_CAP_S390_IRQ_STATE 114
KVM_CAP_PPC_HWRNG 115
KVM_CAP_DISABLE_QUIRKS 116
KVM_CAP_X86_SMM 117
KVM_CAP_MULTI_ADDRESS_SPACE 118
KVM_CAP_GUEST_DEBUG_HW_BPS 119
KVM_CAP_GUEST_DEBUG_HW_WPS 120
KVM_CAP_SPLIT_IRQCHIP 121
KVM_CAP_IOEVENTFD_ANY_LENGTH 122
KVM_CAP_HYPERV_SYNIC 123
KVM_CAP_S390_RI 124
KVM_CAP_SPAPR_TCE_64 125
KVM_CAP_ARM_PMU_V3 126
KVM_CAP_VCPU_ATTRIBUTES 127
KVM_CAP_MAX_VCPU_ID 128
KVM_CAP_X2APIC_API 129
KVM_CAP_S390_USER_INSTR0 130
KVM_CAP_MSI_DEVID 131
KVM_CAP_PPC_HTM 132
KVM_CAP_SPAPR_RESIZE_HPT 133
KVM_CAP_PPC_MMU_RADIX 134
KVM_CAP_PPC_MMU_HASH_V3 135
KVM_CAP_IMMEDIATE_EXIT 136
KVM_CAP_MIPS_VZ 137
KVM_CAP_MIPS_TE 138
KVM_CAP_MIPS_64BIT 139
KVM_CAP_S390_GS 140
KVM_CAP_S390_AIS 141
KVM_CAP_SPAPR_TCE_VFIO 142
KVM_CAP_X86_DISABLE_EXITS 143
KVM_CAP_ARM_USER_IRQ 144
KVM_CAP_S390_CMMA_MIGRATION 145
KVM_CAP_PPC_FWNMI 146
KVM_CAP_PPC_SMT_POSSIBLE 147
KVM_CAP_HYPERV_SYNIC2 148
KVM_CAP_HYPERV_VP_INDEX 149
KVM_CAP_S390_AIS_MIGRATION 150
KVM_CAP_PPC_GET_CPU_CHAR 151
KVM_CAP_S390_BPB 152
KVM_CAP_GET_MSR_FEATURES 153
KVM_CAP_HYPERV_EVENTFD 154
KVM_CAP_HYPERV_TLBFLUSH 155
KVM_CAP_S390_HPAGE_1M 156