# Copyright 2015 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

meta arches["386", "amd64", "arm64", "mips64le", "ppc64le", "s390x", "riscv64"]

include <linux/kvm.h>
include <linux/kvm_host.h>
include <uapi/linux/fcntl.h>
include <asm/mce.h>
include <linux/falloc.h>

resource fd_kvm[fd]
resource fd_kvmvm[fd]
resource fd_kvmcpu[fd]
resource fd_kvmdev[fd]
resource fd_kvm_guest_memfd[fd]
resource vcpu_mmap_size[int64]

openat$kvm(fd const[AT_FDCWD], file ptr[in, string["/dev/kvm"]], flags flags[open_flags], mode const[0]) fd_kvm

# On x86, KVM_CREATE_VM accepts types 0 to 3.
# On ARM64 it is either 0 (default size of 40 bits) or the guest address space size in bits, from 32 to the platform limit.
ioctl$KVM_CREATE_VM(fd fd_kvm, cmd const[KVM_CREATE_VM], type intptr[0:64]) fd_kvmvm
ioctl$KVM_CHECK_EXTENSION(fd fd_kvm, cmd const[KVM_CHECK_EXTENSION], arg intptr)
ioctl$KVM_CHECK_EXTENSION_VM(fd fd_kvmvm, cmd const[KVM_CHECK_EXTENSION], arg intptr)
ioctl$KVM_GET_VCPU_MMAP_SIZE(fd fd_kvm, cmd const[KVM_GET_VCPU_MMAP_SIZE]) vcpu_mmap_size

ioctl$KVM_GET_API_VERSION(fd fd_kvm, cmd const[KVM_GET_API_VERSION], type const[0])
ioctl$KVM_CREATE_VCPU(fd fd_kvmvm, cmd const[KVM_CREATE_VCPU], id intptr[0:2]) fd_kvmcpu
ioctl$KVM_GET_DIRTY_LOG(fd fd_kvmvm, cmd const[KVM_GET_DIRTY_LOG], arg ptr[inout, kvm_dirty_log])
ioctl$KVM_CLEAR_DIRTY_LOG(fd fd_kvmvm, cmd const[KVM_CLEAR_DIRTY_LOG], arg ptr[in, kvm_clear_dirty_log])
ioctl$KVM_RESET_DIRTY_RINGS(fd fd_kvmvm, cmd const[KVM_RESET_DIRTY_RINGS])
ioctl$KVM_CREATE_IRQCHIP(fd fd_kvmvm, cmd const[KVM_CREATE_IRQCHIP])
ioctl$KVM_IRQ_LINE(fd fd_kvmvm, cmd const[KVM_IRQ_LINE], arg ptr[in, kvm_irq_level])
ioctl$KVM_IRQ_LINE_STATUS(fd fd_kvmvm, cmd const[KVM_IRQ_LINE_STATUS], arg ptr[inout, kvm_irq_level])
ioctl$KVM_SET_USER_MEMORY_REGION(fd fd_kvmvm, cmd const[KVM_SET_USER_MEMORY_REGION], arg ptr[in, kvm_userspace_memory_region])
ioctl$KVM_SET_USER_MEMORY_REGION2(fd fd_kvmvm, cmd const[KVM_SET_USER_MEMORY_REGION2], arg ptr[in, kvm_userspace_memory_region2])
ioctl$KVM_PPC_GET_PVINFO(fd fd_kvmvm, cmd const[KVM_PPC_GET_PVINFO], arg buffer[out])
ioctl$KVM_SET_GSI_ROUTING(fd fd_kvmvm, cmd const[KVM_SET_GSI_ROUTING], arg ptr[in, kvm_irq_routing]) (no_squash)
ioctl$KVM_ASSIGN_SET_MSIX_NR(fd fd_kvmvm, cmd const[KVM_ASSIGN_SET_MSIX_NR], arg ptr[in, kvm_assigned_msix_nr])
ioctl$KVM_ASSIGN_SET_MSIX_ENTRY(fd fd_kvmvm, cmd const[KVM_ASSIGN_SET_MSIX_ENTRY], arg ptr[in, kvm_assigned_msix_entry])
ioctl$KVM_IOEVENTFD(fd fd_kvmvm, cmd const[KVM_IOEVENTFD], arg ptr[in, kvm_ioeventfd])
ioctl$KVM_SIGNAL_MSI(fd fd_kvmvm, cmd const[KVM_SIGNAL_MSI], arg ptr[in, kvm_msi])
ioctl$KVM_PPC_GET_SMMU_INFO(fd fd_kvmvm, cmd const[KVM_PPC_GET_SMMU_INFO], arg buffer[out])
ioctl$KVM_IRQFD(fd fd_kvmvm, cmd const[KVM_IRQFD], arg ptr[in, kvm_irqfd])
ioctl$KVM_PPC_ALLOCATE_HTAB(fd fd_kvmvm, cmd const[KVM_PPC_ALLOCATE_HTAB], arg ptr[in, int32])
ioctl$KVM_CREATE_DEVICE(fd fd_kvmvm, cmd const[KVM_CREATE_DEVICE], arg ptr[inout, kvm_create_device])
ioctl$KVM_REGISTER_COALESCED_MMIO(fd fd_kvmvm, cmd const[KVM_REGISTER_COALESCED_MMIO], arg ptr[in, kvm_coalesced_mmio_zone])
ioctl$KVM_UNREGISTER_COALESCED_MMIO(fd fd_kvmvm, cmd const[KVM_UNREGISTER_COALESCED_MMIO], arg ptr[in, kvm_coalesced_mmio_zone])
ioctl$KVM_GET_STATS_FD_vm(fd fd_kvmvm, cmd const[KVM_GET_STATS_FD]) fd
ioctl$KVM_GET_STATS_FD_cpu(fd fd_kvmcpu, cmd const[KVM_GET_STATS_FD]) fd

ioctl$KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2, flags[kvm_dirty_log_protect, int64]]])
ioctl$KVM_CAP_HALT_POLL(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HALT_POLL, int64]])
ioctl$KVM_CAP_DIRTY_LOG_RING(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_DIRTY_LOG_RING, flags[kvm_dirty_log_sizes, int64]]])
ioctl$KVM_CAP_DIRTY_LOG_RING_ACQ_REL(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_DIRTY_LOG_RING_ACQ_REL, flags[kvm_dirty_log_sizes, int64]]])
ioctl$KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP, flags[kvm_dirty_log_sizes, int64]]])

# TODO: need more precise handling for arguments below
ioctl$KVM_CAP_PTP_KVM(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_PTP_KVM, void]])

ioctl$KVM_RUN(fd fd_kvmcpu, cmd const[KVM_RUN], arg const[0])
ioctl$KVM_GET_REGS(fd fd_kvmcpu, cmd const[KVM_GET_REGS], arg ptr[out, kvm_regs])
ioctl$KVM_SET_REGS(fd fd_kvmcpu, cmd const[KVM_SET_REGS], arg ptr[in, kvm_regs])
ioctl$KVM_GET_SREGS(fd fd_kvmcpu, cmd const[KVM_GET_SREGS], arg ptr[out, kvm_sregs])
ioctl$KVM_SET_SREGS(fd fd_kvmcpu, cmd const[KVM_SET_SREGS], arg ptr[in, kvm_sregs])
ioctl$KVM_INTERRUPT(fd fd_kvmcpu, cmd const[KVM_INTERRUPT], arg ptr[in, int32])
ioctl$KVM_SET_SIGNAL_MASK(fd fd_kvmcpu, cmd const[KVM_SET_SIGNAL_MASK], arg ptr[in, kvm_signal_mask]) (no_squash)
ioctl$KVM_GET_VCPU_EVENTS(fd fd_kvmcpu, cmd const[KVM_GET_VCPU_EVENTS], arg ptr[out, kvm_vcpu_events])
ioctl$KVM_SET_VCPU_EVENTS(fd fd_kvmcpu, cmd const[KVM_SET_VCPU_EVENTS], arg ptr[in, kvm_vcpu_events])
ioctl$KVM_GET_MP_STATE(fd fd_kvmcpu, cmd const[KVM_GET_MP_STATE], arg ptr[out, int32])
ioctl$KVM_SET_MP_STATE(fd fd_kvmcpu, cmd const[KVM_SET_MP_STATE], arg ptr[in, flags[kvm_mp_state, int32]])
ioctl$KVM_DIRTY_TLB(fd fd_kvmcpu, cmd const[KVM_DIRTY_TLB], arg ptr[in, kvm_dirty_tlb])
# NEED: arch constraints for syscalls. These are s390-specific, but consts are present on all arches, so they are not disabled on other arches.
ioctl$KVM_S390_UCAS_MAP(fd fd_kvmcpu, cmd const[KVM_S390_UCAS_MAP], arg ptr[in, kvm_s390_ucas_mapping])
ioctl$KVM_S390_UCAS_UNMAP(fd fd_kvmcpu, cmd const[KVM_S390_UCAS_UNMAP], arg ptr[in, kvm_s390_ucas_mapping])
ioctl$KVM_S390_VCPU_FAULT(fd fd_kvmcpu, cmd const[KVM_S390_VCPU_FAULT], arg ptr[in, int64])
ioctl$KVM_SET_ONE_REG(fd fd_kvmcpu, cmd const[KVM_SET_ONE_REG], arg ptr[in, kvm_one_reg])
ioctl$KVM_GET_ONE_REG(fd fd_kvmcpu, cmd const[KVM_GET_ONE_REG], arg ptr[in, kvm_one_reg])
ioctl$KVM_KVMCLOCK_CTRL(fd fd_kvmcpu, cmd const[KVM_KVMCLOCK_CTRL])
ioctl$KVM_S390_INTERRUPT_CPU(fd fd_kvmcpu, cmd const[KVM_S390_INTERRUPT], arg ptr[in, kvm_s390_interrupt])
ioctl$KVM_GET_REG_LIST(fd fd_kvmcpu, cmd const[KVM_GET_REG_LIST], arg ptr[inout, kvm_reg_list])
ioctl$KVM_SET_DEVICE_ATTR(fd fd_kvmdev, cmd const[KVM_SET_DEVICE_ATTR], arg ptr[in, kvm_device_attr])
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/vcpu.html:
# The virtual cpu “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 VCPU-wide settings and controls.
ioctl$KVM_SET_DEVICE_ATTR_vcpu(fd fd_kvmcpu, cmd const[KVM_SET_DEVICE_ATTR], arg ptr[in, kvm_device_attr_vcpu])
ioctl$KVM_GET_DEVICE_ATTR_vcpu(fd fd_kvmcpu, cmd const[KVM_GET_DEVICE_ATTR], arg ptr[in, kvm_device_attr_vcpu])
ioctl$KVM_HAS_DEVICE_ATTR_vcpu(fd fd_kvmcpu, cmd const[KVM_HAS_DEVICE_ATTR], arg ptr[in, kvm_device_attr_vcpu])

# 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])

ioctl$KVM_CREATE_GUEST_MEMFD(fd fd_kvmvm, cmd const[KVM_CREATE_GUEST_MEMFD], arg ptr[in, kvm_create_guest_memfd]) fd_kvm_guest_memfd
ioctl$KVM_PRE_FAULT_MEMORY(fd fd_kvmcpu, cmd const[KVM_PRE_FAULT_MEMORY], arg ptr[inout, kvm_pre_fault_memory])
ioctl$KVM_SET_MEMORY_ATTRIBUTES(fd fd_kvmvm, cmd const[KVM_SET_MEMORY_ATTRIBUTES], arg ptr[in, kvm_memory_attributes])
fallocate$kvm_guest_memfd(fd fd_kvm_guest_memfd, mode flags[fallocate_mode], off flags[kvm_guest_addr_offsets], len flags[kvm_guest_addr_size])

kvm_mem_region_flags = KVM_MEM_LOG_DIRTY_PAGES, KVM_MEM_READONLY, KVM_MEM_GUEST_MEMFD
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, KVM_IRQ_ROUTING_XEN_EVTCHN
kvm_ioeventfd_flags = KVM_IOEVENTFD_FLAG_DATAMATCH, KVM_IOEVENTFD_FLAG_PIO, KVM_IOEVENTFD_FLAG_DEASSIGN, KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY
kvm_ioeventfd_len = 0, 1, 2, 4, 8
kvm_device_type = KVM_DEV_TYPE_FSL_MPIC_20, KVM_DEV_TYPE_FSL_MPIC_42, KVM_DEV_TYPE_XICS, KVM_DEV_TYPE_VFIO, KVM_DEV_TYPE_ARM_VGIC_V2, KVM_DEV_TYPE_FLIC, KVM_DEV_TYPE_ARM_VGIC_V3, KVM_DEV_TYPE_ARM_VGIC_ITS, KVM_DEV_TYPE_XIVE, KVM_DEV_TYPE_ARM_PV_TIME, KVM_DEV_TYPE_RISCV_AIA
kvm_device_flags = 0, KVM_CREATE_DEVICE_TEST
kvm_guest_debug_flags = KVM_GUESTDBG_ENABLE, KVM_GUESTDBG_SINGLESTEP, KVM_GUESTDBG_USE_SW_BP, KVM_GUESTDBG_USE_HW_BP, KVM_GUESTDBG_USE_HW, KVM_GUESTDBG_INJECT_DB, KVM_GUESTDBG_INJECT_BP, KVM_GUESTDBG_EXIT_PENDING, KVM_GUESTDBG_BLOCKIRQ
kvm_guest_selector = 0, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16
kvm_dirty_log_protect = KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE, KVM_DIRTY_LOG_INITIALLY_SET
kvm_dirty_log_sizes = 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576
kvm_mem_slots = 0, 1, 2, 3, 4, 5, 509, 510, 511, 10000, 65536, 65537, 65538, 65539, 65540, 66047, 66048, 66049
kvm_guest_addr_size = 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x100000
kvm_guest_addr_offsets = 0, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x100000
kvm_x86_cr0 = 1, 2, 4, 8, 16, 32, 65536, 262144, 536870912, 1073741824, 2147483648
kvm_x86_cr4 = 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 8192, 16384, 65536, 131072, 262144, 1048576, 2097152, 4194304
kvm_x86_efer = 1, 256, 1024, 2048, 4096, 8192, 16384, 32768
kvm_x86_rflags = 1, 2, 4, 16, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152

# Pseudo call that setups VCPU into a reasonable interesting state for execution.
# The interface is designed for extensibility so that addition of new options does not invalidate all existing programs.
syz_kvm_setup_cpu$ppc64(fd fd_kvmvm, cpufd fd_kvmcpu, usermem vma[24], text ptr[in, array[kvm_text_ppc64, 1]], ntext len[text], flags flags[kvm_setup_flags_ppc64], opts ptr[in, array[kvm_setup_opt_ppc64, 1]], nopt len[opts])

resource kvm_run_ptr[int64]
define KVM_RUN_SIZE	sizeof(struct kvm_run)
mmap$KVM_VCPU(addr vma, len vcpu_mmap_size, prot flags[mmap_prot], flags flags[mmap_flags], cpufd fd_kvmcpu, offset const[0]) kvm_run_ptr
munmap$KVM_VCPU(addr kvm_run_ptr, len intptr)
_ = __NR_mmap2

# Dirty ring buffer is mapped at KVM_DIRTY_LOG_PAGE_OFFSET (64 pages on x86) on vcpu fd.
# Userspace reads dirtied entries (KVM_DIRTY_GFN_F_DIRTY), marks them as harvested
# (KVM_DIRTY_GFN_F_RESET), and invokes KVM_RESET_DIRTY_RINGS to re-arm dirty logging.
define KVM_DIRTY_LOG_PAGE_OFFSET_BYTES	(KVM_DIRTY_LOG_PAGE_OFFSET * 4096)
resource kvm_dirty_ring_ptr[int64]
mmap$KVM_DIRTY_RING(addr vma, len flags[kvm_dirty_log_sizes], prot flags[mmap_prot], flags flags[mmap_flags], cpufd fd_kvmcpu, offset const[KVM_DIRTY_LOG_PAGE_OFFSET_BYTES]) kvm_dirty_ring_ptr
munmap$KVM_DIRTY_RING(addr kvm_dirty_ring_ptr, len flags[kvm_dirty_log_sizes])

# Writes to dirty ring entries to test harvesting and reset handshake with kernel.
syz_memcpy_off$KVM_DIRTY_GFN(dst kvm_dirty_ring_ptr, off intptr, src ptr[in, kvm_dirty_gfn], src_off const[0], nbytes bytesize[src])

# struct kvm_dirty_gfn from include/uapi/linux/kvm.h
kvm_dirty_gfn {
	flags	flags[kvm_dirty_gfn_flags, int32]
	slot	flags[kvm_mem_slots, int32]
	offset	int64
}

kvm_dirty_gfn_flags = KVM_DIRTY_GFN_F_DIRTY, KVM_DIRTY_GFN_F_RESET

define KVM_EXIT_MMIO_OFFSET	offsetof(struct kvm_run, mmio)
define KVM_EXIT_MMIO_SIZE	sizeof_field(struct kvm_run, mmio)
syz_memcpy_off$KVM_EXIT_MMIO(dst kvm_run_ptr, off const[KVM_EXIT_MMIO_OFFSET], src ptr[in, array[int8, KVM_EXIT_MMIO_SIZE]], src_off const[0], nbytes len[src])

define KVM_EXIT_HYPERCALL_OFFSET	offsetof(struct kvm_run, hypercall)
define KVM_EXIT_HYPERCALL_SIZE	sizeof_field(struct kvm_run, hypercall)
syz_memcpy_off$KVM_EXIT_HYPERCALL(dst kvm_run_ptr, off const[KVM_EXIT_HYPERCALL_OFFSET], src ptr[in, array[int8, KVM_EXIT_HYPERCALL_SIZE]], src_off const[0], nbytes len[src])

kvm_text_ppc64 {
	typ	const[0, intptr]
	text	ptr[in, text[ppc64]]
	size	len[text, intptr]
}

kvm_setup_opt_ppc64 [
# unions need at least 2 fields, but we have only 1 now, but we want to have it as union for future extention
	featur1	kvm_setup_opt_ppc64_feature
	featur2	kvm_setup_opt_ppc64_feature
]

kvm_setup_opt_ppc64_feature {
	typ	const[1, int64]
	val	int64
}

kvm_setup_flags_ppc64 = KVM_SETUP_PPC64_LE, KVM_SETUP_PPC64_IR, KVM_SETUP_PPC64_DR, KVM_SETUP_PPC64_PR, KVM_SETUP_PPC64_PID1

# Little endian
define KVM_SETUP_PPC64_LE	(1<<0)
# Paging for instructions
define KVM_SETUP_PPC64_IR	(1<<1)
# Paging for data
define KVM_SETUP_PPC64_DR	(1<<2)
# Run with MSR_PR (==usermode)
define KVM_SETUP_PPC64_PR	(1<<3)
# Set PID=1 i.e. not kernel's PID
define KVM_SETUP_PPC64_PID1	(1<<4)

type kvm_guest_debug[ARCH] {
	ctrl	flags[kvm_guest_debug_flags, int32]
	pad	const[0, int32]
	arch	ARCH
}

kvm_reg_list {
	n	len[reg, int64]
	reg	array[int64]
}

kvm_device_attr [
	attr_arm64	kvm_device_attr_arm64
	attr_riscv64	kvm_device_attr_riscv64
	attr_other	kvm_device_attr_generic
]

kvm_device_attr_generic {
	flags	const[0, int32]
	group	int32
	attr	int64
	addr	ptr64[inout, int64]
}

kvm_device_attr_arm64 {
	flags	const[0, int32]
	group	flags[kvm_device_attr_arm64_groups, int32]
	attr	flags[kvm_device_attr_arm64_attrs, int64]
	addr	ptr64[inout, int64]
}

# Device attributes from arch/riscv/kvm/aia_device.c .
kvm_device_attr_riscv64 [
	attr_config	kvm_attr_config_riscv64
	attr_addr	kvm_attr_addr_riscv64
	attr_ctrl	kvm_attr_ctrl_riscv64
	attr_aplic	kvm_attr_aplic_riscv64
	attr_imsic	kvm_attr_imsic_riscv64
]

kvm_attr_config_riscv64 {
	flags	const[0, int32]
	group	const[KVM_DEV_RISCV_AIA_GRP_CONFIG, int32]
	attr	flags[kvm_config_attributes_riscv64, int64]
	addr	ptr64[inout, int64]
}

# Config attributes from arch/riscv/kvm/aia_device.c aia_has_attr() .
kvm_config_attributes_riscv64 = KVM_DEV_RISCV_AIA_CONFIG_MODE, KVM_DEV_RISCV_AIA_CONFIG_IDS, KVM_DEV_RISCV_AIA_CONFIG_SRCS, KVM_DEV_RISCV_AIA_CONFIG_GROUP_BITS, KVM_DEV_RISCV_AIA_CONFIG_GROUP_SHIFT, KVM_DEV_RISCV_AIA_CONFIG_HART_BITS, KVM_DEV_RISCV_AIA_CONFIG_GUEST_BITS

kvm_attr_addr_riscv64 {
	flags	const[0, int32]
	group	const[KVM_DEV_RISCV_AIA_GRP_ADDR, int32]
	attr	kvm_addr_attributes_riscv64
	addr	ptr64[inout, int64]
}

kvm_addr_attributes_riscv64 [
	aplic	const[KVM_DEV_RISCV_AIA_ADDR_APLIC, int64]
# KVM_DEV_RISCV_AIA_ADDR_IMSIC(nr_vcpus) = 1 + nr_vcpus.
# Assume nr_vcpus <= 4 (SYZOS limit), so enumerate 1..5.
# Include 0 as a corner case.
	imsic	int64[0:5]
]

kvm_attr_ctrl_riscv64 {
	flags	const[0, int32]
	group	const[KVM_DEV_RISCV_AIA_GRP_CTRL, int32]
	attr	const[KVM_DEV_RISCV_AIA_CTRL_INIT, int64]
	addr	ptr64[inout, int64]
}

kvm_attr_aplic_riscv64 {
	flags	const[0, int32]
	group	const[KVM_DEV_RISCV_AIA_GRP_APLIC, int32]
	attr	kvm_aplic_attributes_riscv64
	addr	ptr64[inout, int64]
}

kvm_aplic_attributes_riscv64 [
	valid	flags[kvm_aplic_valid_attributes_riscv64, int64]
	any	int64
]

# Find APLIC_DOMAINCFG, APLIC_SETIPNUM, APLIC_CLRIPNUM, APLIC_SETIENUM,
# APLIC_CLRIENUM, APLIC_SETIPNUM_LE, APLIC_SETIPNUM_BE, APLIC_GENMSI
# in include/linux/irqchip/riscv-aplic.h .
kvm_aplic_valid_attributes_riscv64 = 0x0, 0x1cdc, 0x1ddc, 0x1edc, 0x1fdc, 0x2000, 0x2004, 0x3000

kvm_attr_imsic_riscv64 {
	flags	const[0, int32]
	group	const[KVM_DEV_RISCV_AIA_GRP_IMSIC, int32]
	attr	int64
	addr	ptr64[inout, int64]
}

# Assorted device attributes from
# - https://docs.kernel.org/virt/kvm/devices/arm-vgic-its.html,
# - https://docs.kernel.org/virt/kvm/devices/arm-vgic.html,
# - https://docs.kernel.org/virt/kvm/devices/arm-vgic-v3.html
kvm_device_attr_arm64_groups = KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_DEV_ARM_VGIC_GRP_DIST_REGS, KVM_DEV_ARM_VGIC_GRP_CPU_REGS, KVM_DEV_ARM_VGIC_GRP_NR_IRQS, KVM_DEV_ARM_VGIC_GRP_CTRL, KVM_DEV_ARM_VGIC_GRP_REDIST_REGS, KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS, KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO, KVM_DEV_ARM_VGIC_GRP_ITS_REGS
kvm_device_attr_arm64_attrs = 0, KVM_VGIC_ITS_ADDR_TYPE, KVM_VGIC_V2_ADDR_TYPE_DIST, KVM_VGIC_V2_ADDR_TYPE_CPU, KVM_VGIC_V3_ADDR_TYPE_DIST, KVM_VGIC_V3_ADDR_TYPE_REDIST, KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, KVM_DEV_ARM_VGIC_CTRL_INIT, KVM_DEV_ARM_ITS_CTRL_RESET, KVM_DEV_ARM_ITS_SAVE_TABLES, KVM_DEV_ARM_ITS_RESTORE_TABLES, KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES

kvm_device_attr_vm [
	attr_arm64	kvm_device_attr_vm_arm64
	attr_other	kvm_device_attr_generic
]

kvm_device_attr_vcpu [
	attr_pmu_irq	kvm_vcpu_attr_pmu_irq
	attr_pmu_init	kvm_vcpu_attr_pmu_init
	attr_pmu_filter	kvm_vcpu_attr_pmu_filter
	attr_set_pmu	kvm_vcpu_attr_set_pmu
	attr_irq_timer	kvm_vcpu_attr_irq_timer
	attr_pvtime_ipa	kvm_vcpu_attr_pvtime_ipa
	attr_other	kvm_device_attr_generic
]

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_vcpu_attr_pmu_irq {
	flags	const[0, int32]
	group	const[KVM_ARM_VCPU_PMU_V3_CTRL, int32]
	attr	const[KVM_ARM_VCPU_PMU_V3_IRQ, int64]
	addr	ptr64[in, int32]
}

kvm_vcpu_attr_pmu_init {
	flags	const[0, int32]
	group	const[KVM_ARM_VCPU_PMU_V3_CTRL, int32]
	attr	const[KVM_ARM_VCPU_PMU_V3_INIT, int64]
	addr	const[0, int64]
}

kvm_vcpu_attr_pmu_filter {
	flags	const[0, int32]
	group	const[KVM_ARM_VCPU_PMU_V3_CTRL, int32]
	attr	const[KVM_ARM_VCPU_PMU_V3_FILTER, int64]
	addr	ptr64[in, kvm_pmu_event_filter]
}

kvm_vcpu_attr_set_pmu {
	flags	const[0, int32]
	group	const[KVM_ARM_VCPU_PMU_V3_CTRL, int32]
	attr	const[KVM_ARM_VCPU_PMU_V3_SET_PMU, int64]
	addr	ptr64[in, int32]
}

kvm_vcpu_timer_attributes = KVM_ARM_VCPU_TIMER_IRQ_VTIMER, KVM_ARM_VCPU_TIMER_IRQ_PTIMER

kvm_vcpu_attr_irq_timer {
	flags	const[0, int32]
	group	const[KVM_ARM_VCPU_TIMER_CTRL, int32]
	attr	flags[kvm_vcpu_timer_attributes, int64]
	addr	ptr64[in, int32[16:31]]
}

kvm_vcpu_attr_pvtime_ipa {
	flags	const[0, int32]
	group	const[KVM_ARM_VCPU_PVTIME_CTRL, int32]
	attr	const[KVM_ARM_VCPU_PVTIME_IPA, int64]
	addr	int64
}

kvm_pmu_event_filter = KVM_PMU_EVENT_ALLOW, KVM_PMU_EVENT_DENY

kvm_pmu_event_filter {
	base_event	int16
	nevents		int16
	action		flags[kvm_pmu_event_filter, int8]
	pad		array[const[0, int8], 3]
}

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]
}

guest_memfd_flags = GUEST_MEMFD_FLAG_MMAP, GUEST_MEMFD_FLAG_INIT_SHARED

kvm_create_guest_memfd {
	size		flags[kvm_guest_addr_size, int64]
	flags		flags[guest_memfd_flags, int64]
	reserved	array[const[0, int64], 6]
}

kvm_pre_fault_memory {
	gpa	flags[kvm_guest_addrs, int64]
	size	flags[kvm_guest_addr_size, int64]
	flags	const[0, int64]
	padding	array[const[0, int64], 5]
}

kvm_memory_attribute_flags = KVM_MEMORY_ATTRIBUTE_PRIVATE

kvm_memory_attributes {
	address		flags[kvm_guest_addrs, int64]
	size		flags[kvm_guest_addr_size, int64]
	attributes	flags[kvm_memory_attribute_flags, int64]
	flags		const[0, int64]
}

kvm_create_device {
	type	flags[kvm_device_type, int32]	(in)
	fd	fd_kvmdev	(out)
	flags	flags[kvm_device_flags, int32]	(in)
}

kvm_s390_interrupt {
	type	int32
	parm	int32
	parm64	int64
}

kvm_irqfd_flags = KVM_IRQFD_FLAG_DEASSIGN, KVM_IRQFD_FLAG_RESAMPLE

kvm_irqfd {
	fd	fd_event
	gsi	int32
	flags	flags[kvm_irqfd_flags, int32]
	rfd	fd_event
	pad	array[const[0, int8], 16]
}

kvm_msi_flags = 0, KVM_MSI_VALID_DEVID

kvm_msi {
	addrlo	flags[kvm_guest_addrs, int32]
	addrhi	flags[kvm_guest_addrs, int32]
	data	int32
	flags	flags[kvm_msi_flags, int32]
	devid	int32
	pad	array[const[0, int8], 12]
}

kvm_one_reg [
# Constants from https://docs.kernel.org/virt/kvm/api.html
	arm64_core		kvm_one_reg_arm64_srange[0x6030000000100000:0x6030000000100050, 2]
	arm64_fp		kvm_one_reg_arm64_range[0x6040000000100054:0x60400000001000d0]
	arm64_fp_extra		kvm_one_reg_arm64_range[0x60200000001000d4:0x60200000001000d5]
# Got 0x602000000011000d from KVM_GET_REG_LIST on QEMU
	arm64_ccsidr		kvm_one_reg_arm64_range[0x6020000000110000:0x602000000011000d]
	arm64_sys		kvm_one_reg_arm64[kvm_regs_arm64_sys]
	arm64_extra		kvm_one_reg_arm64[kvm_regs_arm64_extra]
	arm64_bitmap		kvm_one_reg_arm64_range[0x6030000000160000:0x6030000000160002]
	arm64_fw		kvm_one_reg_arm64_range[0x6030000000140000:0x6030000000140003]
	arm64_sve		kvm_one_reg_arm64_range[0x6080000000150000:0x6080000000150620]
	arm64_sve_vls		kvm_one_reg_arm64_range[0x606000000015ffff]
	other			kvm_one_reg_other
# For riscv64
	riscv64_config		kvm_one_reg_riscv64[kvm_regs_riscv64_config]
	riscv64_core		kvm_one_reg_riscv64[kvm_regs_riscv64_core]
	riscv64_csr		kvm_one_reg_riscv64[kvm_regs_riscv64_csr]
	riscv64_aia_csr		kvm_one_reg_riscv64[kvm_regs_riscv64_aia_csr]
	riscv64_smstateen_csr	kvm_one_reg_riscv64[kvm_regs_riscv64_smstateen_csr]
	riscv64_timer		kvm_one_reg_riscv64[kvm_regs_riscv64_timer]
	riscv64_sbi_sta		kvm_one_reg_riscv64[kvm_regs_riscv64_sbi_sta]
	riscv64_sbi_fwft	kvm_one_reg_riscv64[kvm_regs_riscv64_sbi_fwft]
	riscv64_f		kvm_one_reg_riscv64[kvm_regs_riscv64_f]
	riscv64_d		kvm_one_reg_riscv64[kvm_regs_riscv64_d]
	riscv64_v		kvm_one_reg_riscv64[kvm_regs_riscv64_v]
]

type kvm_one_reg_riscv64[FTYPE] {
	id	flags[FTYPE, int64]
	addr	ptr64[inout, int64]
}

type kvm_one_reg_arm64[FTYPE] {
	id	flags[FTYPE, int64]
	addr	ptr64[inout, int64]
}

type kvm_one_reg_arm64_range[RANGE] {
	id	int64[RANGE]
	addr	ptr64[inout, int64]
}

type kvm_one_reg_arm64_srange[RANGE, STEP] {
	id	int64[RANGE, STEP]
	addr	ptr64[inout, int64]
}

kvm_one_reg_other {
	id	int64
	addr	ptr64[inout, int64]
}

kvm_s390_ucas_mapping {
	uaddr	int64
	vaddr	int64
	len	int64
}

kvm_dirty_tlb {
	bitmap	int64
	n	int32
}

kvm_ioeventfd {
	datam	int64
	addr	flags[kvm_guest_addrs, int64]
	len	flags[kvm_ioeventfd_len, int32]
	fd	fd_event
	flags	flags[kvm_ioeventfd_flags, int32]
	pad	array[const[0, int8], 36]
}

kvm_assigned_msix_entry {
	devid	int32
	gsi	int32
	entry	int16
	padding	array[const[0, int16], 3]
}

kvm_assigned_msix_nr {
	devid	int32
	entnr	int16
}

kvm_irq_routing {
	nr	len[entries, int32]
	flags	const[0, int32]
	entries	array[kvm_irq_routing_entry]
}

kvm_irq_routing_entry {
	gsi	int32
	type	flags[kvm_irq_routing_entry_type, int32]
	flags	flags[kvm_msi_flags, int32]
	pad	const[0, int32]
	u	kvm_irq_routing_entry_u
}

kvm_irq_routing_entry_u [
	irqchip	kvm_irq_routing_irqchip
	msi	kvm_irq_routing_msi
	adapter	kvm_irq_routing_s390_adapter
	sint	kvm_irq_routing_hv_sint
]

kvm_irq_routing_irqchip {
	irqchip	int32
	pin	int32
}

kvm_irq_routing_msi {
	address_lo	int32
	address_hi	int32
	data		int32
	devid		int32
}

kvm_irq_routing_s390_adapter {
	indaddr	int64
	saddr	int64
	indoff	int64
	soff	int32
	aid	int32
}

kvm_irq_routing_hv_sint {
	vcpu	int32
	sint	int32
}

type kvm_enable_cap[CAP, ARGS] {
	cap	const[CAP, int32]
	flags	const[0, int32]
	args	ARGS
} [align[8], size[KVM_ENABLE_CAP_SIZE]]

define KVM_ENABLE_CAP_SIZE	sizeof(struct kvm_enable_cap)

kvm_userspace_memory_region {
	slot	flags[kvm_mem_slots, int32]
	flags	flags[kvm_mem_region_flags, int32]
	paddr	flags[kvm_guest_addrs, int64]
	size	len[addr, int64]
	addr	vma64[1:2]
}

kvm_userspace_memory_region2 {
	slot			flags[kvm_mem_slots, int32]
	flags			flags[kvm_mem_region_flags, int32]
	paddr			flags[kvm_guest_addrs, int64]
	size			len[addr, int64]
	addr			vma64[1:2]
	guest_memfd_offset	flags[kvm_guest_addr_offsets, int64]
	guest_memfd		fd_kvm_guest_memfd
	pad1			const[0, int32]
	pad2			array[const[0, int64], 14]
}

# https://docs.kernel.org/virt/kvm/api.html#kvm-get-vcpu-events
kvm_vcpu_events_x86 {
	exinjec			int8
	exnr			int8
	exhec			int8
	pad1			const[0, int8]
	exec			int32

	ininjec			int8
	innr			int8
	insoft			int8
	inshad			int8

	nmiinj			int8
	nmipend			int8
	nmimask			int8
	pad2			const[0, int8]

	sipi_vector		int32
	flags			int32

	smismm			int8
	smipend			int8
	smiinsi			int8
	smilatc			int8

	reserved		array[const[0, int8], 27]
	exception_has_payload	int8
	exception_payload	int64
}

kvm_vcpu_events_arm64 {
	serror_pending		int8
	serror_has_esr		int8
	ext_dabt_pending	int8
	pad			array[const[0, int8], 5]
	serror_esr		int64
	reserved		array[const[0, int32], 12]
}

kvm_vcpu_events [
	x86	kvm_vcpu_events_x86
	arm64	kvm_vcpu_events_arm64
]

kvm_irq_level {
	irq	int32
	level	int32
}

kvm_signal_mask {
	len	len[sigset, int32]
	sigset	array[int8]
}

kvm_dirty_log {
	slot	flags[kvm_mem_slots, int32]
	pad	const[0, int32]
	bitmap	vma64
}

# num_pages and first_page must be multiples of 64,
# see https://docs.kernel.org/virt/kvm/api.html#kvm-clear-dirty-log-vm-ioctl
kvm_clear_dirty_log {
	slot		flags[kvm_mem_slots, int32]
	num_pages	int32[0:1024, 64]
	first_page	int32[0:1024, 64]
# Allocate 1024 bits regardless of num_pages.
	bitmap		ptr[in, array[int64, 128]]
}

kvm_regs {
	gp	array[int64, 16]
	rip	flags[kvm_guest_addrs, int64]
	rflags	flags[kvm_x86_rflags, int64]
}

kvm_sregs {
	cs	kvm_segment
	ds	kvm_segment
	es	kvm_segment
	fs	kvm_segment
	gs	kvm_segment
	ss	kvm_segment
	tr	kvm_segment
	ldt	kvm_segment
	gdt	kvm_dtable
	idt	kvm_dtable
	cr0	flags[kvm_x86_cr0, int64]
	cr2	const[0, int64]
# TODO: this should point to page table
	cr3	flags[kvm_guest_addrs, int64]
	cr4	flags[kvm_x86_cr4, int64]
	cr8	int64[0:15]
	efer	flags[kvm_x86_efer, int64]
	apic	flags[kvm_guest_addrs, int64]
	intr	array[int64, 4]
}

kvm_segment {
	base	flags[kvm_guest_addrs, int64]
	limit	flags[kvm_guest_addrs, int32]
	select	flags[kvm_guest_selector, int16]
	type	int8
	present	int8
	dpl	int8
	db	int8
	s	int8
	l	int8
	g	int8
	avl	int8
	unusabl	int8
	padding	const[0, int8]
}

kvm_dtable {
	base	flags[kvm_guest_addrs, int64]
	limit	int16
	pad	array[const[0, int16], 3]
}

kvm_coalesced_mmio_zone {
	addr		flags[kvm_guest_addrs, int64]
	size		flags[kvm_guest_addr_size, int32]
	pio_or_pad	int32[0:1]
}

# pkg/ifuzz/pseudo.go also knows this list
define VMCS12_SIZE	0x1000

# Deprecated consts.
# These were removed in a5d3df8ae13.

define KVM_ASSIGN_DEV_IRQ	0x4040AE70
define KVM_ASSIGN_PCI_DEVICE	0x8040AE69
define KVM_ASSIGN_SET_INTX_MASK	0x4040AEA4
define KVM_ASSIGN_SET_MSIX_ENTRY	0x4010AE74
define KVM_ASSIGN_SET_MSIX_NR	0x4008AE73
define KVM_DEASSIGN_DEV_IRQ	0x4040AE75
define KVM_DEASSIGN_PCI_DEVICE	0x4040AE72
# Register descriptions generated by tools/arm64/registers.go
kvm_regs_arm64_sys = 0x6030000000138002, 0x6030000000138010, 0x6030000000138012, 0x603000000013801a, 0x6030000000138032, 0x6030000000138004, 0x603000000013800c, 0x6030000000138014, 0x603000000013801c, 0x6030000000138024, 0x603000000013802c, 0x6030000000138034, 0x603000000013803c, 0x6030000000138044, 0x603000000013804c, 0x6030000000138054, 0x603000000013805c, 0x6030000000138064, 0x603000000013806c, 0x6030000000138074, 0x603000000013807c, 0x6030000000138005, 0x603000000013800d, 0x6030000000138015, 0x603000000013801d, 0x6030000000138025, 0x603000000013802d, 0x6030000000138035, 0x603000000013803d, 0x6030000000138045, 0x603000000013804d, 0x6030000000138055, 0x603000000013805d, 0x6030000000138065, 0x603000000013806d, 0x6030000000138075, 0x603000000013807d, 0x6030000000138006, 0x603000000013800e, 0x6030000000138016, 0x603000000013801e, 0x6030000000138026, 0x603000000013802e, 0x6030000000138036, 0x603000000013803e, 0x6030000000138046, 0x603000000013804e, 0x6030000000138056, 0x603000000013805e, 0x6030000000138066, 0x603000000013806e, 0x6030000000138076, 0x603000000013807e, 0x6030000000138007, 0x603000000013800f, 0x6030000000138017, 0x603000000013801f, 0x6030000000138027, 0x603000000013802f, 0x6030000000138037, 0x603000000013803f, 0x6030000000138047, 0x603000000013804f, 0x6030000000138057, 0x603000000013805f, 0x6030000000138067, 0x603000000013806f, 0x6030000000138077, 0x603000000013807f, 0x6030000000138080, 0x6030000000138084, 0x603000000013808c, 0x603000000013809c, 0x60300000001380a4, 0x60300000001383c6, 0x60300000001383ce, 0x60300000001383f6, 0x6030000000139808, 0x6030000000139820, 0x6030000000139828, 0x6030000000139828, 0x603000000013a038, 0x603000000013c000, 0x603000000013c005, 0x603000000013c006, 0x603000000013c008, 0x603000000013c009, 0x603000000013c00a, 0x603000000013c00b, 0x603000000013c00c, 0x603000000013c00d, 0x603000000013c00e, 0x603000000013c00f, 0x603000000013c010, 0x603000000013c011, 0x603000000013c012, 0x603000000013c013, 0x603000000013c014, 0x603000000013c015, 0x603000000013c016, 0x603000000013c017, 0x603000000013c018, 0x603000000013c019, 0x603000000013c01a, 0x603000000013c01c, 0x603000000013c01d, 0x603000000013c01e, 0x603000000013c020, 0x603000000013c021, 0x603000000013c024, 0x603000000013c028, 0x603000000013c029, 0x603000000013c02c, 0x603000000013c02d, 0x603000000013c030, 0x603000000013c031, 0x603000000013c032, 0x603000000013c038, 0x603000000013c039, 0x603000000013c03a, 0x603000000013c080, 0x603000000013c081, 0x603000000013c082, 0x603000000013c085, 0x603000000013c086, 0x603000000013c090, 0x603000000013c091, 0x603000000013c100, 0x603000000013c101, 0x603000000013c102, 0x603000000013c108, 0x603000000013c109, 0x603000000013c10a, 0x603000000013c10b, 0x603000000013c110, 0x603000000013c111, 0x603000000013c112, 0x603000000013c113, 0x603000000013c118, 0x603000000013c119, 0x603000000013c200, 0x603000000013c201, 0x603000000013c208, 0x603000000013c210, 0x6030000000130205, 0x603000000013c212, 0x603000000013c213, 0x6030000000130204, 0x603000000013c214, 0x6030000000130203, 0x603000000013c230, 0x603000000013c288, 0x603000000013c289, 0x603000000013c290, 0x603000000013c298, 0x603000000013c299, 0x603000000013c2a0, 0x603000000013c2a1, 0x603000000013c2a2, 0x603000000013c2a3, 0x603000000013c2a4, 0x603000000013c2a5, 0x603000000013c2a6, 0x603000000013c2a8, 0x603000000013c2a9, 0x603000000013c2aa, 0x603000000013c2ab, 0x603000000013c2b0, 0x603000000013c2b1, 0x603000000013c300, 0x603000000013c3a0, 0x603000000013c4c8, 0x603000000013c4c9, 0x603000000013c4ca, 0x603000000013c4cb, 0x603000000013c4cc, 0x603000000013c4cd, 0x603000000013c4ce, 0x603000000013c4cf, 0x603000000013c4d0, 0x603000000013c4d1, 0x603000000013c4d3, 0x603000000013c4d7, 0x603000000013c4f1, 0x603000000013c4f2, 0x603000000013c4f6, 0x603000000013c510, 0x603000000013c518, 0x603000000013c520, 0x603000000013c521, 0x603000000013c522, 0x603000000013c523, 0x603000000013c524, 0x603000000013c527, 0x603000000013c528, 0x603000000013c529, 0x603000000013c600, 0x603000000013c601, 0x603000000013c602, 0x603000000013c608, 0x603000000013c609, 0x603000000013c640, 0x603000000013c641, 0x603000000013c642, 0x603000000013c643, 0x603000000013c644, 0x603000000013c645, 0x603000000013c646, 0x603000000013c647, 0x603000000013c648, 0x603000000013c649, 0x603000000013c64a, 0x603000000013c64b, 0x603000000013c659, 0x603000000013c65b, 0x603000000013c65d, 0x603000000013c65e, 0x603000000013c65f, 0x603000000013c660, 0x603000000013c661, 0x603000000013c662, 0x603000000013c663, 0x603000000013c664, 0x603000000013c665, 0x603000000013c666, 0x603000000013c667, 0x603000000013c681, 0x603000000013c684, 0x603000000013c685, 0x603000000013c687, 0x603000000013c708, 0x603000000013c800, 0x603000000013c801, 0x603000000013c802, 0x603000000013c804, 0x603000000013c807, 0x603000000013d000, 0x603000000013d801, 0x603000000013d807, 0x603000000013d920, 0x603000000013d921, 0x603000000013da10, 0x603000000013da11, 0x603000000013da15, 0x6030000000131a02, 0x603000000013da16, 0x6030000000131a01, 0x603000000013da17, 0x6030000000131a04, 0x603000000013da20, 0x603000000013da21, 0x603000000013da28, 0x603000000013da29, 0x603000000013dce0, 0x603000000013dce1, 0x603000000013dce2, 0x603000000013dce3, 0x603000000013dce4, 0x603000000013dce5, 0x603000000013dce6, 0x603000000013dce7, 0x603000000013dce8, 0x603000000013dce9, 0x603000000013dcea, 0x603000000013dcf0, 0x603000000013dcf3, 0x603000000013de82, 0x603000000013de83, 0x603000000013de87, 0x603000000013de90, 0x603000000013de91, 0x603000000013de92, 0x603000000013de93, 0x603000000013de94, 0x603000000013de95, 0x603000000013de96, 0x603000000013de98, 0x603000000013de99, 0x603000000013dea0, 0x603000000013dea1, 0x603000000013dea2, 0x603000000013dea3, 0x603000000013dea4, 0x603000000013dea5, 0x603000000013dea6, 0x603000000013dea7, 0x603000000013dea8, 0x603000000013dea9, 0x603000000013deaa, 0x603000000013deab, 0x603000000013deac, 0x603000000013dead, 0x603000000013deae, 0x603000000013deaf, 0x603000000013deb0, 0x603000000013deb1, 0x603000000013deb2, 0x603000000013deb3, 0x603000000013deb4, 0x603000000013deb5, 0x603000000013deb6, 0x603000000013deb7, 0x603000000013deb8, 0x603000000013deb9, 0x603000000013deba, 0x603000000013debb, 0x603000000013debc, 0x603000000013debd, 0x603000000013debe, 0x603000000013debf, 0x603000000013dee0, 0x603000000013dee1, 0x603000000013dee2, 0x603000000013dee3, 0x603000000013dee4, 0x603000000013dee5, 0x603000000013dee6, 0x603000000013dee7, 0x603000000013dee8, 0x603000000013dee9, 0x603000000013deea, 0x603000000013deeb, 0x603000000013deec, 0x603000000013deed, 0x603000000013deee, 0x603000000013deef, 0x603000000013def0, 0x603000000013def1, 0x603000000013def2, 0x603000000013def3, 0x603000000013def4, 0x603000000013def5, 0x603000000013def6, 0x603000000013def7, 0x603000000013def8, 0x603000000013def9, 0x603000000013defa, 0x603000000013defb, 0x603000000013defc, 0x603000000013defd, 0x603000000013defe, 0x603000000013deff, 0x603000000013df00, 0x603000000013df01, 0x603000000013df02, 0x603000000013df05, 0x603000000013df06, 0x603000000013df10, 0x603000000013df11, 0x603000000013df12, 0x603000000013df18, 0x603000000013df19, 0x603000000013df1a, 0x603000000013df40, 0x603000000013df41, 0x603000000013df42, 0x603000000013df43, 0x603000000013df44, 0x603000000013df45, 0x603000000013df46, 0x603000000013df47, 0x603000000013df48, 0x603000000013df49, 0x603000000013df4a, 0x603000000013df4b, 0x603000000013df4c, 0x603000000013df4d, 0x603000000013df4e, 0x603000000013df4f, 0x603000000013df50, 0x603000000013df51, 0x603000000013df52, 0x603000000013df53, 0x603000000013df54, 0x603000000013df55, 0x603000000013df56, 0x603000000013df57, 0x603000000013df58, 0x603000000013df59, 0x603000000013df5a, 0x603000000013df5b, 0x603000000013df5c, 0x603000000013df5d, 0x603000000013df5e, 0x603000000013df5f, 0x603000000013df7f, 0x603000000013df60, 0x603000000013df61, 0x603000000013df62, 0x603000000013df63, 0x603000000013df64, 0x603000000013df65, 0x603000000013df66, 0x603000000013df67, 0x603000000013df68, 0x603000000013df69, 0x603000000013df6a, 0x603000000013df6b, 0x603000000013df6c, 0x603000000013df6d, 0x603000000013df6e, 0x603000000013df6f, 0x603000000013df70, 0x603000000013df71, 0x603000000013df72, 0x603000000013df73, 0x603000000013df74, 0x603000000013df75, 0x603000000013df76, 0x603000000013df77, 0x603000000013df78, 0x603000000013df79, 0x603000000013df7a, 0x603000000013df7b, 0x603000000013df7c, 0x603000000013df7d, 0x603000000013df7e, 0x603000000013df7f, 0x603000000013e000, 0x603000000013e005, 0x603000000013e080, 0x603000000013e081, 0x603000000013e088, 0x603000000013e089, 0x603000000013e08a, 0x603000000013e08b, 0x603000000013e08c, 0x603000000013e08d, 0x603000000013e08e, 0x603000000013e08f, 0x603000000013e090, 0x603000000013e091, 0x603000000013e092, 0x603000000013e099, 0x603000000013e100, 0x603000000013e101, 0x603000000013e102, 0x603000000013e108, 0x603000000013e10a, 0x603000000013e110, 0x603000000013e130, 0x603000000013e132, 0x603000000013e180, 0x603000000013e18c, 0x603000000013e18d, 0x603000000013e18e, 0x603000000013e200, 0x603000000013e201, 0x603000000013e208, 0x603000000013e218, 0x603000000013e219, 0x603000000013e21a, 0x603000000013e21b, 0x603000000013e281, 0x603000000013e288, 0x603000000013e289, 0x603000000013e290, 0x603000000013e293, 0x603000000013e298, 0x603000000013e2b0, 0x603000000013e300, 0x603000000013e304, 0x603000000013e4c8, 0x603000000013e510, 0x603000000013e518, 0x603000000013e520, 0x603000000013e521, 0x603000000013e528, 0x603000000013e530, 0x603000000013e531, 0x603000000013e532, 0x603000000013e533, 0x603000000013e534, 0x603000000013e535, 0x603000000013e536, 0x603000000013e537, 0x603000000013e600, 0x603000000013e601, 0x603000000013e602, 0x603000000013e609, 0x603000000013e640, 0x603000000013e641, 0x603000000013e642, 0x603000000013e643, 0x603000000013e648, 0x603000000013e649, 0x603000000013e64a, 0x603000000013e64b, 0x603000000013e64d, 0x603000000013e658, 0x603000000013e659, 0x603000000013e65a, 0x603000000013e65b, 0x603000000013e65d, 0x603000000013e65f, 0x603000000013e660, 0x603000000013e661, 0x603000000013e662, 0x603000000013e663, 0x603000000013e664, 0x603000000013e665, 0x603000000013e666, 0x603000000013e667, 0x603000000013e668, 0x603000000013e669, 0x603000000013e66a, 0x603000000013e66b, 0x603000000013e66c, 0x603000000013e66d, 0x603000000013e66e, 0x603000000013e66f, 0x603000000013e681, 0x603000000013e682, 0x603000000013e687, 0x603000000013e6c0, 0x603000000013e6c1, 0x603000000013e6c2, 0x603000000013e6c3, 0x603000000013e6c4, 0x603000000013e6c5, 0x603000000013e6c6, 0x603000000013e6c7, 0x603000000013e6c8, 0x603000000013e6c9, 0x603000000013e6ca, 0x603000000013e6cb, 0x603000000013e6cc, 0x603000000013e6cd, 0x603000000013e6ce, 0x603000000013e6cf, 0x603000000013e6d0, 0x603000000013e6d1, 0x603000000013e6d2, 0x603000000013e6d3, 0x603000000013e6d4, 0x603000000013e6d5, 0x603000000013e6d6, 0x603000000013e6d7, 0x603000000013e6d8, 0x603000000013e6d9, 0x603000000013e6da, 0x603000000013e6db, 0x603000000013e6dc, 0x603000000013e6dd, 0x603000000013e6de, 0x603000000013e6df, 0x603000000013e703, 0x603000000013e706, 0x603000000013e708, 0x603000000013e710, 0x603000000013e711, 0x603000000013e712, 0x603000000013e718, 0x603000000013e719, 0x603000000013e71a, 0x603000000013e720, 0x603000000013e721, 0x603000000013e722, 0x603000000013e728, 0x603000000013e729, 0x603000000013e72a, 0x603000000013f080, 0x603000000013f081, 0x603000000013f088, 0x603000000013f089, 0x603000000013f08a, 0x603000000013f090, 0x603000000013f099, 0x603000000013f100, 0x603000000013f102, 0x603000000013f200, 0x603000000013f201, 0x603000000013f208, 0x603000000013f288, 0x603000000013f289, 0x603000000013f290, 0x603000000013f2b0, 0x603000000013f300, 0x603000000013f510, 0x603000000013f518, 0x603000000013f528, 0x603000000013f600, 0x603000000013f601, 0x603000000013f602, 0x603000000013f664, 0x603000000013f665, 0x603000000013f667, 0x603000000013f682, 0x603000000013f687, 0x603000000013ff10, 0x603000000013ff11, 0x603000000013ff12
# Extra registers that KVM_GET_REG_LIST prints on QEMU
kvm_regs_arm64_extra = 0x603000000013c01b, 0x603000000013c01f, 0x603000000013c022, 0x603000000013c023, 0x603000000013c025, 0x603000000013c026, 0x603000000013c027, 0x603000000013c02a, 0x603000000013c02b, 0x603000000013c02e, 0x603000000013c02f, 0x603000000013c033, 0x603000000013c034, 0x603000000013c035, 0x603000000013c036, 0x603000000013c037, 0x603000000013c03b, 0x603000000013c03c, 0x603000000013c03d, 0x603000000013c03e, 0x603000000013c03f, 0x603000000013c103, 0x603000000013c512, 0x603000000013c513
# End of register descriptions generated by tools/arm64/registers.go

# For riscv64, the following ids are computed from arch/riscv/include/uapi/asm/kvm.h and arch/riscv/include/uapi/asm/ptrace.h .
kvm_regs_riscv64_config = 0x8030000000100000, 0x8030000000100001, 0x8030000000100002, 0x8030000000100003, 0x8030000000100004, 0x8030000000100005, 0x8030000000100006, 0x8030000000100007
kvm_regs_riscv64_core = 0x8030000000200000, 0x8030000000200001, 0x8030000000200002, 0x8030000000200003, 0x8030000000200004, 0x8030000000200005, 0x8030000000200006, 0x8030000000200007, 0x8030000000200008, 0x8030000000200009, 0x803000000020000a, 0x803000000020000b, 0x803000000020000c, 0x803000000020000d, 0x803000000020000e, 0x803000000020000f, 0x8030000000200010, 0x8030000000200011, 0x8030000000200012, 0x8030000000200013, 0x8030000000200014, 0x8030000000200015, 0x8030000000200016, 0x8030000000200017, 0x8030000000200018, 0x8030000000200019, 0x803000000020001a, 0x803000000020001b, 0x803000000020001c, 0x803000000020001d, 0x803000000020001e, 0x803000000020001f, 0x8030000000200020
kvm_regs_riscv64_csr = 0x8030000000300000, 0x8030000000300001, 0x8030000000300002, 0x8030000000300003, 0x8030000000300004, 0x8030000000300005, 0x8030000000300006, 0x8030000000300007, 0x8030000000300008, 0x8030000000300009, 0x803000000030000a
kvm_regs_riscv64_aia_csr = 0x8030000003010000, 0x8030000003010001, 0x8030000003010002, 0x8030000003010003, 0x8030000003010004, 0x8030000003010005, 0x8030000003010006
kvm_regs_riscv64_smstateen_csr = 0x8030000003020000
kvm_regs_riscv64_timer = 0x8030000004000000, 0x8030000004000001, 0x8030000004000002, 0x8030000004000003
kvm_regs_riscv64_sbi_sta = 0x803000000a000000, 0x803000000a000001
kvm_regs_riscv64_sbi_fwft = 0x803000000a010000, 0x803000000a010001, 0x803000000a010002, 0x803000000a010003, 0x803000000a010004, 0x803000000a010005
kvm_regs_riscv64_f = 0x8020000005000000, 0x8020000005000001, 0x8020000005000002, 0x8020000005000003, 0x8020000005000004, 0x8020000005000005, 0x8020000005000006, 0x8020000005000007, 0x8020000005000008, 0x8020000005000009, 0x802000000500000a, 0x802000000500000b, 0x802000000500000c, 0x802000000500000d, 0x802000000500000e, 0x802000000500000f, 0x8020000005000010, 0x8020000005000011, 0x8020000005000012, 0x8020000005000013, 0x8020000005000014, 0x8020000005000015, 0x8020000005000016, 0x8020000005000017, 0x8020000005000018, 0x8020000005000019, 0x802000000500001a, 0x802000000500001b, 0x802000000500001c, 0x802000000500001d, 0x802000000500001e, 0x802000000500001f, 0x8020000005000020
kvm_regs_riscv64_d = 0x8030000006000000, 0x8030000006000001, 0x8030000006000002, 0x8030000006000003, 0x8030000006000004, 0x8030000006000005, 0x8030000006000006, 0x8030000006000007, 0x8030000006000008, 0x8030000006000009, 0x803000000600000a, 0x803000000600000b, 0x803000000600000c, 0x803000000600000d, 0x803000000600000e, 0x803000000600000f, 0x8030000006000010, 0x8030000006000011, 0x8030000006000012, 0x8030000006000013, 0x8030000006000014, 0x8030000006000015, 0x8030000006000016, 0x8030000006000017, 0x8030000006000018, 0x8030000006000019, 0x803000000600001a, 0x803000000600001b, 0x803000000600001c, 0x803000000600001d, 0x803000000600001e, 0x803000000600001f, 0x8020000006000020
kvm_regs_riscv64_v = 0x8030000009000000, 0x8030000009000001, 0x8030000009000002, 0x8030000009000003, 0x8030000009000004, 0x8030000009000005, 0x8030000009000006, 0x8030000009000007, 0x8030000009000008, 0x8030000009000009, 0x803000000900000a, 0x803000000900000b, 0x803000000900000c, 0x803000000900000d, 0x803000000900000e, 0x803000000900000f, 0x8030000009000010, 0x8030000009000011, 0x8030000009000012, 0x8030000009000013, 0x8030000009000014, 0x8030000009000015, 0x8030000009000016, 0x8030000009000017, 0x8030000009000018, 0x8030000009000019, 0x803000000900001a, 0x803000000900001b, 0x803000000900001c, 0x803000000900001d, 0x803000000900001e, 0x803000000900001f, 0x8030000009000020, 0x8030000009000021, 0x8030000009000022, 0x8030000009000023, 0x8030000009000024, 0x8030000009000025
