github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/sys/linux/dev_kvm_amd64.txt (about)

     1  # Copyright 2024 syzkaller project authors. All rights reserved.
     2  # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
     3  
     4  # x86(-64)-specific KVM syscall declarations.
     5  
     6  meta arches["386", "amd64"]
     7  
     8  include <linux/kvm.h>
     9  include <linux/kvm_host.h>
    10  include <asm/mce.h>
    11  
    12  # kvm_syz_vm is a VM handler used by syzos-related pseudo-syscalls. It is actually an opaque pointer under the hood.
    13  resource kvm_syz_vm$x86[int64]
    14  resource fd_sgx_provision[fd]
    15  resource fd_sev[fd]
    16  resource sev_handle[int32]
    17  
    18  # Map the given memory into the VM and set up syzos there.
    19  syz_kvm_setup_syzos_vm$x86(fd fd_kvmvm, usermem vma[1024]) kvm_syz_vm$x86
    20  
    21  # Create a VCPU inside a kvm_syz_vm VM.
    22  # Prohibit flattening the input arguments, so that it is easier to reason about them.
    23  syz_kvm_add_vcpu$x86(vm kvm_syz_vm$x86, text ptr[in, kvm_text$x86]) fd_kvmcpu (no_squash)
    24  
    25  # Test assertions, will not be used by the fuzzer.
    26  syz_kvm_assert_syzos_uexit$x86(run kvm_run_ptr, exitcode intptr) (no_generate)
    27  syz_kvm_assert_syzos_kvm_exit$x86(run kvm_run_ptr, exitcode intptr) (no_generate)
    28  
    29  # Pseudo call that setups VCPU into a reasonable interesting state for execution.
    30  # The interface is designed for extensibility so that addition of new options does not invalidate all existing programs.
    31  syz_kvm_setup_cpu$x86(fd fd_kvmvm, cpufd fd_kvmcpu, usermem vma[24], text ptr[in, array[kvm_text_x86, 1]], ntext len[text], flags flags[kvm_setup_flags], opts ptr[in, array[kvm_setup_opt_x86, 0:2]], nopt len[opts])
    32  
    33  kvm_text$x86 {
    34  	typ	const[0, intptr]
    35  	text	ptr[in, array[syzos_api_call$x86, 1:32]]
    36  	size	bytesize[text, int64]
    37  }
    38  
    39  syzos_api_code$x86 {
    40  	insns	text[x86_64]
    41  	ret	const[0xc3, int8]
    42  } [packed]
    43  
    44  type syzos_api$x86[NUM, PAYLOAD] {
    45  	call	const[NUM, int64]
    46  	size	bytesize[parent, int64]
    47  	payload	PAYLOAD
    48  }
    49  
    50  syzos_api_cpuid {
    51  	eax	int32
    52  	ecx	int32
    53  }
    54  
    55  syzos_api_wrmsr {
    56  	arg_reg		flags[msr_index, int64]
    57  	arg_value	int64
    58  }
    59  
    60  syzos_api_rdmsr {
    61  	arg_reg	flags[msr_index, int64]
    62  }
    63  
    64  # CR1 and CR5-7 are reserved.
    65  x86_cr_reg_ids = 0, 2, 3, 4, 8
    66  
    67  syzos_api_wr_crn {
    68  	arg_reg		flags[x86_cr_reg_ids, int64]
    69  	arg_value	int64
    70  }
    71  
    72  # Depending on CR4.DE, registers DR4 and DR5 either alias DR6 and DR7, or generate an #UD.
    73  syzos_api_wr_drn {
    74  	arg_reg		int64[0:7]
    75  	arg_value	int64
    76  }
    77  
    78  x86_in_out_size = 1, 2, 4
    79  
    80  syzos_api_in_dx {
    81  	arg_port	int64[0:65535]
    82  	arg_size	flags[x86_in_out_size, int64]
    83  }
    84  
    85  # In fact the accepted value always fit into int32.
    86  syzos_api_out_dx {
    87  	arg_port	int64[0:65535]
    88  	arg_size	flags[x86_in_out_size, int64]
    89  	arg_val		int64
    90  }
    91  
    92  syzos_api_set_irq_handler {
    93  	arg_vector		int64[0:255]
    94  	arg_handler_type	int64[0:2]
    95  }
    96  
    97  type syzos_api_vm_id int64[0:3]
    98  
    99  syzos_api_nested_load_code {
   100  	vm_id	syzos_api_vm_id
   101  	insns	text[x86_64]
   102  } [packed]
   103  
   104  # VMCS Component Encoding is a 32-bit value, but only bits 0:15 are used.
   105  # Certain bit combinations are invalid, because the number encodes additional
   106  # parameters like access type and width.
   107  # Constants as per Intel SDM vol. 3C, Appendix B.
   108  vmcs_field_encoding [
   109  	control16	int64[0x0:0x4, 2]
   110  	guest16		int64[0x800:0x812, 2]
   111  	host16		int64[0xc00:0xc0c, 2]
   112  	control64	int64[0x2000:0x2033]
   113  	ro64		int64[0x2400:0x2401]
   114  	guest64		int64[0x2800:0x2813]
   115  	host64		int64[0x2c00:0x2c05]
   116  	control32	int64[0x4000:0x4022, 2]
   117  	ro32		int64[0x4400:0x440e, 2]
   118  	guest32		int64[0x4800:0x482e, 2]
   119  	host32		int64[0x4c00:0x4c00]
   120  	control_nat	int64[0x6000:0x600e, 2]
   121  	ro_nat		int64[0x6400:0x640a, 2]
   122  	guest_nat	int64[0x6800:0x6826, 2]
   123  	host_nat	int64[0x6c00:0x6c16, 2]
   124  ]
   125  
   126  syzos_api_nested_intel_vmwrite_mask {
   127  	vm_id		syzos_api_vm_id
   128  	field		vmcs_field_encoding
   129  	set_mask	int64
   130  	unset_mask	int64
   131  	flip_mask	int64
   132  }
   133  
   134  # See AMD Secure Virtual Machine Architecture Reference Manual,
   135  # Appendix C: Layout of VMCB.
   136  vmcb_offset [
   137  	control_area	int64[0x0:0xc0]
   138  	save_area	int64[0x400:0x698]
   139  ]
   140  
   141  syzos_api_nested_amd_vmcb_write_mask {
   142  	vm_id		syzos_api_vm_id
   143  	offset		vmcb_offset
   144  	set_mask	int64
   145  	unset_mask	int64
   146  	flip_mask	int64
   147  }
   148  
   149  # IDs here must match those in executor/common_kvm_amd64_syzos.h.
   150  syzos_api_call$x86 [
   151  	uexit				syzos_api$x86[0, intptr]
   152  	code				syzos_api$x86[10, syzos_api_code$x86]
   153  	cpuid				syzos_api$x86[100, syzos_api_cpuid]
   154  	wrmsr				syzos_api$x86[101, syzos_api_wrmsr]
   155  	rdmsr				syzos_api$x86[102, syzos_api_rdmsr]
   156  	wr_crn				syzos_api$x86[103, syzos_api_wr_crn]
   157  	wr_drn				syzos_api$x86[104, syzos_api_wr_drn]
   158  	in_dx				syzos_api$x86[105, syzos_api_in_dx]
   159  	out_dx				syzos_api$x86[106, syzos_api_out_dx]
   160  	set_irq_handler			syzos_api$x86[200, syzos_api_set_irq_handler]
   161  	enable_nested			syzos_api$x86[300, const[0, intptr]]
   162  	nested_create_vm		syzos_api$x86[301, syzos_api_vm_id]
   163  	nested_load_code		syzos_api$x86[302, syzos_api_nested_load_code]
   164  	nested_vmlaunch			syzos_api$x86[303, syzos_api_vm_id]
   165  	nested_vmresume			syzos_api$x86[304, syzos_api_vm_id]
   166  	nested_intel_vmwrite_mask	syzos_api$x86[340, syzos_api_nested_intel_vmwrite_mask]
   167  	nested_amd_vmcb_write_mask	syzos_api$x86[380, syzos_api_nested_amd_vmcb_write_mask]
   168  ] [varlen]
   169  
   170  kvm_text_x86 [
   171  	textreal	kvm_text_x86_real
   172  	text16		kvm_text_x86_16
   173  	text32		kvm_text_x86_32
   174  	text64		kvm_text_x86_64
   175  ]
   176  
   177  kvm_text_x86_real {
   178  	typ	const[8, intptr]
   179  	text	ptr[in, text[x86_real]]
   180  	size	len[text, intptr]
   181  }
   182  
   183  kvm_text_x86_16 {
   184  	typ	const[16, intptr]
   185  	text	ptr[in, text[x86_16]]
   186  	size	len[text, intptr]
   187  }
   188  
   189  kvm_text_x86_32 {
   190  	typ	const[32, intptr]
   191  	text	ptr[in, text[x86_32]]
   192  	size	len[text, intptr]
   193  }
   194  
   195  kvm_text_x86_64 {
   196  	typ	const[64, intptr]
   197  	text	ptr[in, text[x86_64]]
   198  	size	len[text, intptr]
   199  }
   200  
   201  kvm_setup_opt_x86 [
   202  	cr0	kvm_setup_opt_cr0
   203  	cr4	kvm_setup_opt_cr4
   204  	efer	kvm_setup_opt_efer
   205  	flags	kvm_setup_opt_flags
   206  	cstype0	kvm_setup_opt_cstype0
   207  	cstype3	kvm_setup_opt_cstype3
   208  	dstype0	kvm_setup_opt_dstype0
   209  	dstype3	kvm_setup_opt_dstype3
   210  	vmwrite	kvm_setup_opt_vmwrite
   211  ]
   212  
   213  kvm_setup_opt_cr0 {
   214  	typ	const[0, int64]
   215  	val	flags[kvm_x86_cr0, int64]
   216  }
   217  
   218  kvm_setup_opt_cr4 {
   219  	typ	const[1, int64]
   220  	val	flags[kvm_x86_cr4, int64]
   221  }
   222  
   223  kvm_setup_opt_efer {
   224  	typ	const[2, int64]
   225  	val	flags[kvm_x86_efer, int64]
   226  }
   227  
   228  kvm_setup_opt_flags {
   229  	typ	const[3, int64]
   230  	val	flags[kvm_x86_rflags, int64]
   231  }
   232  
   233  kvm_setup_opt_cstype0 {
   234  	typ	const[4, int64]
   235  	val	int64[0:15]
   236  }
   237  
   238  kvm_setup_opt_cstype3 {
   239  	typ	const[5, int64]
   240  	val	int64[0:15]
   241  }
   242  
   243  kvm_setup_opt_dstype0 {
   244  	typ	const[6, int64]
   245  	val	int64[0:15]
   246  }
   247  
   248  kvm_setup_opt_dstype3 {
   249  	typ	const[7, int64]
   250  	val	int64[0:15]
   251  }
   252  
   253  kvm_setup_opt_vmwrite {
   254  	typ	const[8, int64]
   255  # Low 16 bits are field index, high 48 bits are value.
   256  	sz	const[0, int64:1]
   257  	fld	int64:5
   258  	pad0	const[0, int64:4]
   259  	ftyp	int64:2
   260  	pad1	const[0, int64:1]
   261  	fsz	int64:2
   262  	pad2	const[0, int64:1]
   263  	val	int64:48
   264  }
   265  
   266  kvm_setup_flags = KVM_SETUP_PAGING, KVM_SETUP_PAE, KVM_SETUP_PROTECTED, KVM_SETUP_CPL3, KVM_SETUP_VIRT86, KVM_SETUP_SMM, KVM_SETUP_VM
   267  
   268  define KVM_SETUP_PAGING	(1<<0)
   269  define KVM_SETUP_PAE	(1<<1)
   270  define KVM_SETUP_PROTECTED	(1<<2)
   271  define KVM_SETUP_CPL3	(1<<3)
   272  define KVM_SETUP_VIRT86	(1<<4)
   273  define KVM_SETUP_SMM	(1<<5)
   274  define KVM_SETUP_VM	(1<<6)
   275  
   276  # SGX-related
   277  openat$sgx_provision(fd const[AT_FDCWD], file ptr[in, string["/dev/sgx_provision"]], flags flags[open_flags], mode const[0]) fd_sgx_provision
   278  ioctl$KVM_CAP_SGX_ATTRIBUTE(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_SGX_ATTRIBUTE, fd_sgx_provision]])
   279  
   280  # SEV-related (based on https://www.kernel.org/doc/html/latest/virt/kvm/x86/amd-memory-encryption.html)
   281  openat$sev(fd const[AT_FDCWD], file ptr[in, string["/dev/sev"]], flags flags[open_flags], mode const[0]) fd_sev
   282  
   283  ioctl$KVM_SEV_INIT(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_INIT, const[0, intptr]]])
   284  ioctl$KVM_SEV_ES_INIT(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_ES_INIT, const[0, intptr]]])
   285  ioctl$KVM_SEV_INIT2(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_INIT2, ptr[in, kvm_sev_init]]])
   286  
   287  ioctl$KVM_SEV_LAUNCH_START(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_LAUNCH_START, ptr[inout, kvm_sev_launch_start]]])
   288  ioctl$KVM_SEV_LAUNCH_UPDATE_DATA(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_LAUNCH_UPDATE_DATA, ptr[in, kvm_sev_launch_update_data]]])
   289  ioctl$KVM_SEV_LAUNCH_UPDATE_VMSA(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_LAUNCH_UPDATE_VMSA, const[0, intptr]]])
   290  ioctl$KVM_SEV_LAUNCH_SECRET(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_LAUNCH_SECRET, ptr[in, kvm_sev_launch_secret]]])
   291  ioctl$KVM_SEV_LAUNCH_MEASURE(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_LAUNCH_MEASURE, ptr[in, kvm_sev_launch_measure]]])
   292  ioctl$KVM_SEV_LAUNCH_FINISH(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_LAUNCH_FINISH, const[0, intptr]]])
   293  
   294  ioctl$KVM_SEV_SEND_START(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SEND_START, ptr[in, kvm_sev_send_start]]])
   295  ioctl$KVM_SEV_SEND_UPDATE_DATA(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SEND_UPDATE_DATA, ptr[in, kvm_sev_send_update_data]]])
   296  ioctl$KVM_SEV_SEND_UPDATE_VMSA(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SEND_UPDATE_VMSA, const[0, intptr]]])
   297  ioctl$KVM_SEV_SEND_CANCEL(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SEND_CANCEL, const[0, intptr]]])
   298  ioctl$KVM_SEV_SEND_FINISH(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SEND_FINISH, const[0, intptr]]])
   299  
   300  ioctl$KVM_SEV_RECEIVE_START(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_RECEIVE_START, ptr[inout, kvm_sev_receive_start]]])
   301  ioctl$KVM_SEV_RECEIVE_UPDATE_DATA(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_RECEIVE_UPDATE_DATA, ptr[in, kvm_sev_receive_update_data]]])
   302  ioctl$KVM_SEV_RECEIVE_UPDATE_VMSA(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_RECEIVE_UPDATE_VMSA, const[0, intptr]]])
   303  ioctl$KVM_SEV_RECEIVE_FINISH(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_RECEIVE_FINISH, const[0, intptr]]])
   304  
   305  ioctl$KVM_SEV_GUEST_STATUS(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_GUEST_STATUS, ptr[out, kvm_sev_guest_status]]])
   306  ioctl$KVM_SEV_DBG_DECRYPT(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_DBG_DECRYPT, ptr[in, kvm_sev_dbg]]])
   307  ioctl$KVM_SEV_DBG_ENCRYPT(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_DBG_ENCRYPT, ptr[in, kvm_sev_dbg]]])
   308  ioctl$KVM_SEV_CERT_EXPORT(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_CERT_EXPORT, const[0, intptr]]])
   309  ioctl$KVM_SEV_GET_ATTESTATION_REPORT(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_GET_ATTESTATION_REPORT, ptr[in, kvm_sev_attestation_report]]])
   310  
   311  ioctl$KVM_SEV_SNP_LAUNCH_START(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SNP_LAUNCH_START, ptr[in, kvm_sev_snp_launch_start]]])
   312  ioctl$KVM_SEV_SNP_LAUNCH_UPDATE(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SNP_LAUNCH_UPDATE, ptr[in, kvm_sev_snp_launch_update]]])
   313  ioctl$KVM_SEV_SNP_LAUNCH_FINISH(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_OP], arg ptr[inout, kvm_memory_encrypt_op[KVM_SEV_SNP_LAUNCH_FINISH, ptr[in, kvm_sev_snp_launch_finish]]])
   314  
   315  # Apparently KVM_MEMORY_ENCRYPT_REG_REGION and KVM_MEMORY_ENCRYPT_UNREG_REGION are VM ioctls, despite
   316  # https://docs.kernel.org/virt/kvm/api.html#kvm-memory-encrypt-reg-region says they are system.
   317  ioctl$KVM_MEMORY_ENCRYPT_REG_REGION(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_REG_REGION], arg ptr[in, kvm_enc_region])
   318  ioctl$KVM_MEMORY_ENCRYPT_UNREG_REGION(fd fd_kvmvm, cmd const[KVM_MEMORY_ENCRYPT_UNREG_REGION], arg ptr[in, kvm_enc_region])
   319  
   320  type kvm_memory_encrypt_op[ID, DATA] {
   321  	id	const[ID, int32]
   322  	data	DATA
   323  	error	int32	(out)
   324  	sev_fd	fd_sev	(in)
   325  }
   326  
   327  kvm_sev_init {
   328  	vmsa_features	int64
   329  	flags		int32
   330  	ghcb_version	int16
   331  	pad1		const[0, int16]
   332  	pad2		array[const[0, int32], 8]
   333  }
   334  
   335  kvm_sev_launch_start {
   336  	handle		sev_handle	(inout)
   337  	policy		int32
   338  	dh_addr		vma64[1:4]
   339  	dh_len		len[dh_addr, int32]
   340  	pad0		const[0, int32]
   341  	session_uaddr	vma64[1:4]
   342  	session_len	len[session_uaddr, int32]
   343  	pad1		const[0, int32]
   344  }
   345  
   346  kvm_sev_launch_update_data {
   347  	uaddr	vma64[1:4]
   348  	len	len[uaddr, int32]
   349  	pad0	const[0, int32]
   350  }
   351  
   352  kvm_sev_launch_secret {
   353  	hdr_uaddr	vma64[1:4]
   354  	hdr_len		len[hdr_uaddr, int32]
   355  	pad0		const[0, int32]
   356  	guest_uaddr	vma64[1:4]
   357  	guest_len	len[guest_uaddr, int32]
   358  	pad1		const[0, int32]
   359  	trans_uaddr	vma64[1:4]
   360  	trans_len	len[trans_uaddr, int32]
   361  	pad2		const[0, int32]
   362  }
   363  
   364  kvm_sev_launch_measure {
   365  	uaddr	vma64[1:4]
   366  	len	len[uaddr, int32]
   367  	pad0	const[0, int32]
   368  }
   369  
   370  kvm_sev_guest_status {
   371  	handle	sev_handle
   372  	policy	int32
   373  	state	int8
   374  }
   375  
   376  kvm_sev_dbg {
   377  	src_uaddr	vma64[1:4]
   378  	dst_uaddr	vma64[1:4]
   379  	len		len[src_uaddr, int32]
   380  }
   381  
   382  kvm_sev_attestation_report {
   383  	mnonce	array[int8, 16]
   384  	uaddr	vma64[1:4]
   385  	len	len[uaddr, int32]
   386  	pad0	const[0, int32]
   387  }
   388  
   389  kvm_sev_send_start {
   390  	policy			int32
   391  	pad0			const[0, int32]
   392  	pdh_cert_uaddr		vma64[1:4]
   393  	pdh_cert_len		len[pdh_cert_uaddr, int32]
   394  	pad1			const[0, int32]
   395  	plat_certs_uaddr	vma64[1:4]
   396  	plat_certs_len		len[plat_certs_uaddr, int32]
   397  	pad2			const[0, int32]
   398  	amd_certs_uaddr		vma64[1:4]
   399  	amd_certs_len		len[amd_certs_uaddr, int32]
   400  	pad3			const[0, int32]
   401  	session_uaddr		vma64[1:4]
   402  	session_len		len[session_uaddr, int32]
   403  	pad4			const[0, int32]
   404  }
   405  
   406  kvm_sev_send_update_data {
   407  	hdr_uaddr	vma64[1:4]
   408  	hdr_len		len[hdr_uaddr, int32]
   409  	pad0		const[0, int32]
   410  	guest_uaddr	vma64[1:4]
   411  	guest_len	len[guest_uaddr, int32]
   412  	pad1		const[0, int32]
   413  	trans_uaddr	vma64[1:4]
   414  	trans_len	len[trans_uaddr, int32]
   415  	pad2		const[0, int32]
   416  }
   417  
   418  kvm_sev_receive_start {
   419  	handle		sev_handle	(inout)
   420  	policy		int32
   421  	pdh_addr	vma64[1:4]
   422  	pdh_len		len[pdh_addr, int32]
   423  	pad0		const[0, int32]
   424  	session_uaddr	vma64[1:4]
   425  	session_len	len[session_uaddr, int32]
   426  	pad1		const[0, int32]
   427  }
   428  
   429  kvm_sev_receive_update_data {
   430  	hdr_uaddr	vma64[1:4]
   431  	hdr_len		len[hdr_uaddr, int32]
   432  	pad0		const[0, int32]
   433  	guest_uaddr	vma64[1:4]
   434  	guest_len	len[guest_uaddr, int32]
   435  	pad1		const[0, int32]
   436  	trans_uaddr	vma64[1:4]
   437  	trans_len	len[trans_uaddr, int32]
   438  	pad2		const[0, int32]
   439  }
   440  
   441  kvm_sev_snp_launch_start {
   442  	policy	int64
   443  	gosvw	array[int8, 16]
   444  	flags	int16
   445  	pad0	array[const[0, int8], 6]
   446  	pad1	array[const[0, int64], 4]
   447  }
   448  
   449  kvm_sev_snp_launch_update {
   450  	gfn_start	int64
   451  	uaddr		vma64[1:4]
   452  	len		len[uaddr, int64]
   453  	type		flags[snp_page_type, int8]
   454  	pad0		const[0, int8]
   455  	flags		int16
   456  	pad1		const[0, int32]
   457  	pad2		array[const[0, int64], 4]
   458  }
   459  
   460  snp_page_type = KVM_SEV_SNP_PAGE_TYPE_NORMAL, KVM_SEV_SNP_PAGE_TYPE_ZERO, KVM_SEV_SNP_PAGE_TYPE_UNMEASURED, KVM_SEV_SNP_PAGE_TYPE_SECRETS, KVM_SEV_SNP_PAGE_TYPE_CPUID
   461  
   462  kvm_sev_snp_launch_finish {
   463  	id_block_uaddr	vma64[1:4]
   464  	id_auth_uaddr	vma64[1:4]
   465  	id_block_en	int8
   466  	auth_key_en	int8
   467  	vcek_disabled	int8
   468  	host_data	array[int8, KVM_SEV_SNP_FINISH_DATA_SIZE]
   469  	pad0		array[const[0, int8], 3]
   470  	flags		int16
   471  	pad1		array[const[0, int64], 4]
   472  }
   473  
   474  kvm_enc_region {
   475  	addr	flags[kvm_guest_addrs, int64]
   476  	size	flags[kvm_guest_addr_size, int64]
   477  }
   478  
   479  #x86(-64) specific ioctls
   480  ioctl$KVM_GET_MSR_INDEX_LIST(fd fd_kvm, cmd const[KVM_GET_MSR_INDEX_LIST], arg ptr[inout, kvm_msr_list])
   481  ioctl$KVM_GET_MSR_FEATURE_INDEX_LIST(fd fd_kvm, cmd const[KVM_GET_MSR_FEATURE_INDEX_LIST], arg ptr[inout, kvm_msr_list])
   482  ioctl$KVM_X86_GET_MCE_CAP_SUPPORTED(fd fd_kvm, cmd const[KVM_X86_GET_MCE_CAP_SUPPORTED], arg ptr[out, int64])
   483  ioctl$KVM_SET_IRQCHIP(fd fd_kvmvm, cmd const[KVM_SET_IRQCHIP], arg ptr[in, kvm_irqchip])
   484  ioctl$KVM_GET_IRQCHIP(fd fd_kvmvm, cmd const[KVM_GET_IRQCHIP], arg ptr[inout, kvm_irqchip])
   485  ioctl$KVM_XEN_HVM_CONFIG(fd fd_kvmvm, cmd const[KVM_XEN_HVM_CONFIG], arg ptr[in, kvm_xen_hvm_config])
   486  ioctl$KVM_GET_CLOCK(fd fd_kvmvm, cmd const[KVM_GET_CLOCK], arg ptr[out, kvm_clock_data])
   487  ioctl$KVM_SET_CLOCK(fd fd_kvmvm, cmd const[KVM_SET_CLOCK], arg ptr[in, kvm_clock_data])
   488  ioctl$KVM_SET_TSS_ADDR(fd fd_kvmvm, cmd const[KVM_SET_TSS_ADDR], arg flags[kvm_x86_tss_addr])
   489  ioctl$KVM_SET_IDENTITY_MAP_ADDR(fd fd_kvmvm, cmd const[KVM_SET_IDENTITY_MAP_ADDR], arg ptr[in, flags[kvm_guest_addrs, int64]])
   490  ioctl$KVM_SET_BOOT_CPU_ID(fd fd_kvmvm, cmd const[KVM_SET_BOOT_CPU_ID], arg ptr[in, intptr[0:2]])
   491  ioctl$KVM_CREATE_PIT2(fd fd_kvmvm, cmd const[KVM_CREATE_PIT2], arg ptr[in, kvm_pit_config])
   492  ioctl$KVM_GET_PIT(fd fd_kvmvm, cmd const[KVM_GET_PIT], arg ptr[out, kvm_pit_state2])
   493  ioctl$KVM_SET_PIT(fd fd_kvmvm, cmd const[KVM_SET_PIT], arg ptr[in, kvm_pit_state2])
   494  ioctl$KVM_GET_PIT2(fd fd_kvmvm, cmd const[KVM_GET_PIT2], arg ptr[out, kvm_pit_state2])
   495  ioctl$KVM_SET_PIT2(fd fd_kvmvm, cmd const[KVM_SET_PIT2], arg ptr[in, kvm_pit_state2])
   496  ioctl$KVM_SET_NR_MMU_PAGES(fd fd_kvmvm, cmd const[KVM_SET_NR_MMU_PAGES], arg intptr)
   497  ioctl$KVM_GET_NR_MMU_PAGES(fd fd_kvmvm, cmd const[KVM_GET_NR_MMU_PAGES], arg intptr)
   498  ioctl$KVM_REINJECT_CONTROL(fd fd_kvmvm, cmd const[KVM_REINJECT_CONTROL], arg ptr[in, kvm_reinject_control])
   499  ioctl$KVM_HYPERV_EVENTFD(fd fd_kvmvm, cmd const[KVM_HYPERV_EVENTFD], arg ptr[in, kvm_hyperv_eventfd])
   500  ioctl$KVM_X86_SET_MSR_FILTER(fd fd_kvmvm, cmd const[KVM_X86_SET_MSR_FILTER], arg ptr[in, kvm_msr_filter])
   501  
   502  # Defined by include/linux/kvm_host.h, but for some reason wouldn't extract.
   503  define KVM_MAX_IRQ_ROUTES	4096
   504  ioctl$KVM_CAP_DISABLE_QUIRKS(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_DISABLE_QUIRKS, flags[kvm_x86_quirks, int64]]])
   505  ioctl$KVM_CAP_DISABLE_QUIRKS2(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_DISABLE_QUIRKS2, flags[kvm_x86_quirks, int64]]])
   506  ioctl$KVM_CAP_SPLIT_IRQCHIP(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_SPLIT_IRQCHIP, int64[0:KVM_MAX_IRQ_ROUTES]]])
   507  ioctl$KVM_CAP_X2APIC_API(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_X2APIC_API, flags[kvm_x2apic_apis, int64]]])
   508  ioctl$KVM_CAP_X86_DISABLE_EXITS(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_X86_DISABLE_EXITS, flags[kvm_x86_exits, int64]]])
   509  ioctl$KVM_CAP_MSR_PLATFORM_INFO(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_MSR_PLATFORM_INFO, bool64]])
   510  ioctl$KVM_CAP_EXCEPTION_PAYLOAD(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_EXCEPTION_PAYLOAD, bool64]])
   511  ioctl$KVM_CAP_X86_USER_SPACE_MSR(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_X86_USER_SPACE_MSR, flags[kvm_msr_exit_reasons, int64]]])
   512  ioctl$KVM_CAP_X86_BUS_LOCK_EXIT(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_X86_BUS_LOCK_EXIT, flags[kvm_bus_lock_exits, int64]]])
   513  ioctl$KVM_CAP_VM_COPY_ENC_CONTEXT_FROM(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_VM_COPY_ENC_CONTEXT_FROM, fd_kvmvm]])
   514  ioctl$KVM_CAP_EXIT_HYPERCALL(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_EXIT_HYPERCALL, flags[kvm_hypercall_exits, int64]]])
   515  ioctl$KVM_CAP_EXIT_ON_EMULATION_FAILURE(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_EXIT_ON_EMULATION_FAILURE, bool64]])
   516  ioctl$KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM, fd_kvmvm]])
   517  ioctl$KVM_CAP_MEMORY_FAULT_INFO(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_MEMORY_FAULT_INFO, void]])
   518  ioctl$KVM_CAP_X86_GUEST_MODE(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_X86_GUEST_MODE, void]])
   519  ioctl$KVM_CAP_HYPERV_VP_INDEX(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_VP_INDEX, void]])
   520  ioctl$KVM_CAP_HYPERV_TLBFLUSH(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_TLBFLUSH, void]])
   521  ioctl$KVM_CAP_HYPERV_SEND_IPI(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_SEND_IPI, void]])
   522  ioctl$KVM_CAP_STEAL_TIME(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_STEAL_TIME, void]])
   523  ioctl$KVM_CAP_XEN_HVM(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_XEN_HVM, flags[kvm_xen_hvm_configs, int64]]])
   524  ioctl$KVM_CAP_VM_DISABLE_NX_HUGE_PAGES(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_VM_DISABLE_NX_HUGE_PAGES, const[0, int64]]])
   525  ioctl$KVM_CAP_VM_TYPES(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_VM_TYPES, flags[kvm_x86_vm_types, int64]]])
   526  
   527  # TODO: need more precise handling for arguments below
   528  ioctl$KVM_CAP_MAX_VCPU_ID(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_MAX_VCPU_ID, int64]])
   529  ioctl$KVM_CAP_X86_NOTIFY_VMEXIT(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_X86_NOTIFY_VMEXIT, int64]])
   530  ioctl$KVM_CAP_X86_APIC_BUS_CYCLES_NS(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_X86_APIC_BUS_CYCLES_NS, int64]])
   531  ioctl$KVM_CAP_PMU_CAPABILITY(fd fd_kvmvm, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_PMU_CAPABILITY, int64]])
   532  
   533  ioctl$KVM_TRANSLATE(fd fd_kvmcpu, cmd const[KVM_TRANSLATE], arg ptr[inout, kvm_translation])
   534  # KVM_GET_MSRS can be both a system and a vcpu ioctl: https://docs.kernel.org/virt/kvm/api.html#kvm-get-msrs
   535  ioctl$KVM_GET_MSRS_sys(fd fd_kvm, cmd const[KVM_GET_MSRS], arg ptr[inout, kvm_msrs])
   536  ioctl$KVM_GET_MSRS_cpu(fd fd_kvmcpu, cmd const[KVM_GET_MSRS], arg ptr[inout, kvm_msrs])
   537  ioctl$KVM_SET_MSRS(fd fd_kvmcpu, cmd const[KVM_SET_MSRS], arg ptr[in, kvm_msrs]) (no_squash)
   538  ioctl$KVM_SET_CPUID(fd fd_kvmcpu, cmd const[KVM_SET_CPUID], arg ptr[in, kvm_cpuid]) (no_squash)
   539  # NEED: we should be able to read kvm_cpuid2 with KVM_GET_CPUID2, alter few bits and then call KVM_SET_CPUID2 with that object.
   540  ioctl$KVM_GET_CPUID2(fd fd_kvmcpu, cmd const[KVM_GET_CPUID2], arg ptr[out, kvm_cpuid2])
   541  ioctl$KVM_SET_CPUID2(fd fd_kvmcpu, cmd const[KVM_SET_CPUID2], arg ptr[in, kvm_cpuid2]) (no_squash)
   542  ioctl$KVM_GET_SUPPORTED_CPUID(fd fd_kvm, cmd const[KVM_GET_SUPPORTED_CPUID], arg ptr[inout, kvm_cpuid2])
   543  # KVM_GET_SUPPORTED_HV_CPUID is both a system and a vcpu ioctl: https://docs.kernel.org/virt/kvm/api.html#kvm-get-supported-hv-cpuid
   544  ioctl$KVM_GET_SUPPORTED_HV_CPUID_sys(fd fd_kvm, cmd const[KVM_GET_SUPPORTED_HV_CPUID], arg ptr[inout, kvm_cpuid2])
   545  ioctl$KVM_GET_SUPPORTED_HV_CPUID_cpu(fd fd_kvmcpu, cmd const[KVM_GET_SUPPORTED_HV_CPUID], arg ptr[inout, kvm_cpuid2])
   546  ioctl$KVM_GET_EMULATED_CPUID(fd fd_kvm, cmd const[KVM_GET_EMULATED_CPUID], arg ptr[inout, kvm_cpuid2])
   547  
   548  ioctl$KVM_GET_FPU(fd fd_kvmcpu, cmd const[KVM_GET_FPU], arg ptr[out, kvm_fpu])
   549  ioctl$KVM_SET_FPU(fd fd_kvmcpu, cmd const[KVM_SET_FPU], arg ptr[in, kvm_fpu])
   550  ioctl$KVM_GET_DEBUGREGS(fd fd_kvmcpu, cmd const[KVM_GET_DEBUGREGS], arg ptr[out, kvm_debugregs])
   551  ioctl$KVM_SET_DEBUGREGS(fd fd_kvmcpu, cmd const[KVM_SET_DEBUGREGS], arg ptr[in, kvm_debugregs])
   552  ioctl$KVM_SET_GUEST_DEBUG_x86(fd fd_kvmcpu, cmd const[KVM_SET_GUEST_DEBUG], arg ptr[in, kvm_guest_debug[kvm_guest_debug_arch_x86]])
   553  ioctl$KVM_GET_XCRS(fd fd_kvmcpu, cmd const[KVM_GET_XCRS], arg ptr[out, kvm_xcrs])
   554  ioctl$KVM_SET_XCRS(fd fd_kvmcpu, cmd const[KVM_SET_XCRS], arg ptr[in, kvm_xcrs])
   555  ioctl$KVM_GET_XSAVE(fd fd_kvmcpu, cmd const[KVM_GET_XSAVE], arg ptr[out, kvm_xsave])
   556  ioctl$KVM_SET_XSAVE(fd fd_kvmcpu, cmd const[KVM_SET_XSAVE], arg ptr[in, kvm_xsave])
   557  # KVM_SET_TSC_KHZ and KVM_GET_TSC_KHZ are both vcpu and vm ioctls: https://docs.kernel.org/virt/kvm/api.html#kvm-set-tsc-khz
   558  ioctl$KVM_SET_TSC_KHZ_cpu(fd fd_kvmcpu, cmd const[KVM_SET_TSC_KHZ], arg intptr)
   559  ioctl$KVM_SET_TSC_KHZ_vm(fd fd_kvmvm, cmd const[KVM_SET_TSC_KHZ], arg intptr)
   560  ioctl$KVM_GET_TSC_KHZ_cpu(fd fd_kvmcpu, cmd const[KVM_GET_TSC_KHZ])
   561  ioctl$KVM_GET_TSC_KHZ_vm(fd fd_kvmvm, cmd const[KVM_GET_TSC_KHZ])
   562  ioctl$KVM_GET_LAPIC(fd fd_kvmcpu, cmd const[KVM_GET_LAPIC], arg ptr[out, kvm_lapic_state])
   563  ioctl$KVM_SET_LAPIC(fd fd_kvmcpu, cmd const[KVM_SET_LAPIC], arg ptr[in, kvm_lapic_state])
   564  ioctl$KVM_NMI(fd fd_kvmcpu, cmd const[KVM_NMI])
   565  ioctl$KVM_SMI(fd fd_kvmcpu, cmd const[KVM_SMI])
   566  ioctl$KVM_TPR_ACCESS_REPORTING(fd fd_kvmcpu, cmd const[KVM_TPR_ACCESS_REPORTING], arg ptr[in, kvm_tpr_access_ctl])
   567  ioctl$KVM_SET_VAPIC_ADDR(fd fd_kvmcpu, cmd const[KVM_SET_VAPIC_ADDR], arg ptr[in, flags[kvm_guest_addrs, int64]])
   568  ioctl$KVM_X86_SETUP_MCE(fd fd_kvmcpu, cmd const[KVM_X86_SETUP_MCE], arg ptr[in, kvm_mce_cap])
   569  ioctl$KVM_X86_SET_MCE(fd fd_kvmcpu, cmd const[KVM_X86_SET_MCE], arg ptr[in, kvm_x86_mce])
   570  ioctl$KVM_GET_NESTED_STATE(fd fd_kvmcpu, cmd const[KVM_GET_NESTED_STATE], arg ptr[inout, kvm_nested_state_arg])
   571  ioctl$KVM_SET_NESTED_STATE(fd fd_kvmcpu, cmd const[KVM_SET_NESTED_STATE], arg ptr[in, kvm_nested_state_arg])
   572  # NEED: arch constraints for syscalls. These are amd64/386-specific, but consts are present on all arches, so they are not disabled on other arches.
   573  ioctl$KVM_CAP_HYPERV_SYNIC(fd fd_kvmcpu, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_SYNIC, void]])
   574  ioctl$KVM_CAP_HYPERV_SYNIC2(fd fd_kvmcpu, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_SYNIC2, const[0, int64]]])
   575  ioctl$KVM_CAP_HYPERV_ENLIGHTENED_VMCS(fd fd_kvmcpu, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_ENLIGHTENED_VMCS, ptr[out, int16]]])
   576  ioctl$KVM_CAP_HYPERV_DIRECT_TLBFLUSH(fd fd_kvmcpu, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_DIRECT_TLBFLUSH, void]])
   577  ioctl$KVM_CAP_HYPERV_ENFORCE_CPUID(fd fd_kvmcpu, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_HYPERV_ENFORCE_CPUID, bool64]])
   578  ioctl$KVM_CAP_ENFORCE_PV_FEATURE_CPUID(fd fd_kvmcpu, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_ENFORCE_PV_FEATURE_CPUID, bool64]])
   579  ioctl$KVM_CAP_SYNC_REGS(fd fd_kvmcpu, cmd const[KVM_ENABLE_CAP], arg ptr[in, kvm_enable_cap[KVM_CAP_SYNC_REGS, void]])
   580  
   581  ioctl$KVM_SET_MEMORY_ATTRIBUTES(fd fd_kvmvm, cmd const[KVM_SET_MEMORY_ATTRIBUTES], arg ptr[in, kvm_memory_attributes])
   582  ioctl$KVM_GET_XSAVE2(fd fd_kvmcpu, cmd const[KVM_GET_XSAVE2], arg vma)
   583  
   584  # KVM_GET_SREGS2/KVM_SET_SREGS2 are only supported on x86 - unlike KVM_GET_SREGS/KVM_SET_SREGS.
   585  # https://docs.kernel.org/virt/kvm/api.html#kvm-get-sregs2
   586  ioctl$KVM_GET_SREGS2(fd fd_kvmcpu, cmd const[KVM_GET_SREGS2], arg ptr[out, kvm_sregs2])
   587  ioctl$KVM_SET_SREGS2(fd fd_kvmcpu, cmd const[KVM_SET_SREGS2], arg ptr[in, kvm_sregs2])
   588  
   589  kvm_guest_debug_arch_x86 {
   590  	reg	array[int64, 8]
   591  }
   592  
   593  kvm_vmx_smm {
   594  	flags	flags[kvm_nested_smm_flags, int16]
   595  }
   596  
   597  # Size must be 120 bytes to start data at 128 bytes.
   598  kvm_vmx_nested_state_hdr {
   599  	vmxon_pa			flags[kvm_guest_addrs, int64]
   600  	vmcs12_pa			flags[kvm_guest_addrs, int64]
   601  	smm				kvm_vmx_smm
   602  	flags				flags[kvm_vmx_nested_state_hdr_flags, int32]
   603  	preemption_timer_deadline	int64
   604  } [size[120]]
   605  
   606  kvm_vmx_nested_state_data {
   607  	vmcs12		array[int8, KVM_STATE_NESTED_VMX_VMCS_SIZE]
   608  	shadow_vmcs12	array[int8, KVM_STATE_NESTED_VMX_VMCS_SIZE]
   609  }
   610  
   611  # format = KVM_STATE_NESTED_FORMAT_VMX
   612  kvm_nested_state_vmx {
   613  	flags	flags[kvm_nested_state_flags, int16]
   614  	format	const[0, int16]
   615  	size	bytesize[parent, int32]
   616  	hdr	kvm_vmx_nested_state_hdr
   617  	data	kvm_vmx_nested_state_data
   618  }
   619  
   620  # SVM descriptions taken from https://elixir.bootlin.com/linux/latest/source/arch/x86/include/uapi/asm/kvm.h
   621  # Size must be 120 bytes to start data at 128 bytes.
   622  kvm_svm_nested_state_hdr {
   623  	vmcb_pa	flags[kvm_guest_addrs, int64]
   624  } [size[120]]
   625  
   626  kvm_svm_nested_state_data {
   627  	vmcb12	array[int8, KVM_STATE_NESTED_SVM_VMCB_SIZE]
   628  }
   629  
   630  # format = KVM_STATE_NESTED_FORMAT_SVM
   631  kvm_nested_state_svm {
   632  	flags	flags[kvm_nested_state_flags, int16]
   633  	format	const[1, int16]
   634  	size	bytesize[parent, int32]
   635  	hdr	kvm_svm_nested_state_hdr
   636  	data	kvm_svm_nested_state_data
   637  }
   638  
   639  # See https://docs.kernel.org/virt/kvm/api.html#kvm-get-nested-state.
   640  kvm_nested_state_arg [
   641  	vmx	kvm_nested_state_vmx
   642  	svm	kvm_nested_state_svm
   643  ] [varlen]
   644  
   645  kvm_nested_state_flags = KVM_STATE_NESTED_GUEST_MODE, KVM_STATE_NESTED_RUN_PENDING, KVM_STATE_NESTED_EVMCS, KVM_STATE_NESTED_MTF_PENDING, KVM_STATE_NESTED_GIF_SET
   646  kvm_nested_smm_flags = KVM_STATE_NESTED_SMM_GUEST_MODE, KVM_STATE_NESTED_SMM_VMXON
   647  kvm_vmx_nested_state_hdr_flags = KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE
   648  
   649  kvm_cpuid_entry {
   650  	func	flags[kvm_cpu_function, int32]
   651  	eax	int32
   652  	ebx	int32
   653  	ecx	int32
   654  	edx	int32
   655  	pad	const[0, int32]
   656  }
   657  
   658  kvm_cpuid {
   659  	n	len[entries, int32]
   660  	pad	const[0, int32]
   661  	entries	array[kvm_cpuid_entry]
   662  }
   663  
   664  kvm_cpuid_entry2 {
   665  	func	flags[kvm_cpu_function, int32]
   666  	index	int32
   667  	flags	flags[kvm_cpuid_flags, int32]
   668  	eax	int32
   669  	ebx	int32
   670  	ecx	int32
   671  	edx	int32
   672  	pad	array[const[0, int32], 3]
   673  }
   674  
   675  kvm_cpuid2 {
   676  	n	len[entries, int32]
   677  	pad	const[0, int32]
   678  	entries	array[kvm_cpuid_entry2]
   679  }
   680  
   681  kvm_cpuid_flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX, KVM_CPUID_FLAG_STATEFUL_FUNC, KVM_CPUID_FLAG_STATE_READ_NEXT
   682  
   683  kvm_x86_mce {
   684  	status	flags[kvm_mce_status, int64]
   685  	addr	flags[kvm_guest_addrs, int64]
   686  	misc	int64
   687  	mcg	flags[kvm_mcg_status, int64]
   688  	bank	int8[0:32]
   689  	pad1	array[const[0, int8], 7]
   690  	pad2	array[const[0, int64], 3]
   691  }
   692  
   693  kvm_x86_quirks = KVM_X86_QUIRK_LINT0_REENABLED, KVM_X86_QUIRK_CD_NW_CLEARED, KVM_X86_QUIRK_LAPIC_MMIO_HOLE, KVM_X86_QUIRK_OUT_7E_INC_RIP, KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT, KVM_X86_QUIRK_FIX_HYPERCALL_INSN, KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS
   694  kvm_mce_status = MCI_STATUS_VAL, MCI_STATUS_OVER, MCI_STATUS_UC, MCI_STATUS_EN, MCI_STATUS_MISCV, MCI_STATUS_ADDRV, MCI_STATUS_PCC, MCI_STATUS_S, MCI_STATUS_AR
   695  define KVM_X86_DEFAULT_VM_BIT	(1 << KVM_X86_DEFAULT_VM)
   696  define KVM_X86_SW_PROTECTED_VM_BIT	(1 << KVM_X86_SW_PROTECTED_VM)
   697  define KVM_X86_SEV_VM_BIT	(1 << KVM_X86_SEV_VM)
   698  define KVM_X86_SEV_ES_VM_BIT	(1 << KVM_X86_SEV_ES_VM)
   699  
   700  kvm_chip_id = KVM_IRQCHIP_PIC_MASTER, KVM_IRQCHIP_PIC_SLAVE, KVM_IRQCHIP_IOAPIC
   701  kvm_mcg_status = MCG_STATUS_RIPV, MCG_STATUS_EIPV, MCG_STATUS_MCIP, MCG_STATUS_LMCES
   702  kvm_bus_lock_exits = KVM_BUS_LOCK_DETECTION_OFF, KVM_BUS_LOCK_DETECTION_EXIT
   703  kvm_mce_flags = 1, 2, 4
   704  kvm_x86_vm_types = KVM_X86_DEFAULT_VM_BIT, KVM_X86_SW_PROTECTED_VM_BIT, KVM_X86_SEV_VM_BIT, KVM_X86_SEV_ES_VM_BIT
   705  kvm_xen_hvm_configs = KVM_XEN_HVM_CONFIG_HYPERCALL_MSR, KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL, KVM_XEN_HVM_CONFIG_SHARED_INFO, KVM_XEN_HVM_CONFIG_RUNSTATE, KVM_XEN_HVM_CONFIG_EVTCHN_2LEVEL, KVM_XEN_HVM_CONFIG_EVTCHN_SEND, KVM_XEN_HVM_CONFIG_RUNSTATE_UPDATE_FLAG, KVM_XEN_HVM_CONFIG_PVCLOCK_TSC_UNSTABLE
   706  kvm_clock_flags = KVM_CLOCK_TSC_STABLE, KVM_CLOCK_REALTIME, KVM_CLOCK_HOST_TSC
   707  kvm_x86_tss_addr = 0xd000
   708  kvm_msr_exit_reasons = KVM_MSR_EXIT_REASON_INVAL, KVM_MSR_EXIT_REASON_UNKNOWN, KVM_MSR_EXIT_REASON_FILTER
   709  kvm_x86_dr7 = 1, 2, 4, 8, 16, 32, 64, 128
   710  kvm_x86_exits = KVM_X86_DISABLE_EXITS_MWAIT, KVM_X86_DISABLE_EXITS_HLT, KVM_X86_DISABLE_EXITS_PAUSE, KVM_X86_DISABLE_EXITS_CSTATE
   711  kvm_hypercall_exits = KVM_HC_MAP_GPA_RANGE
   712  kvm_cpu_function = 0, 1, 2, 4, 6, 7, 10, 11, 13, KVM_CPUID_SIGNATURE, KVM_CPUID_FEATURES, 0x80000000, 0x80000001, 0x80000007, 0x80000008, 0x80000019, 0xc0000000, 0xc0000001
   713  kvm_x2apic_apis = KVM_X2APIC_API_USE_32BIT_IDS, KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK
   714  
   715  kvm_tpr_access_ctl {
   716  	enabled	int32
   717  	flags	int32
   718  	reserv	array[const[0, int32], 8]
   719  }
   720  
   721  kvm_reinject_control {
   722  	reinjec	int8
   723  	reserv	array[const[0, int8], 31]
   724  }
   725  
   726  kvm_xcr {
   727  	xcr	int32
   728  	reserv	const[0, int32]
   729  	val	int64
   730  }
   731  
   732  kvm_xcrs {
   733  	nr	int32[0:KVM_MAX_XCRS]
   734  	flags	int32
   735  	xcrs	array[kvm_xcr, KVM_MAX_XCRS]
   736  	pad	array[const[0, int64], 16]
   737  }
   738  
   739  kvm_xsave {
   740  	region	array[int32, 1024]
   741  }
   742  
   743  kvm_clock_data {
   744  	clock		int64
   745  	flags		flags[kvm_clock_flags, int32]
   746  	pad0		int32
   747  	realtime	int64
   748  	host_tsc	int64
   749  	pad		array[const[0, int32], 4]
   750  }
   751  
   752  kvm_xen_hvm_config {
   753  	flags	int32
   754  	msr	flags[msr_index, int32]
   755  	addr32	ptr64[in, array[int8]]
   756  	addr64	ptr64[in, array[int8]]
   757  	size32	len[addr32, int8]
   758  	size64	len[addr64, int8]
   759  	pad	array[const[0, int8], 30]
   760  }
   761  
   762  kvm_mce_cap {
   763  	banks	int8[0:32]
   764  	flags	flags[kvm_mce_flags, int8]
   765  	count	int8
   766  	pad	const[0, int8]
   767  }
   768  
   769  kvm_translation {
   770  	laddr		flags[kvm_guest_addrs, int64]
   771  	paddr		flags[kvm_guest_addrs, int64]
   772  	valid		int8
   773  	writeable	int8
   774  	usermode	int8
   775  	pad		array[const[0, int8], 5]
   776  }
   777  
   778  kvm_hyperv_eventfd {
   779  	conn_id	int32[0:4]
   780  	fd	fd_event
   781  	flags	bool32
   782  	padding	array[const[0, int32], 3]
   783  }
   784  
   785  kvm_msr_filter_range_flags = KVM_MSR_FILTER_READ, KVM_MSR_FILTER_WRITE
   786  
   787  kvm_msr_filter_range {
   788  	flags	flags[kvm_msr_filter_range_flags, int32]
   789  	nmsrs	bitsize[bitmap, int32]
   790  	base	int32
   791  	bitmap	ptr[in, array[int8]]
   792  }
   793  
   794  define KVM_MSR_FILTER_DEFAULT_ALLOW	(0 << 0)
   795  define KVM_MSR_FILTER_DEFAULT_DENY	(1 << 0)
   796  kvm_msr_filter_flags = KVM_MSR_FILTER_DEFAULT_ALLOW, KVM_MSR_FILTER_DEFAULT_DENY
   797  
   798  kvm_msr_filter {
   799  	flags	flags[kvm_msr_filter_flags, int32]
   800  	ranges	array[kvm_msr_filter_range, KVM_MSR_FILTER_MAX_RANGES]
   801  }
   802  
   803  kvm_fpu {
   804  	fpr		array[const[0, int64], 16]
   805  	fcw		int16
   806  	fsw		int16
   807  	ftws		int8
   808  	pad1		const[0, int8]
   809  	last_opcode	int16
   810  	last_ip		flags[kvm_guest_addrs, int64]
   811  	last_dp		flags[kvm_guest_addrs, int64]
   812  	xmm		array[const[0, int64], 32]
   813  	mxcsr		int32
   814  	pad2		const[0, int32]
   815  }
   816  
   817  kvm_pit_state2 {
   818  	chans	array[kvm_pit_channel_state, 3]
   819  	flags	int32
   820  	pad	array[const[0, int32], 9]
   821  }
   822  
   823  kvm_pit_channel_state {
   824  	count	int32
   825  	lcount	int16
   826  	latched	int8
   827  	lstatus	int8
   828  	status	int8
   829  	rstate	int8
   830  	wstate	int8
   831  	wlatch	int8
   832  	rw	int8
   833  	mode	int8
   834  	bcd	int8
   835  	gate	int8
   836  	ltime	int64
   837  }
   838  
   839  kvm_pit_config {
   840  	flags	int32
   841  	pad	array[const[0, int32], 15]
   842  }
   843  
   844  kvm_lapic_state {
   845  	regs	array[int8, KVM_APIC_REG_SIZE]
   846  }
   847  
   848  kvm_msr_list {
   849  	n	len[indices, int32]
   850  	indices	array[const[0, int32]]
   851  }
   852  
   853  kvm_msrs {
   854  	nmsrs	len[entries, int32]
   855  	pad	const[0, int32]
   856  	entries	array[kvm_msr_entry]
   857  } [packed]
   858  
   859  kvm_msr_entry {
   860  	index	flags[msr_index, int32]
   861  	reserv	const[0, int32]
   862  	data	int64
   863  }
   864  
   865  msr_index = 0x0, 0x1, 0x10, 0x11, 0x12, 0x13, 0x17, 0x1b, 0x20, 0x21, 0x28, 0x29, 0x2a, 0x2c, 0x33, 0x34, 0x3a, 0x3b, 0x40, 0x60, 0x79, 0x88, 0x89, 0x8a, 0x8b, 0x9b, 0x9e, 0xc1, 0xc2, 0xcd, 0xce, 0xe2, 0xe7, 0xe8, 0xfe, 0x116, 0x118, 0x119, 0x11a, 0x11b, 0x11e, 0x174, 0x175, 0x176, 0x179, 0x17a, 0x17b, 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x187, 0x188, 0x189, 0x18a, 0x198, 0x199, 0x19a, 0x19b, 0x19c, 0x19d, 0x1a0, 0x1a2, 0x1a6, 0x1a7, 0x1aa, 0x1ad, 0x1ae, 0x1af, 0x1b0, 0x1b1, 0x1b2, 0x1c8, 0x1c9, 0x1d9, 0x1db, 0x1dc, 0x1dd, 0x1de, 0x1e0, 0x1fc, 0x200, 0x201, 0x202, 0x203, 0x204, 0x205, 0x206, 0x207, 0x208, 0x209, 0x20a, 0x20b, 0x20c, 0x20d, 0x20e, 0x20f, 0x210, 0x211, 0x212, 0x213, 0x214, 0x215, 0x216, 0x217, 0x218, 0x219, 0x21a, 0x21b, 0x21c, 0x21d, 0x21e, 0x21f, 0x220, 0x221, 0x222, 0x223, 0x224, 0x225, 0x226, 0x227, 0x228, 0x229, 0x22a, 0x22b, 0x22c, 0x22d, 0x22e, 0x22f, 0x230, 0x231, 0x232, 0x233, 0x234, 0x235, 0x236, 0x237, 0x238, 0x239, 0x23a, 0x23b, 0x23c, 0x23d, 0x23e, 0x23f, 0x240, 0x241, 0x242, 0x243, 0x244, 0x245, 0x246, 0x247, 0x248, 0x249, 0x24a, 0x24b, 0x24c, 0x24d, 0x24e, 0x24f, 0x250, 0x251, 0x252, 0x253, 0x254, 0x255, 0x256, 0x257, 0x258, 0x259, 0x25a, 0x25b, 0x25c, 0x25d, 0x25e, 0x25f, 0x260, 0x261, 0x262, 0x263, 0x264, 0x265, 0x266, 0x267, 0x268, 0x269, 0x26a, 0x26b, 0x26c, 0x26d, 0x26e, 0x26f, 0x270, 0x271, 0x272, 0x273, 0x274, 0x275, 0x276, 0x277, 0x278, 0x279, 0x27a, 0x27b, 0x27c, 0x27d, 0x27e, 0x27f, 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287, 0x288, 0x289, 0x28a, 0x28b, 0x28c, 0x28d, 0x28e, 0x28f, 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299, 0x29a, 0x29b, 0x29c, 0x29d, 0x29e, 0x29f, 0x2a0, 0x2a1, 0x2a2, 0x2a3, 0x2a4, 0x2a5, 0x2a6, 0x2a7, 0x2a8, 0x2a9, 0x2aa, 0x2ab, 0x2ac, 0x2ad, 0x2ae, 0x2af, 0x2b0, 0x2b1, 0x2b2, 0x2b3, 0x2b4, 0x2b5, 0x2b6, 0x2b7, 0x2b8, 0x2b9, 0x2ba, 0x2bb, 0x2bc, 0x2bd, 0x2be, 0x2bf, 0x2c0, 0x2c1, 0x2c2, 0x2c3, 0x2c4, 0x2c5, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca, 0x2cb, 0x2cc, 0x2cd, 0x2ce, 0x2cf, 0x2d0, 0x2d1, 0x2d2, 0x2d3, 0x2d4, 0x2d5, 0x2d6, 0x2d7, 0x2d8, 0x2d9, 0x2da, 0x2db, 0x2dc, 0x2dd, 0x2de, 0x2df, 0x2e0, 0x2e1, 0x2e2, 0x2e3, 0x2e4, 0x2e5, 0x2e6, 0x2e7, 0x2e8, 0x2e9, 0x2ea, 0x2eb, 0x2ec, 0x2ed, 0x2ee, 0x2ef, 0x2f0, 0x2f1, 0x2f2, 0x2f3, 0x2f4, 0x2f5, 0x2f6, 0x2f7, 0x2f8, 0x2f9, 0x2fa, 0x2fb, 0x2fc, 0x2fd, 0x2fe, 0x2ff, 0x300, 0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x307, 0x308, 0x309, 0x30a, 0x30b, 0x30c, 0x30d, 0x30e, 0x30f, 0x310, 0x311, 0x312, 0x313, 0x314, 0x315, 0x316, 0x317, 0x318, 0x319, 0x31a, 0x31b, 0x31c, 0x31d, 0x31e, 0x31f, 0x320, 0x321, 0x322, 0x323, 0x324, 0x325, 0x326, 0x327, 0x328, 0x329, 0x32a, 0x32b, 0x32c, 0x32d, 0x32e, 0x32f, 0x330, 0x331, 0x332, 0x333, 0x334, 0x335, 0x336, 0x337, 0x338, 0x339, 0x33a, 0x33b, 0x33c, 0x33d, 0x33e, 0x33f, 0x340, 0x341, 0x342, 0x343, 0x344, 0x345, 0x346, 0x347, 0x348, 0x349, 0x34a, 0x34b, 0x34c, 0x34d, 0x34e, 0x34f, 0x350, 0x351, 0x352, 0x353, 0x354, 0x355, 0x356, 0x357, 0x358, 0x359, 0x35a, 0x35b, 0x35c, 0x35d, 0x35e, 0x35f, 0x360, 0x361, 0x362, 0x363, 0x364, 0x365, 0x366, 0x367, 0x368, 0x369, 0x36a, 0x36b, 0x36c, 0x36d, 0x36e, 0x36f, 0x370, 0x371, 0x372, 0x373, 0x374, 0x375, 0x376, 0x377, 0x378, 0x379, 0x37a, 0x37b, 0x37c, 0x37d, 0x37e, 0x37f, 0x380, 0x381, 0x382, 0x383, 0x384, 0x385, 0x386, 0x387, 0x388, 0x389, 0x38a, 0x38b, 0x38c, 0x38d, 0x38e, 0x38f, 0x390, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f, 0x3a0, 0x3a1, 0x3a2, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7, 0x3a8, 0x3a9, 0x3aa, 0x3ab, 0x3ac, 0x3ad, 0x3ae, 0x3af, 0x3b0, 0x3b1, 0x3b2, 0x3b3, 0x3b4, 0x3b5, 0x3b6, 0x3b7, 0x3b8, 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3be, 0x3bf, 0x3c2, 0x3c3, 0x3c4, 0x3c5, 0x3f1, 0x3f2, 0x3f6, 0x3f7, 0x3f8, 0x3f9, 0x3fa, 0x3fc, 0x3fd, 0x3fe, 0x3ff, 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0x40d, 0x40e, 0x40f, 0x410, 0x411, 0x412, 0x413, 0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x486, 0x487, 0x488, 0x489, 0x48a, 0x48b, 0x48c, 0x48d, 0x48e, 0x48f, 0x490, 0x491, 0x4c1, 0x4d0, 0x560, 0x561, 0x570, 0x571, 0x572, 0x580, 0x581, 0x582, 0x583, 0x584, 0x585, 0x586, 0x587, 0x600, 0x606, 0x60a, 0x60b, 0x60c, 0x60d, 0x610, 0x611, 0x613, 0x614, 0x618, 0x619, 0x61b, 0x61c, 0x630, 0x631, 0x632, 0x633, 0x634, 0x635, 0x638, 0x639, 0x63a, 0x63b, 0x640, 0x641, 0x642, 0x648, 0x649, 0x64a, 0x64b, 0x64c, 0x64d, 0x64e, 0x64f, 0x658, 0x659, 0x65a, 0x65b, 0x660, 0x668, 0x669, 0x680, 0x690, 0x6b0, 0x6b1, 0x6c0, 0x6e0, 0x770, 0x771, 0x772, 0x773, 0x774, 0x777, 0x800, 0x801, 0x802, 0x803, 0x804, 0x805, 0x806, 0x807, 0x808, 0x809, 0x80a, 0x80b, 0x80c, 0x80d, 0x80e, 0x80f, 0x810, 0x811, 0x812, 0x813, 0x814, 0x815, 0x816, 0x817, 0x818, 0x819, 0x81a, 0x81b, 0x81c, 0x81d, 0x81e, 0x81f, 0x820, 0x821, 0x822, 0x823, 0x824, 0x825, 0x826, 0x827, 0x828, 0x829, 0x82a, 0x82b, 0x82c, 0x82d, 0x82e, 0x82f, 0x830, 0x831, 0x832, 0x833, 0x834, 0x835, 0x836, 0x837, 0x838, 0x839, 0x83a, 0x83b, 0x83c, 0x83d, 0x83e, 0x83f, 0x840, 0x841, 0x842, 0x843, 0x844, 0x845, 0x846, 0x847, 0x848, 0x849, 0x84a, 0x84b, 0x84c, 0x84d, 0x84e, 0x84f, 0x850, 0x851, 0x852, 0x853, 0x854, 0x855, 0x856, 0x857, 0x858, 0x859, 0x85a, 0x85b, 0x85c, 0x85d, 0x85e, 0x85f, 0x860, 0x861, 0x862, 0x863, 0x864, 0x865, 0x866, 0x867, 0x868, 0x869, 0x86a, 0x86b, 0x86c, 0x86d, 0x86e, 0x86f, 0x870, 0x871, 0x872, 0x873, 0x874, 0x875, 0x876, 0x877, 0x878, 0x879, 0x87a, 0x87b, 0x87c, 0x87d, 0x87e, 0x87f, 0x880, 0x881, 0x882, 0x883, 0x884, 0x885, 0x886, 0x887, 0x888, 0x889, 0x88a, 0x88b, 0x88c, 0x88d, 0x88e, 0x88f, 0x890, 0x891, 0x892, 0x893, 0x894, 0x895, 0x896, 0x897, 0x898, 0x899, 0x89a, 0x89b, 0x89c, 0x89d, 0x89e, 0x89f, 0x8a0, 0x8a1, 0x8a2, 0x8a3, 0x8a4, 0x8a5, 0x8a6, 0x8a7, 0x8a8, 0x8a9, 0x8aa, 0x8ab, 0x8ac, 0x8ad, 0x8ae, 0x8af, 0x8b0, 0x8b1, 0x8b2, 0x8b3, 0x8b4, 0x8b5, 0x8b6, 0x8b7, 0x8b8, 0x8b9, 0x8ba, 0x8bb, 0x8bc, 0x8bd, 0x8be, 0x8bf, 0x8c0, 0x8c1, 0x8c2, 0x8c3, 0x8c4, 0x8c5, 0x8c6, 0x8c7, 0x8c8, 0x8c9, 0x8ca, 0x8cb, 0x8cc, 0x8cd, 0x8ce, 0x8cf, 0x8d0, 0x8d1, 0x8d2, 0x8d3, 0x8d4, 0x8d5, 0x8d6, 0x8d7, 0x8d8, 0x8d9, 0x8da, 0x8db, 0x8dc, 0x8dd, 0x8de, 0x8df, 0x8e0, 0x8e1, 0x8e2, 0x8e3, 0x8e4, 0x8e5, 0x8e6, 0x8e7, 0x8e8, 0x8e9, 0x8ea, 0x8eb, 0x8ec, 0x8ed, 0x8ee, 0x8ef, 0x8f0, 0x8f1, 0x8f2, 0x8f3, 0x8f4, 0x8f5, 0x8f6, 0x8f7, 0x8f8, 0x8f9, 0x8fa, 0x8fb, 0x8fc, 0x8fd, 0x8fe, 0x8ff, 0x900, 0x901, 0x902, 0x903, 0x904, 0x905, 0x906, 0x907, 0x908, 0x909, 0x90a, 0x90b, 0x90c, 0x90d, 0x90e, 0x90f, 0x910, 0x911, 0x912, 0x913, 0x914, 0x915, 0x916, 0x917, 0x918, 0x919, 0x91a, 0x91b, 0x91c, 0x91d, 0x91e, 0x91f, 0x920, 0x921, 0x922, 0x923, 0x924, 0x925, 0x926, 0x927, 0x928, 0x929, 0x92a, 0x92b, 0x92c, 0x92d, 0x92e, 0x92f, 0x930, 0x931, 0x932, 0x933, 0x934, 0x935, 0x936, 0x937, 0x938, 0x939, 0x93a, 0x93b, 0x93c, 0x93d, 0x93e, 0x93f, 0x940, 0x941, 0x942, 0x943, 0x944, 0x945, 0x946, 0x947, 0x948, 0x949, 0x94a, 0x94b, 0x94c, 0x94d, 0x94e, 0x94f, 0x950, 0x951, 0x952, 0x953, 0x954, 0x955, 0x956, 0x957, 0x958, 0x959, 0x95a, 0x95b, 0x95c, 0x95d, 0x95e, 0x95f, 0x960, 0x961, 0x962, 0x963, 0x964, 0x965, 0x966, 0x967, 0x968, 0x969, 0x96a, 0x96b, 0x96c, 0x96d, 0x96e, 0x96f, 0x970, 0x971, 0x972, 0x973, 0x974, 0x975, 0x976, 0x977, 0x978, 0x979, 0x97a, 0x97b, 0x97c, 0x97d, 0x97e, 0x97f, 0x980, 0x981, 0x982, 0x983, 0x984, 0x985, 0x986, 0x987, 0x988, 0x989, 0x98a, 0x98b, 0x98c, 0x98d, 0x98e, 0x98f, 0x990, 0x991, 0x992, 0x993, 0x994, 0x995, 0x996, 0x997, 0x998, 0x999, 0x99a, 0x99b, 0x99c, 0x99d, 0x99e, 0x99f, 0x9a0, 0x9a1, 0x9a2, 0x9a3, 0x9a4, 0x9a5, 0x9a6, 0x9a7, 0x9a8, 0x9a9, 0x9aa, 0x9ab, 0x9ac, 0x9ad, 0x9ae, 0x9af, 0x9b0, 0x9b1, 0x9b2, 0x9b3, 0x9b4, 0x9b5, 0x9b6, 0x9b7, 0x9b8, 0x9b9, 0x9ba, 0x9bb, 0x9bc, 0x9bd, 0x9be, 0x9bf, 0x9c0, 0x9c1, 0x9c2, 0x9c3, 0x9c4, 0x9c5, 0x9c6, 0x9c7, 0x9c8, 0x9c9, 0x9ca, 0x9cb, 0x9cc, 0x9cd, 0x9ce, 0x9cf, 0x9d0, 0x9d1, 0x9d2, 0x9d3, 0x9d4, 0x9d5, 0x9d6, 0x9d7, 0x9d8, 0x9d9, 0x9da, 0x9db, 0x9dc, 0x9dd, 0x9de, 0x9df, 0x9e0, 0x9e1, 0x9e2, 0x9e3, 0x9e4, 0x9e5, 0x9e6, 0x9e7, 0x9e8, 0x9e9, 0x9ea, 0x9eb, 0x9ec, 0x9ed, 0x9ee, 0x9ef, 0x9f0, 0x9f1, 0x9f2, 0x9f3, 0x9f4, 0x9f5, 0x9f6, 0x9f7, 0x9f8, 0x9f9, 0x9fa, 0x9fb, 0x9fc, 0x9fd, 0x9fe, 0x9ff, 0xa00, 0xa01, 0xa02, 0xa03, 0xa04, 0xa05, 0xa06, 0xa07, 0xa08, 0xa09, 0xa0a, 0xa0b, 0xa0c, 0xa0d, 0xa0e, 0xa0f, 0xa10, 0xa11, 0xa12, 0xa13, 0xa14, 0xa15, 0xa16, 0xa17, 0xa18, 0xa19, 0xa1a, 0xa1b, 0xa1c, 0xa1d, 0xa1e, 0xa1f, 0xa20, 0xa21, 0xa22, 0xa23, 0xa24, 0xa25, 0xa26, 0xa27, 0xa28, 0xa29, 0xa2a, 0xa2b, 0xa2c, 0xa2d, 0xa2e, 0xa2f, 0xa30, 0xa31, 0xa32, 0xa33, 0xa34, 0xa35, 0xa36, 0xa37, 0xa38, 0xa39, 0xa3a, 0xa3b, 0xa3c, 0xa3d, 0xa3e, 0xa3f, 0xa40, 0xa41, 0xa42, 0xa43, 0xa44, 0xa45, 0xa46, 0xa47, 0xa48, 0xa49, 0xa4a, 0xa4b, 0xa4c, 0xa4d, 0xa4e, 0xa4f, 0xa50, 0xa51, 0xa52, 0xa53, 0xa54, 0xa55, 0xa56, 0xa57, 0xa58, 0xa59, 0xa5a, 0xa5b, 0xa5c, 0xa5d, 0xa5e, 0xa5f, 0xa60, 0xa61, 0xa62, 0xa63, 0xa64, 0xa65, 0xa66, 0xa67, 0xa68, 0xa69, 0xa6a, 0xa6b, 0xa6c, 0xa6d, 0xa6e, 0xa6f, 0xa70, 0xa71, 0xa72, 0xa73, 0xa74, 0xa75, 0xa76, 0xa77, 0xa78, 0xa79, 0xa7a, 0xa7b, 0xa7c, 0xa7d, 0xa7e, 0xa7f, 0xa80, 0xa81, 0xa82, 0xa83, 0xa84, 0xa85, 0xa86, 0xa87, 0xa88, 0xa89, 0xa8a, 0xa8b, 0xa8c, 0xa8d, 0xa8e, 0xa8f, 0xa90, 0xa91, 0xa92, 0xa93, 0xa94, 0xa95, 0xa96, 0xa97, 0xa98, 0xa99, 0xa9a, 0xa9b, 0xa9c, 0xa9d, 0xa9e, 0xa9f, 0xaa0, 0xaa1, 0xaa2, 0xaa3, 0xaa4, 0xaa5, 0xaa6, 0xaa7, 0xaa8, 0xaa9, 0xaaa, 0xaab, 0xaac, 0xaad, 0xaae, 0xaaf, 0xab0, 0xab1, 0xab2, 0xab3, 0xab4, 0xab5, 0xab6, 0xab7, 0xab8, 0xab9, 0xaba, 0xabb, 0xabc, 0xabd, 0xabe, 0xabf, 0xac0, 0xac1, 0xac2, 0xac3, 0xac4, 0xac5, 0xac6, 0xac7, 0xac8, 0xac9, 0xaca, 0xacb, 0xacc, 0xacd, 0xace, 0xacf, 0xad0, 0xad1, 0xad2, 0xad3, 0xad4, 0xad5, 0xad6, 0xad7, 0xad8, 0xad9, 0xada, 0xadb, 0xadc, 0xadd, 0xade, 0xadf, 0xae0, 0xae1, 0xae2, 0xae3, 0xae4, 0xae5, 0xae6, 0xae7, 0xae8, 0xae9, 0xaea, 0xaeb, 0xaec, 0xaed, 0xaee, 0xaef, 0xaf0, 0xaf1, 0xaf2, 0xaf3, 0xaf4, 0xaf5, 0xaf6, 0xaf7, 0xaf8, 0xaf9, 0xafa, 0xafb, 0xafc, 0xafd, 0xafe, 0xaff, 0xb00, 0xb01, 0xb02, 0xb03, 0xb04, 0xb05, 0xb06, 0xb07, 0xb08, 0xb09, 0xb0a, 0xb0b, 0xb0c, 0xb0d, 0xb0e, 0xb0f, 0xb10, 0xb11, 0xb12, 0xb13, 0xb14, 0xb15, 0xb16, 0xb17, 0xb18, 0xb19, 0xb1a, 0xb1b, 0xb1c, 0xb1d, 0xb1e, 0xb1f, 0xb20, 0xb21, 0xb22, 0xb23, 0xb24, 0xb25, 0xb26, 0xb27, 0xb28, 0xb29, 0xb2a, 0xb2b, 0xb2c, 0xb2d, 0xb2e, 0xb2f, 0xb30, 0xb31, 0xb32, 0xb33, 0xb34, 0xb35, 0xb36, 0xb37, 0xb38, 0xb39, 0xb3a, 0xb3b, 0xb3c, 0xb3d, 0xb3e, 0xb3f, 0xb40, 0xb41, 0xb42, 0xb43, 0xb44, 0xb45, 0xb46, 0xb47, 0xb48, 0xb49, 0xb4a, 0xb4b, 0xb4c, 0xb4d, 0xb4e, 0xb4f, 0xb50, 0xb51, 0xb52, 0xb53, 0xb54, 0xb55, 0xb56, 0xb57, 0xb58, 0xb59, 0xb5a, 0xb5b, 0xb5c, 0xb5d, 0xb5e, 0xb5f, 0xb60, 0xb61, 0xb62, 0xb63, 0xb64, 0xb65, 0xb66, 0xb67, 0xb68, 0xb69, 0xb6a, 0xb6b, 0xb6c, 0xb6d, 0xb6e, 0xb6f, 0xb70, 0xb71, 0xb72, 0xb73, 0xb74, 0xb75, 0xb76, 0xb77, 0xb78, 0xb79, 0xb7a, 0xb7b, 0xb7c, 0xb7d, 0xb7e, 0xb7f, 0xb80, 0xb81, 0xb82, 0xb83, 0xb84, 0xb85, 0xb86, 0xb87, 0xb88, 0xb89, 0xb8a, 0xb8b, 0xb8c, 0xb8d, 0xb8e, 0xb8f, 0xb90, 0xb91, 0xb92, 0xb93, 0xb94, 0xb95, 0xb96, 0xb97, 0xb98, 0xb99, 0xb9a, 0xb9b, 0xb9c, 0xb9d, 0xb9e, 0xb9f, 0xba0, 0xba1, 0xba2, 0xba3, 0xba4, 0xba5, 0xba6, 0xba7, 0xba8, 0xba9, 0xbaa, 0xbab, 0xbac, 0xbad, 0xbae, 0xbaf, 0xbb0, 0xbb1, 0xbb2, 0xbb3, 0xbb4, 0xbb5, 0xbb6, 0xbb7, 0xbb8, 0xbb9, 0xbba, 0xbbb, 0xbbc, 0xbbd, 0xbbe, 0xbbf, 0xbc0, 0xbc1, 0xbc2, 0xbc3, 0xbc4, 0xbc5, 0xbc6, 0xbc7, 0xbc8, 0xbc9, 0xbca, 0xbcb, 0xbcc, 0xbcd, 0xbce, 0xbcf, 0xbd0, 0xbd1, 0xbd2, 0xbd3, 0xbd4, 0xbd5, 0xbd6, 0xbd7, 0xbd8, 0xbd9, 0xbda, 0xbdb, 0xbdc, 0xbdd, 0xbde, 0xbdf, 0xbe0, 0xbe1, 0xbe2, 0xbe3, 0xbe4, 0xbe5, 0xbe6, 0xbe7, 0xbe8, 0xbe9, 0xbea, 0xbeb, 0xbec, 0xbed, 0xbee, 0xbef, 0xbf0, 0xbf1, 0xbf2, 0xbf3, 0xbf4, 0xbf5, 0xbf6, 0xbf7, 0xbf8, 0xbf9, 0xbfa, 0xbfb, 0xbfc, 0xbfd, 0xbfe, 0xbff, 0xd90, 0xda0, 0xdc0, 0xdc1, 0xdc2, 0xdc3, 0xdc4, 0xdc5, 0xdc6, 0xdc7, 0x40000000, 0x40000001, 0x40000002, 0x40000003, 0x40000010, 0x40000020, 0x40000022, 0x40000023, 0x40000070, 0x40000071, 0x40000072, 0x40000073, 0x40000080, 0x40000081, 0x40000082, 0x40000083, 0x40000084, 0x40000090, 0x40000091, 0x40000092, 0x40000093, 0x40000094, 0x40000095, 0x40000096, 0x40000097, 0x40000098, 0x40000099, 0x4000009a, 0x4000009b, 0x4000009c, 0x4000009d, 0x4000009e, 0x4000009f, 0x400000b0, 0x400000b1, 0x400000b2, 0x400000b3, 0x400000b4, 0x400000b5, 0x400000b6, 0x400000b7, 0x40000100, 0x40000101, 0x40000102, 0x40000103, 0x40000104, 0x40000105, 0x4b564d00, 0x4b564d01, 0x4b564d02, 0x4b564d03, 0x4b564d04, 0xc0000080, 0xc0000081, 0xc0000082, 0xc0000083, 0xc0000084, 0xc0000100, 0xc0000101, 0xc0000102, 0xc0000103, 0xc0000104, 0xc001001f, 0xc0010020, 0xc0010044, 0xc0010062, 0xc0010063, 0xc0010064, 0xc0010114, 0xc0010115, 0xc0010117, 0xc0010140, 0xc0010141, 0xc0011020, 0xc0011022, 0xc001102a, 0xc0011030, 0xc0011031, 0xc0011032, 0xc0011033, 0xc0011034, 0xc0011035, 0xc0011036, 0xc0011037, 0xc0011038, 0xc0011039, 0xc001103a, 0xc001103b, 0xc001103d
   866  
   867  kvm_irqchip {
   868  	chipid	flags[kvm_chip_id, int32]
   869  	pad	const[0, int32]
   870  	chip	kvm_irq_chip
   871  }
   872  
   873  kvm_irq_chip [
   874  	pic	kvm_pic_state
   875  	ioapic	kvm_ioapic_state
   876  ] [size[512]]
   877  
   878  kvm_pic_state {
   879  	lastirr	int8
   880  	irr	int8
   881  	imr	int8
   882  	isr	int8
   883  	padd	int8
   884  	irqbase	int8
   885  	readreg	int8
   886  	poll	int8
   887  	special	int8
   888  	initst	int8
   889  	autoeoi	int8
   890  	rotate	int8
   891  	nestedm	int8
   892  	init4	int8
   893  	elcr	int8
   894  	elcrmas	int8
   895  }
   896  
   897  kvm_ioapic_state {
   898  	base	flags[kvm_guest_addrs, int64]
   899  	ioregs	int32
   900  	id	int32
   901  	irr	int32
   902  	pad	const[0, int32]
   903  	redir	array[kvm_ioapic_redir, 24]
   904  }
   905  
   906  kvm_ioapic_redir {
   907  	vector	int8
   908  	f0	int8
   909  	f1	int8
   910  	reserv	array[const[0, int8], 4]
   911  	destid	int8
   912  }
   913  
   914  kvm_debugregs {
   915  	db	array[flags[kvm_guest_addrs, int64], 4]
   916  	dr6	int64
   917  	dr7	flags[kvm_x86_dr7, int64]
   918  	flags	int64
   919  	reserv	array[const[0, int64], 9]
   920  }
   921  
   922  kvm_memory_attribute_flags = KVM_MEMORY_ATTRIBUTE_PRIVATE
   923  
   924  kvm_memory_attributes {
   925  	address		flags[kvm_guest_addrs, int64]
   926  	size		flags[kvm_guest_addr_size, int64]
   927  	attributes	flags[kvm_memory_attribute_flags, int64]
   928  	flags		const[0, int64]
   929  }
   930  
   931  kvm_sregs2_flags = KVM_SREGS2_FLAGS_PDPTRS_VALID
   932  
   933  kvm_sregs2 {
   934  	cs	kvm_segment
   935  	ds	kvm_segment
   936  	es	kvm_segment
   937  	fs	kvm_segment
   938  	gs	kvm_segment
   939  	ss	kvm_segment
   940  	tr	kvm_segment
   941  	ldt	kvm_segment
   942  	gdt	kvm_dtable
   943  	idt	kvm_dtable
   944  	cr0	flags[kvm_x86_cr0, int64]
   945  	cr2	const[0, int64]
   946  # TODO: this should point to page table
   947  	cr3	flags[kvm_guest_addrs, int64]
   948  	cr4	flags[kvm_x86_cr4, int64]
   949  	cr8	int64[0:15]
   950  	efer	flags[kvm_x86_efer, int64]
   951  	apic	flags[kvm_guest_addrs, int64]
   952  	flags	flags[kvm_sregs2_flags, int64]
   953  	pdptrs	array[int64, 4]
   954  }