From 0020fc2034b4113f0e6c59ba408795e2b63d5e43 Mon Sep 17 00:00:00 2001 From: Alexander Potapenko Date: Mon, 5 Aug 2024 18:19:32 +0200 Subject: sys/linux: declare KVM_{SET,GET,HAS}_DEVICE_ATTR for VMs In addition to device FDs, certain arches (s390 and ARM64) allow applying device attributes to VM FDs (https://docs.kernel.org/virt/kvm/devices/vm.html) Add descriptions for the corresponding ioctls on ARM64, including support for setting SMCCC filters via struct kvm_smccc_filter. --- sys/linux/dev_kvm.txt | 33 +++++++++++++++++++++++++++++++++ sys/linux/dev_kvm.txt.const | 5 +++++ 2 files changed, 38 insertions(+) (limited to 'sys/linux') diff --git a/sys/linux/dev_kvm.txt b/sys/linux/dev_kvm.txt index 16434a1d0..2066b8d78 100644 --- a/sys/linux/dev_kvm.txt +++ b/sys/linux/dev_kvm.txt @@ -147,6 +147,13 @@ ioctl$KVM_SET_DEVICE_ATTR(fd fd_kvmdev, cmd const[KVM_SET_DEVICE_ATTR], arg ptr[ ioctl$KVM_GET_DEVICE_ATTR(fd fd_kvmdev, cmd const[KVM_GET_DEVICE_ATTR], arg ptr[in, kvm_device_attr]) ioctl$KVM_HAS_DEVICE_ATTR(fd fd_kvmdev, cmd const[KVM_HAS_DEVICE_ATTR], arg ptr[in, kvm_device_attr]) +# From https://docs.kernel.org/virt/kvm/devices/vm.html: +# The virtual machine “device” also accepts the ioctls KVM_SET_DEVICE_ATTR, KVM_GET_DEVICE_ATTR, and KVM_HAS_DEVICE_ATTR. +# The interface uses the same struct kvm_device_attr as other devices, but targets VM-wide settings and controls. +ioctl$KVM_SET_DEVICE_ATTR_vm(fd fd_kvmvm, cmd const[KVM_SET_DEVICE_ATTR], arg ptr[in, kvm_device_attr_vm]) +ioctl$KVM_GET_DEVICE_ATTR_vm(fd fd_kvmvm, cmd const[KVM_GET_DEVICE_ATTR], arg ptr[in, kvm_device_attr_vm]) +ioctl$KVM_HAS_DEVICE_ATTR_vm(fd fd_kvmvm, cmd const[KVM_HAS_DEVICE_ATTR], arg ptr[in, kvm_device_attr_vm]) + kvm_mem_region_flags = KVM_MEM_LOG_DIRTY_PAGES, KVM_MEM_READONLY kvm_mp_state = KVM_MP_STATE_RUNNABLE, KVM_MP_STATE_UNINITIALIZED, KVM_MP_STATE_INIT_RECEIVED, KVM_MP_STATE_HALTED, KVM_MP_STATE_SIPI_RECEIVED, KVM_MP_STATE_STOPPED, KVM_MP_STATE_CHECK_STOP, KVM_MP_STATE_OPERATING, KVM_MP_STATE_LOAD kvm_irq_routing_entry_type = KVM_IRQ_ROUTING_IRQCHIP, KVM_IRQ_ROUTING_MSI, KVM_IRQ_ROUTING_S390_ADAPTER, KVM_IRQ_ROUTING_HV_SINT @@ -406,6 +413,32 @@ kvm_device_attr { addr ptr64[in, int64] } +kvm_device_attr_vm [ + attr_arm64 kvm_device_attr_vm_arm64 + attr_other kvm_device_attr +] + +kvm_vm_attr_group_arm64 = KVM_ARM_VM_SMCCC_CTRL +kvm_vm_attr_attr_arm64 = KVM_ARM_VM_SMCCC_FILTER + +# TODO(glider): as of now the only supported argument is kvm_smccc_filter. +# Need to make addr point to a union when this changes. +kvm_device_attr_vm_arm64 { + flags const[0, int32] + group flags[kvm_vm_attr_group_arm64, int32] + attr flags[kvm_vm_attr_attr_arm64, int64] + addr ptr64[in, kvm_smccc_filter] +} + +kvm_smccc_filter_action = KVM_SMCCC_FILTER_HANDLE, KVM_SMCCC_FILTER_DENY, KVM_SMCCC_FILTER_FWD_TO_USER + +kvm_smccc_filter { + base int32 + nr_functions int32 + action flags[kvm_smccc_filter_action, int8] + pad array[const[0, int8], 15] +} + kvm_create_device { type flags[kvm_device_type, int32] (in) fd fd_kvmdev (out) diff --git a/sys/linux/dev_kvm.txt.const b/sys/linux/dev_kvm.txt.const index 8967b9015..96a05cf9c 100644 --- a/sys/linux/dev_kvm.txt.const +++ b/sys/linux/dev_kvm.txt.const @@ -13,6 +13,8 @@ KVM_ARM_VCPU_INIT = 386:amd64:mips64le:ppc64le:s390x:???, arm64:1075883694 KVM_ARM_VCPU_PMU_V3 = 386:amd64:mips64le:ppc64le:s390x:???, arm64:3 KVM_ARM_VCPU_POWER_OFF = 386:amd64:mips64le:ppc64le:s390x:???, arm64:0 KVM_ARM_VCPU_PSCI_0_2 = 386:amd64:mips64le:ppc64le:s390x:???, arm64:2 +KVM_ARM_VM_SMCCC_CTRL = 386:amd64:mips64le:ppc64le:s390x:???, arm64:0 +KVM_ARM_VM_SMCCC_FILTER = 386:amd64:mips64le:ppc64le:s390x:???, arm64:0 KVM_ASSIGN_DEV_IRQ = 1077980784 KVM_ASSIGN_PCI_DEVICE = 2151722601 KVM_ASSIGN_SET_INTX_MASK = 1077980836 @@ -197,6 +199,9 @@ KVM_SET_VCPU_EVENTS = 1077980832, mips64le:ppc64le:s390x:??? KVM_SET_XCRS = 1099476647, arm64:mips64le:ppc64le:s390x:??? KVM_SET_XSAVE = 1342221989, arm64:mips64le:ppc64le:s390x:??? KVM_SIGNAL_MSI = 1075883685, mips64le:ppc64le:2149625509 +KVM_SMCCC_FILTER_DENY = 386:amd64:mips64le:ppc64le:s390x:???, arm64:1 +KVM_SMCCC_FILTER_FWD_TO_USER = 386:amd64:mips64le:ppc64le:s390x:???, arm64:2 +KVM_SMCCC_FILTER_HANDLE = 386:amd64:mips64le:ppc64le:s390x:???, arm64:0 KVM_SMI = 44727, mips64le:ppc64le:536915639 KVM_STATE_NESTED_GUEST_MODE = 1, arm64:mips64le:ppc64le:s390x:??? KVM_STATE_NESTED_RUN_PENDING = 2, arm64:mips64le:ppc64le:s390x:??? -- cgit mrf-deployment