* Re: [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch}
@ 2023-10-13 21:26 kernel test robot
0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2023-10-13 21:26 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp
::::::
:::::: Manual check reason: "low confidence bisect report"
::::::
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20231010160300.1136799-7-vkuznets@redhat.com>
References: <20231010160300.1136799-7-vkuznets@redhat.com>
TO: Vitaly Kuznetsov <vkuznets@redhat.com>
Hi Vitaly,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build warnings:
[auto build test WARNING on kvm/queue]
[cannot apply to mst-vhost/linux-next kvm/linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Vitaly-Kuznetsov/KVM-x86-xen-Remove-unneeded-xen-context-from-struct-kvm_arch-when-CONFIG_KVM_XEN/20231011-001336
base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue
patch link: https://lore.kernel.org/r/20231010160300.1136799-7-vkuznets%40redhat.com
patch subject: [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch}
:::::: branch date: 3 days ago
:::::: commit date: 3 days ago
config: i386-randconfig-063-20231013 (https://download.01.org/0day-ci/archive/20231014/202310140532.d8aEDVAY-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231014/202310140532.d8aEDVAY-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/r/202310140532.d8aEDVAY-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:11:9: sparse: sparse: cast truncates bits from constant value (1a079a becomes 79a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:13:9: sparse: sparse: cast truncates bits from constant value (1a071a becomes 71a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:15:9: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:17:9: sparse: sparse: cast truncates bits from constant value (b000b becomes b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:19:9: sparse: sparse: cast truncates bits from constant value (b008b becomes 8b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:21:9: sparse: sparse: cast truncates bits from constant value (b010b becomes 10b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:23:9: sparse: sparse: cast truncates bits from constant value (1b001b becomes 1b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:25:9: sparse: sparse: cast truncates bits from constant value (1b009b becomes 9b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:27:9: sparse: sparse: cast truncates bits from constant value (1b011b becomes 11b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:29:9: sparse: sparse: cast truncates bits from constant value (1b041b becomes 41b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:31:9: sparse: sparse: cast truncates bits from constant value (1b049b becomes 49b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:33:9: sparse: sparse: cast truncates bits from constant value (1b059b becomes 59b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:35:9: sparse: sparse: cast truncates bits from constant value (80008 becomes 8)
arch/x86/kvm/vmx/hyperv_evmcs.c:37:9: sparse: sparse: cast truncates bits from constant value (80088 becomes 88)
arch/x86/kvm/vmx/hyperv_evmcs.c:39:9: sparse: sparse: cast truncates bits from constant value (80108 becomes 108)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:41:9: sparse: sparse: cast truncates bits from constant value (1a019a becomes 19a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:43:9: sparse: sparse: cast truncates bits from constant value (1a021a becomes 21a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:45:9: sparse: sparse: cast truncates bits from constant value (1a029a becomes 29a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:47:9: sparse: sparse: cast truncates bits from constant value (1a031a becomes 31a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:49:9: sparse: sparse: cast truncates bits from constant value (1a039a becomes 39a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:51:9: sparse: sparse: cast truncates bits from constant value (1a041a becomes 41a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:53:9: sparse: sparse: cast truncates bits from constant value (1a049a becomes 49a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:55:9: sparse: sparse: cast truncates bits from constant value (1a051a becomes 51a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:57:9: sparse: sparse: cast truncates bits from constant value (1a059a becomes 59a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:59:9: sparse: sparse: cast truncates bits from constant value (1a061a becomes 61a)
arch/x86/kvm/vmx/hyperv_evmcs.c:61:9: sparse: sparse: cast truncates bits from constant value (80408 becomes 408)
arch/x86/kvm/vmx/hyperv_evmcs.c:63:9: sparse: sparse: cast truncates bits from constant value (80488 becomes 488)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:65:9: sparse: sparse: cast truncates bits from constant value (a000a becomes a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:67:9: sparse: sparse: cast truncates bits from constant value (a008a becomes 8a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:69:9: sparse: sparse: cast truncates bits from constant value (a010a becomes 10a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:71:9: sparse: sparse: cast truncates bits from constant value (a018a becomes 18a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:73:9: sparse: sparse: cast truncates bits from constant value (a020a becomes 20a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:75:9: sparse: sparse: cast truncates bits from constant value (a028a becomes 28a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:77:9: sparse: sparse: cast truncates bits from constant value (a030a becomes 30a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:79:9: sparse: sparse: cast truncates bits from constant value (a038a becomes 38a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:81:9: sparse: sparse: cast truncates bits from constant value (a040a becomes 40a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:83:9: sparse: sparse: cast truncates bits from constant value (1a089a becomes 89a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:85:9: sparse: sparse: cast truncates bits from constant value (1a091a becomes 91a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:87:9: sparse: sparse: cast truncates bits from constant value (1a099a becomes 99a)
arch/x86/kvm/vmx/hyperv_evmcs.c:89:9: sparse: sparse: cast truncates bits from constant value (180018 becomes 18)
arch/x86/kvm/vmx/hyperv_evmcs.c:91:9: sparse: sparse: cast truncates bits from constant value (180098 becomes 98)
arch/x86/kvm/vmx/hyperv_evmcs.c:93:9: sparse: sparse: cast truncates bits from constant value (180118 becomes 118)
arch/x86/kvm/vmx/hyperv_evmcs.c:95:9: sparse: sparse: cast truncates bits from constant value (180198 becomes 198)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:97:9: sparse: sparse: cast truncates bits from constant value (1a001a becomes 1a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:99:9: sparse: sparse: cast truncates bits from constant value (1a009a becomes 9a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:101:9: sparse: sparse: cast truncates bits from constant value (1a011a becomes 11a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:103:9: sparse: sparse: cast truncates bits from constant value (1a069a becomes 69a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:105:9: sparse: sparse: cast truncates bits from constant value (1b019b becomes 19b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:107:9: sparse: sparse: cast truncates bits from constant value (1b021b becomes 21b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:109:9: sparse: sparse: cast truncates bits from constant value (1b029b becomes 29b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:111:9: sparse: sparse: cast truncates bits from constant value (1b031b becomes 31b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:113:9: sparse: sparse: cast truncates bits from constant value (1b039b becomes 39b)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:115:9: sparse: sparse: cast truncates bits from constant value (1b051b becomes 51b)
arch/x86/kvm/vmx/hyperv_evmcs.c:117:9: sparse: sparse: cast truncates bits from constant value (80688 becomes 688)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:119:9: sparse: sparse: cast truncates bits from constant value (a048a becomes 48a)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:121:9: sparse: sparse: cast truncates bits from constant value (80b08 becomes b08)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:123:9: sparse: sparse: cast truncates bits from constant value (80b88 becomes b88)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:125:9: sparse: sparse: cast truncates bits from constant value (80c88 becomes c88)
arch/x86/kvm/vmx/hyperv_evmcs.c:147:9: sparse: sparse: cast truncates bits from constant value (90009 becomes 9)
arch/x86/kvm/vmx/hyperv_evmcs.c:149:9: sparse: sparse: cast truncates bits from constant value (190019 becomes 19)
arch/x86/kvm/vmx/hyperv_evmcs.c:163:9: sparse: sparse: cast truncates bits from constant value (190299 becomes 299)
arch/x86/kvm/vmx/hyperv_evmcs.c:171:9: sparse: sparse: cast truncates bits from constant value (80188 becomes 188)
arch/x86/kvm/vmx/hyperv_evmcs.c:173:9: sparse: sparse: cast truncates bits from constant value (80208 becomes 208)
arch/x86/kvm/vmx/hyperv_evmcs.c:175:9: sparse: sparse: cast truncates bits from constant value (80288 becomes 288)
arch/x86/kvm/vmx/hyperv_evmcs.c:179:9: sparse: sparse: cast truncates bits from constant value (100710 becomes 710)
arch/x86/kvm/vmx/hyperv_evmcs.c:181:9: sparse: sparse: cast truncates bits from constant value (120912 becomes 912)
arch/x86/kvm/vmx/hyperv_evmcs.c:183:9: sparse: sparse: cast truncates bits from constant value (100090 becomes 90)
arch/x86/kvm/vmx/hyperv_evmcs.c:185:9: sparse: sparse: cast truncates bits from constant value (100110 becomes 110)
arch/x86/kvm/vmx/hyperv_evmcs.c:187:9: sparse: sparse: cast truncates bits from constant value (100490 becomes 490)
arch/x86/kvm/vmx/hyperv_evmcs.c:189:9: sparse: sparse: cast truncates bits from constant value (100590 becomes 590)
arch/x86/kvm/vmx/hyperv_evmcs.c:191:9: sparse: sparse: cast truncates bits from constant value (100610 becomes 610)
arch/x86/kvm/vmx/hyperv_evmcs.c:194:9: sparse: sparse: cast truncates bits from constant value (100690 becomes 690)
arch/x86/kvm/vmx/hyperv_evmcs.c:196:9: sparse: sparse: cast truncates bits from constant value (130013 becomes 13)
arch/x86/kvm/vmx/hyperv_evmcs.c:198:9: sparse: sparse: cast truncates bits from constant value (100010 becomes 10)
arch/x86/kvm/vmx/hyperv_evmcs.c:200:9: sparse: sparse: cast truncates bits from constant value (100310 becomes 310)
arch/x86/kvm/vmx/hyperv_evmcs.c:202:9: sparse: sparse: cast truncates bits from constant value (100790 becomes 790)
arch/x86/kvm/vmx/hyperv_evmcs.c:204:9: sparse: sparse: cast truncates bits from constant value (120012 becomes 12)
arch/x86/kvm/vmx/hyperv_evmcs.c:206:9: sparse: sparse: cast truncates bits from constant value (120092 becomes 92)
arch/x86/kvm/vmx/hyperv_evmcs.c:208:9: sparse: sparse: cast truncates bits from constant value (120112 becomes 112)
arch/x86/kvm/vmx/hyperv_evmcs.c:210:9: sparse: sparse: cast truncates bits from constant value (120192 becomes 192)
arch/x86/kvm/vmx/hyperv_evmcs.c:212:9: sparse: sparse: cast truncates bits from constant value (120212 becomes 212)
arch/x86/kvm/vmx/hyperv_evmcs.c:214:9: sparse: sparse: cast truncates bits from constant value (120292 becomes 292)
arch/x86/kvm/vmx/hyperv_evmcs.c:216:9: sparse: sparse: cast truncates bits from constant value (120312 becomes 312)
arch/x86/kvm/vmx/hyperv_evmcs.c:218:9: sparse: sparse: cast truncates bits from constant value (120392 becomes 392)
arch/x86/kvm/vmx/hyperv_evmcs.c:220:9: sparse: sparse: cast truncates bits from constant value (120412 becomes 412)
arch/x86/kvm/vmx/hyperv_evmcs.c:222:9: sparse: sparse: cast truncates bits from constant value (120492 becomes 492)
arch/x86/kvm/vmx/hyperv_evmcs.c:224:9: sparse: sparse: cast truncates bits from constant value (120512 becomes 512)
arch/x86/kvm/vmx/hyperv_evmcs.c:226:9: sparse: sparse: cast truncates bits from constant value (120592 becomes 592)
arch/x86/kvm/vmx/hyperv_evmcs.c:228:9: sparse: sparse: cast truncates bits from constant value (120612 becomes 612)
arch/x86/kvm/vmx/hyperv_evmcs.c:230:9: sparse: sparse: cast truncates bits from constant value (120692 becomes 692)
arch/x86/kvm/vmx/hyperv_evmcs.c:232:9: sparse: sparse: cast truncates bits from constant value (120712 becomes 712)
arch/x86/kvm/vmx/hyperv_evmcs.c:234:9: sparse: sparse: cast truncates bits from constant value (120792 becomes 792)
arch/x86/kvm/vmx/hyperv_evmcs.c:236:9: sparse: sparse: cast truncates bits from constant value (120812 becomes 812)
arch/x86/kvm/vmx/hyperv_evmcs.c:238:9: sparse: sparse: cast truncates bits from constant value (120892 becomes 892)
arch/x86/kvm/vmx/hyperv_evmcs.c:240:9: sparse: sparse: cast truncates bits from constant value (120992 becomes 992)
>> arch/x86/kvm/vmx/hyperv_evmcs.c:242:9: sparse: sparse: cast truncates bits from constant value (120a92 becomes a92)
arch/x86/kvm/vmx/hyperv_evmcs.c:246:9: sparse: sparse: cast truncates bits from constant value (110011 becomes 11)
arch/x86/kvm/vmx/hyperv_evmcs.c:248:9: sparse: sparse: cast truncates bits from constant value (110091 becomes 91)
arch/x86/kvm/vmx/hyperv_evmcs.c:250:9: sparse: sparse: cast truncates bits from constant value (110111 becomes 111)
arch/x86/kvm/vmx/hyperv_evmcs.c:252:9: sparse: sparse: too many warnings
vim +11 arch/x86/kvm/vmx/hyperv_evmcs.c
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 4
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 5 #define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x)
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 6 #define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 7 {EVMCS1_OFFSET(name), clean_field}
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 8
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 9 const struct evmcs_field vmcs_field_to_evmcs_1[] = {
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 10 /* 64 bit rw */
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @11 EVMCS1_FIELD(GUEST_RIP, guest_rip,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 12 HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @13 EVMCS1_FIELD(GUEST_RSP, guest_rsp,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 14 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @15 EVMCS1_FIELD(GUEST_RFLAGS, guest_rflags,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 16 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @17 EVMCS1_FIELD(HOST_IA32_PAT, host_ia32_pat,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 18 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @19 EVMCS1_FIELD(HOST_IA32_EFER, host_ia32_efer,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 20 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @21 EVMCS1_FIELD(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 22 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @23 EVMCS1_FIELD(HOST_CR0, host_cr0,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 24 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @25 EVMCS1_FIELD(HOST_CR3, host_cr3,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 26 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @27 EVMCS1_FIELD(HOST_CR4, host_cr4,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 28 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @29 EVMCS1_FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 30 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @31 EVMCS1_FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 32 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @33 EVMCS1_FIELD(HOST_RIP, host_rip,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 34 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @35 EVMCS1_FIELD(IO_BITMAP_A, io_bitmap_a,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 36 HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 37 EVMCS1_FIELD(IO_BITMAP_B, io_bitmap_b,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 38 HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 39 EVMCS1_FIELD(MSR_BITMAP, msr_bitmap,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 40 HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @41 EVMCS1_FIELD(GUEST_ES_BASE, guest_es_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 42 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @43 EVMCS1_FIELD(GUEST_CS_BASE, guest_cs_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 44 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @45 EVMCS1_FIELD(GUEST_SS_BASE, guest_ss_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 46 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @47 EVMCS1_FIELD(GUEST_DS_BASE, guest_ds_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 48 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @49 EVMCS1_FIELD(GUEST_FS_BASE, guest_fs_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 50 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @51 EVMCS1_FIELD(GUEST_GS_BASE, guest_gs_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 52 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @53 EVMCS1_FIELD(GUEST_LDTR_BASE, guest_ldtr_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 54 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @55 EVMCS1_FIELD(GUEST_TR_BASE, guest_tr_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 56 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @57 EVMCS1_FIELD(GUEST_GDTR_BASE, guest_gdtr_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 58 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @59 EVMCS1_FIELD(GUEST_IDTR_BASE, guest_idtr_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 60 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 61 EVMCS1_FIELD(TSC_OFFSET, tsc_offset,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 62 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 63 EVMCS1_FIELD(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 64 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @65 EVMCS1_FIELD(VMCS_LINK_POINTER, vmcs_link_pointer,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 66 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @67 EVMCS1_FIELD(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 68 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @69 EVMCS1_FIELD(GUEST_IA32_PAT, guest_ia32_pat,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 70 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @71 EVMCS1_FIELD(GUEST_IA32_EFER, guest_ia32_efer,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 72 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @73 EVMCS1_FIELD(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 74 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @75 EVMCS1_FIELD(GUEST_PDPTR0, guest_pdptr0,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 76 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @77 EVMCS1_FIELD(GUEST_PDPTR1, guest_pdptr1,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 78 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @79 EVMCS1_FIELD(GUEST_PDPTR2, guest_pdptr2,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 80 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @81 EVMCS1_FIELD(GUEST_PDPTR3, guest_pdptr3,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 82 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @83 EVMCS1_FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 84 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @85 EVMCS1_FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 86 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @87 EVMCS1_FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 88 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 89 EVMCS1_FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 90 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 91 EVMCS1_FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 92 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 93 EVMCS1_FIELD(CR0_READ_SHADOW, cr0_read_shadow,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 94 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 95 EVMCS1_FIELD(CR4_READ_SHADOW, cr4_read_shadow,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 96 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @97 EVMCS1_FIELD(GUEST_CR0, guest_cr0,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 98 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @99 EVMCS1_FIELD(GUEST_CR3, guest_cr3,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 100 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @101 EVMCS1_FIELD(GUEST_CR4, guest_cr4,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 102 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @103 EVMCS1_FIELD(GUEST_DR7, guest_dr7,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 104 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @105 EVMCS1_FIELD(HOST_FS_BASE, host_fs_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 106 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @107 EVMCS1_FIELD(HOST_GS_BASE, host_gs_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 108 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @109 EVMCS1_FIELD(HOST_TR_BASE, host_tr_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 110 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @111 EVMCS1_FIELD(HOST_GDTR_BASE, host_gdtr_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 112 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @113 EVMCS1_FIELD(HOST_IDTR_BASE, host_idtr_base,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 114 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @115 EVMCS1_FIELD(HOST_RSP, host_rsp,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 116 HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 117 EVMCS1_FIELD(EPT_POINTER, ept_pointer,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 118 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @119 EVMCS1_FIELD(GUEST_BNDCFGS, guest_bndcfgs,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 120 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @121 EVMCS1_FIELD(XSS_EXIT_BITMAP, xss_exit_bitmap,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 122 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @123 EVMCS1_FIELD(ENCLS_EXITING_BITMAP, encls_exiting_bitmap,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 124 HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2),
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @125 EVMCS1_FIELD(TSC_MULTIPLIER, tsc_multiplier,
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch}
@ 2023-10-14 14:50 kernel test robot
0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2023-10-14 14:50 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp
::::::
:::::: Manual check reason: "low confidence bisect report"
::::::
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20231010160300.1136799-7-vkuznets@redhat.com>
References: <20231010160300.1136799-7-vkuznets@redhat.com>
TO: Vitaly Kuznetsov <vkuznets@redhat.com>
Hi Vitaly,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build warnings:
[auto build test WARNING on kvm/queue]
[also build test WARNING on linus/master v6.6-rc5 next-20231013]
[cannot apply to mst-vhost/linux-next kvm/linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Vitaly-Kuznetsov/KVM-x86-xen-Remove-unneeded-xen-context-from-struct-kvm_arch-when-CONFIG_KVM_XEN/20231011-001336
base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue
patch link: https://lore.kernel.org/r/20231010160300.1136799-7-vkuznets%40redhat.com
patch subject: [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch}
:::::: branch date: 4 days ago
:::::: commit date: 4 days ago
config: i386-randconfig-061-20231014 (https://download.01.org/0day-ci/archive/20231014/202310142251.DkseuK4B-lkp@intel.com/config)
compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231014/202310142251.DkseuK4B-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/r/202310142251.DkseuK4B-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
arch/x86/kvm/vmx/vmx.c: note: in included file (through arch/x86/kvm/vmx/vmx_onhyperv.h, arch/x86/kvm/vmx/vmx_ops.h, arch/x86/kvm/vmx/vmx.h, ...):
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (110011 becomes 11)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (110011 becomes 11)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (110011 becomes 11)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (110011 becomes 11)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (110011 becomes 11)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (110011 becomes 11)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100190 becomes 190)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100210 becomes 210)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100110 becomes 110)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100490 becomes 490)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100310 becomes 310)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100490 becomes 490)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100310 becomes 310)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100510 becomes 510)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100410 becomes 410)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a018a becomes 18a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (b008b becomes 8b)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100490 becomes 490)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100310 becomes 310)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a020a becomes 20a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (b010b becomes 10b)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100490 becomes 490)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100310 becomes 310)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100510 becomes 510)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100410 becomes 410)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (30203 becomes 203)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (30203 becomes 203)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (30283 becomes 283)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (30283 becomes 283)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1b019b becomes 19b)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1b021b becomes 21b)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1b029b becomes 29b)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1b031b becomes 31b)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1b041b becomes 41b)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120912 becomes 912)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120912 becomes 912)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120912 becomes 912)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (110311 becomes 311)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120992 becomes 992)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120992 becomes 992)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100610 becomes 610)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100690 becomes 690)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100590 becomes 590)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80408 becomes 408)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80c88 becomes c88)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120a92 becomes a92)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a099a becomes 99a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a091a becomes 91a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a048a becomes 48a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a008a becomes 8a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120a92 becomes a92)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a099a becomes 99a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a091a becomes 91a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a008a becomes 8a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a048a becomes 48a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a010a becomes 10a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80b88 becomes b88)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a050a becomes 50a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a071a becomes 71a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a079a becomes 79a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a001a becomes 1a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a009a becomes 9a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a011a becomes 11a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a011a becomes 11a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (180198 becomes 198)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a011a becomes 11a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a051a becomes 51a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120392 becomes 392)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120892 becomes 892)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a081a becomes 81a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a011a becomes 11a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a011a becomes 11a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a028a becomes 28a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a030a becomes 30a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a038a becomes 38a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a040a becomes 40a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a028a becomes 28a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a030a becomes 30a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a038a becomes 38a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a040a becomes 40a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (180118 becomes 118)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a001a becomes 1a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100090 becomes 90)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100090 becomes 90)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100090 becomes 90)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80688 becomes 688)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a009a becomes 9a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100790 becomes 790)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100790 becomes 790)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (180198 becomes 198)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a011a becomes 11a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120492 becomes 492)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a061a becomes 61a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: too many warnings
--
arch/x86/kvm/vmx/nested.c: note: in included file (through arch/x86/kvm/vmx/vmx_onhyperv.h, arch/x86/kvm/vmx/vmx_ops.h, arch/x86/kvm/vmx/vmx.h, ...):
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100790 becomes 790)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a000a becomes a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80688 becomes 688)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80608 becomes 608)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80108 becomes 108)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80388 becomes 388)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20482 becomes 482)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80b88 becomes b88)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100910 becomes 910)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80188 becomes 188)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80208 becomes 208)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80288 becomes 288)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a000a becomes a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100010 becomes 10)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100710 becomes 710)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100090 becomes 90)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20402 becomes 402)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80b88 becomes b88)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100790 becomes 790)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100490 becomes 490)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100310 becomes 310)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100590 becomes 590)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100610 becomes 610)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100690 becomes 690)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120912 becomes 912)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100590 becomes 590)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20002 becomes 2)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20082 becomes 82)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20102 becomes 102)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20182 becomes 182)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20202 becomes 202)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20282 becomes 282)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20302 becomes 302)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (20382 becomes 382)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120012 becomes 12)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120092 becomes 92)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120112 becomes 112)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120192 becomes 192)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120212 becomes 212)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120292 becomes 292)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120312 becomes 312)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120392 becomes 392)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120412 becomes 412)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120492 becomes 492)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120592 becomes 592)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120612 becomes 612)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120512 becomes 512)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120692 becomes 692)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120712 becomes 712)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120792 becomes 792)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120812 becomes 812)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120892 becomes 892)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a019a becomes 19a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a021a becomes 21a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a029a becomes 29a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a031a becomes 31a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a039a becomes 39a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a041a becomes 41a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a049a becomes 49a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a051a becomes 51a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a059a becomes 59a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a061a becomes 61a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (120a92 becomes a92)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a089a becomes 89a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a091a becomes 91a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a099a becomes 99a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a028a becomes 28a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a030a becomes 30a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a038a becomes 38a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a040a becomes 40a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a048a becomes 48a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80b08 becomes b08)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100190 becomes 190)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100210 becomes 210)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100190 becomes 190)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100210 becomes 210)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80708 becomes 708)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80788 becomes 788)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80808 becomes 808)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80888 becomes 888)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100390 becomes 390)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100410 becomes 410)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100510 becomes 510)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a008a becomes 8a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a008a becomes 8a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a048a becomes 48a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (180018 becomes 18)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a010a becomes 10a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a010a becomes 10a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80408 becomes 408)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (80c88 becomes c88)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (180118 becomes 118)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (180198 becomes 198)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (1a009a becomes 9a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a028a becomes 28a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a030a becomes 30a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a038a becomes 38a)
>> arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (a040a becomes 40a)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: cast truncates bits from constant value (100410 becomes 410)
arch/x86/kvm/vmx/hyperv_evmcs.h:128:30: sparse: sparse: too many warnings
vim +128 arch/x86/kvm/vmx/hyperv_evmcs.h
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 124
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 125 static __always_inline int evmcs_field_offset(unsigned long field,
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 126 u16 *clean_field)
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 127 {
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 @128 unsigned int index = ROL16(field, 6);
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 129 const struct evmcs_field *evmcs_field;
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 130
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 131 if (unlikely(index >= nr_evmcs_1_fields))
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 132 return -ENOENT;
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 133
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 134 evmcs_field = &vmcs_field_to_evmcs_1[index];
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 135
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 136 /*
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 137 * Use offset=0 to detect holes in eVMCS. This offset belongs to
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 138 * 'revision_id' but this field has no encoding and is supposed to
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 139 * be accessed directly.
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 140 */
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 141 if (unlikely(!evmcs_field->offset))
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 142 return -ENOENT;
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 143
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 144 if (clean_field)
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 145 *clean_field = evmcs_field->clean_field;
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 146
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 147 return evmcs_field->offset;
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 148 }
d81ea0d25c7e5f Vitaly Kuznetsov 2023-10-10 149
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH RFC 00/11] KVM: x86: Make Hyper-V emulation optional (AKA introduce CONFIG_KVM_HYPERV)
@ 2023-10-10 16:02 Vitaly Kuznetsov
2023-10-10 16:02 ` [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch} Vitaly Kuznetsov
0 siblings, 1 reply; 5+ messages in thread
From: Vitaly Kuznetsov @ 2023-10-10 16:02 UTC (permalink / raw)
To: kvm, Paolo Bonzini, Sean Christopherson; +Cc: linux-kernel
Ideas to make Hyper-V emulation by KVM optional were expressed in the past
so I've decided to take a look at what would it take us to implement it.
Turns out it's quite a lot of code churn but the gain is also significant.
Just comparing the resulting module sizes, I can see:
# CONFIG_KVM_HYPERV is not set
# CONFIG_HYPERV is not set
-rw-r--r--. 1 user user 3612632 Oct 10 16:53 arch/x86/kvm/kvm-amd.ko
-rw-r--r--. 1 user user 5343968 Oct 10 16:53 arch/x86/kvm/kvm-intel.ko
CONFIG_KVM_HYPERV=y
# CONFIG_HYPERV is not set
-rw-r--r--. 1 user user 3925704 Oct 10 16:51 arch/x86/kvm/kvm-amd.ko
-rw-r--r--. 1 user user 5819192 Oct 10 16:51 arch/x86/kvm/kvm-intel.ko
# CONFIG_KVM_HYPERV is not set
CONFIG_HYPERV=m
-rw-r--r--. 1 user user 3928440 Oct 10 16:40 arch/x86/kvm/kvm-amd.ko
-rw-r--r--. 1 user user 8156464 Oct 10 16:40 arch/x86/kvm/kvm-intel.ko
CONFIG_KVM_HYPERV=y
CONFIG_HYPERV=m
-rw-r--r--. 1 user user 4245440 Oct 10 16:37 arch/x86/kvm/kvm-amd.ko
-rw-r--r--. 1 user user 8583872 Oct 10 16:37 arch/x86/kvm/kvm-intel.ko
While code churn is certainly something we can survive, adding more CONFIG
options always comes with a risk of a broken build somewhere in the future.
Early RFC. I have only compile tested these patches in these four
configurations and I'd like to get your opinion on whether it's worth it or
not.
The first patch of the series is not Hyper-V related but as I hide Hyper-V
emulation context under CONFIG_KVM_HYPERV I think it would make sense to
do the same for Xen.
Vitaly Kuznetsov (11):
KVM: x86: xen: Remove unneeded xen context from struct kvm_arch when
!CONFIG_KVM_XEN
KVM: x86: hyper-v: Move Hyper-V partition assist page out of Hyper-V
emulation context
KVM: VMX: Split off vmx_onhyperv.{ch} from hyperv.{ch}
KVM: x86: hyper-v: Introduce kvm_hv_synic_auto_eoi_set()
KVM: x86: hyper-v: Introduce kvm_hv_synic_has_vector()
KVM: VMX: Split off hyperv_evmcs.{ch}
KVM: x86: Make Hyper-V emulation optional
KVM: nVMX: hyper-v: Introduce nested_vmx_evmptr() accessor
KVM: nVMX: hyper-v: Introduce nested_vmx_evmcs() accessor
KVM: nVMX: hyper-v: Hide more stuff under CONFIG_KVM_HYPERV
KVM: nSVM: hyper-v: Hide more stuff under
CONFIG_KVM_HYPERV/CONFIG_HYPERV
arch/x86/include/asm/kvm_host.h | 11 +-
arch/x86/kvm/Kconfig | 9 +
arch/x86/kvm/Makefile | 19 +-
arch/x86/kvm/cpuid.c | 6 +
arch/x86/kvm/hyperv.h | 39 ++-
arch/x86/kvm/irq.c | 2 +
arch/x86/kvm/irq_comm.c | 9 +-
arch/x86/kvm/lapic.c | 5 +-
arch/x86/kvm/svm/hyperv.h | 7 +
arch/x86/kvm/svm/nested.c | 22 +-
arch/x86/kvm/svm/svm.h | 2 +
arch/x86/kvm/svm/svm_onhyperv.c | 2 +-
arch/x86/kvm/svm/svm_onhyperv.h | 2 +
arch/x86/kvm/vmx/hyperv.c | 447 --------------------------------
arch/x86/kvm/vmx/hyperv.h | 191 ++------------
arch/x86/kvm/vmx/hyperv_evmcs.c | 311 ++++++++++++++++++++++
arch/x86/kvm/vmx/hyperv_evmcs.h | 162 ++++++++++++
arch/x86/kvm/vmx/nested.c | 94 ++++---
arch/x86/kvm/vmx/nested.h | 3 +-
arch/x86/kvm/vmx/vmx.c | 6 +-
arch/x86/kvm/vmx/vmx.h | 2 +
arch/x86/kvm/vmx/vmx_onhyperv.c | 36 +++
arch/x86/kvm/vmx/vmx_onhyperv.h | 125 +++++++++
arch/x86/kvm/vmx/vmx_ops.h | 2 +-
arch/x86/kvm/x86.c | 60 +++--
25 files changed, 885 insertions(+), 689 deletions(-)
create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.c
create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.h
create mode 100644 arch/x86/kvm/vmx/vmx_onhyperv.c
create mode 100644 arch/x86/kvm/vmx/vmx_onhyperv.h
--
2.41.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch} 2023-10-10 16:02 [PATCH RFC 00/11] KVM: x86: Make Hyper-V emulation optional (AKA introduce CONFIG_KVM_HYPERV) Vitaly Kuznetsov @ 2023-10-10 16:02 ` Vitaly Kuznetsov 2023-10-12 19:40 ` Maxim Levitsky 0 siblings, 1 reply; 5+ messages in thread From: Vitaly Kuznetsov @ 2023-10-10 16:02 UTC (permalink / raw) To: kvm, Paolo Bonzini, Sean Christopherson; +Cc: linux-kernel Some Enlightened VMCS related code is needed both by Hyper-V on KVM and KVM on Hyper-V. As a preparation to making Hyper-V emulation optional, create dedicated 'hyperv_evmcs.{ch}' files which are used by both. No functional change intended. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> --- arch/x86/kvm/Makefile | 2 +- arch/x86/kvm/vmx/hyperv.c | 308 ------------------------------- arch/x86/kvm/vmx/hyperv.h | 163 +---------------- arch/x86/kvm/vmx/hyperv_evmcs.c | 311 ++++++++++++++++++++++++++++++++ arch/x86/kvm/vmx/hyperv_evmcs.h | 162 +++++++++++++++++ arch/x86/kvm/vmx/vmx_onhyperv.h | 3 +- 6 files changed, 477 insertions(+), 472 deletions(-) create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.c create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.h diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index a99ffc3f3a3f..8ea872401cd6 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -23,7 +23,7 @@ kvm-$(CONFIG_KVM_XEN) += xen.o kvm-$(CONFIG_KVM_SMM) += smm.o kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ - vmx/hyperv.o vmx/nested.o vmx/posted_intr.o + vmx/hyperv.o vmx/hyperv_evmcs.o vmx/nested.o vmx/posted_intr.o kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o ifdef CONFIG_HYPERV diff --git a/arch/x86/kvm/vmx/hyperv.c b/arch/x86/kvm/vmx/hyperv.c index de13dc14fe1d..fab6a1ad98dc 100644 --- a/arch/x86/kvm/vmx/hyperv.c +++ b/arch/x86/kvm/vmx/hyperv.c @@ -13,314 +13,6 @@ #define CC KVM_NESTED_VMENTER_CONSISTENCY_CHECK -#define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x) -#define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \ - {EVMCS1_OFFSET(name), clean_field} - -const struct evmcs_field vmcs_field_to_evmcs_1[] = { - /* 64 bit rw */ - EVMCS1_FIELD(GUEST_RIP, guest_rip, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(GUEST_RSP, guest_rsp, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), - EVMCS1_FIELD(GUEST_RFLAGS, guest_rflags, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), - EVMCS1_FIELD(HOST_IA32_PAT, host_ia32_pat, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_IA32_EFER, host_ia32_efer, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_CR0, host_cr0, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_CR3, host_cr3, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_CR4, host_cr4, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_RIP, host_rip, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(IO_BITMAP_A, io_bitmap_a, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), - EVMCS1_FIELD(IO_BITMAP_B, io_bitmap_b, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), - EVMCS1_FIELD(MSR_BITMAP, msr_bitmap, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP), - EVMCS1_FIELD(GUEST_ES_BASE, guest_es_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_CS_BASE, guest_cs_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_SS_BASE, guest_ss_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_DS_BASE, guest_ds_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_FS_BASE, guest_fs_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_GS_BASE, guest_gs_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_LDTR_BASE, guest_ldtr_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_TR_BASE, guest_tr_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_GDTR_BASE, guest_gdtr_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_IDTR_BASE, guest_idtr_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(TSC_OFFSET, tsc_offset, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), - EVMCS1_FIELD(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), - EVMCS1_FIELD(VMCS_LINK_POINTER, vmcs_link_pointer, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_IA32_PAT, guest_ia32_pat, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_IA32_EFER, guest_ia32_efer, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_PDPTR0, guest_pdptr0, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_PDPTR1, guest_pdptr1, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_PDPTR2, guest_pdptr2, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_PDPTR3, guest_pdptr3, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(CR0_READ_SHADOW, cr0_read_shadow, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(CR4_READ_SHADOW, cr4_read_shadow, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(GUEST_CR0, guest_cr0, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(GUEST_CR3, guest_cr3, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(GUEST_CR4, guest_cr4, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(GUEST_DR7, guest_dr7, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), - EVMCS1_FIELD(HOST_FS_BASE, host_fs_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), - EVMCS1_FIELD(HOST_GS_BASE, host_gs_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), - EVMCS1_FIELD(HOST_TR_BASE, host_tr_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), - EVMCS1_FIELD(HOST_GDTR_BASE, host_gdtr_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), - EVMCS1_FIELD(HOST_IDTR_BASE, host_idtr_base, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), - EVMCS1_FIELD(HOST_RSP, host_rsp, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), - EVMCS1_FIELD(EPT_POINTER, ept_pointer, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), - EVMCS1_FIELD(GUEST_BNDCFGS, guest_bndcfgs, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(XSS_EXIT_BITMAP, xss_exit_bitmap, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), - EVMCS1_FIELD(ENCLS_EXITING_BITMAP, encls_exiting_bitmap, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), - EVMCS1_FIELD(TSC_MULTIPLIER, tsc_multiplier, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), - /* - * Not used by KVM: - * - * EVMCS1_FIELD(0x00006828, guest_ia32_s_cet, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - * EVMCS1_FIELD(0x0000682A, guest_ssp, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), - * EVMCS1_FIELD(0x0000682C, guest_ia32_int_ssp_table_addr, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - * EVMCS1_FIELD(0x00002816, guest_ia32_lbr_ctl, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - * EVMCS1_FIELD(0x00006C18, host_ia32_s_cet, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - * EVMCS1_FIELD(0x00006C1A, host_ssp, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - * EVMCS1_FIELD(0x00006C1C, host_ia32_int_ssp_table_addr, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - */ - - /* 64 bit read only */ - EVMCS1_FIELD(GUEST_PHYSICAL_ADDRESS, guest_physical_address, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(EXIT_QUALIFICATION, exit_qualification, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - /* - * Not defined in KVM: - * - * EVMCS1_FIELD(0x00006402, exit_io_instruction_ecx, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); - * EVMCS1_FIELD(0x00006404, exit_io_instruction_esi, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); - * EVMCS1_FIELD(0x00006406, exit_io_instruction_esi, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); - * EVMCS1_FIELD(0x00006408, exit_io_instruction_eip, - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); - */ - EVMCS1_FIELD(GUEST_LINEAR_ADDRESS, guest_linear_address, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - - /* - * No mask defined in the spec as Hyper-V doesn't currently support - * these. Future proof by resetting the whole clean field mask on - * access. - */ - EVMCS1_FIELD(VM_EXIT_MSR_STORE_ADDR, vm_exit_msr_store_addr, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - EVMCS1_FIELD(VM_EXIT_MSR_LOAD_ADDR, vm_exit_msr_load_addr, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_ADDR, vm_entry_msr_load_addr, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - - /* 32 bit rw */ - EVMCS1_FIELD(TPR_THRESHOLD, tpr_threshold, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(GUEST_INTERRUPTIBILITY_INFO, guest_interruptibility_info, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), - EVMCS1_FIELD(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC), - EVMCS1_FIELD(EXCEPTION_BITMAP, exception_bitmap, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN), - EVMCS1_FIELD(VM_ENTRY_CONTROLS, vm_entry_controls, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY), - EVMCS1_FIELD(VM_ENTRY_INTR_INFO_FIELD, vm_entry_intr_info_field, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), - EVMCS1_FIELD(VM_ENTRY_EXCEPTION_ERROR_CODE, - vm_entry_exception_error_code, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), - EVMCS1_FIELD(VM_ENTRY_INSTRUCTION_LEN, vm_entry_instruction_len, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), - EVMCS1_FIELD(HOST_IA32_SYSENTER_CS, host_ia32_sysenter_cs, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(PIN_BASED_VM_EXEC_CONTROL, pin_based_vm_exec_control, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), - EVMCS1_FIELD(VM_EXIT_CONTROLS, vm_exit_controls, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), - EVMCS1_FIELD(SECONDARY_VM_EXEC_CONTROL, secondary_vm_exec_control, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), - EVMCS1_FIELD(GUEST_ES_LIMIT, guest_es_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_CS_LIMIT, guest_cs_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_SS_LIMIT, guest_ss_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_DS_LIMIT, guest_ds_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_FS_LIMIT, guest_fs_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_GS_LIMIT, guest_gs_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_LDTR_LIMIT, guest_ldtr_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_TR_LIMIT, guest_tr_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_GDTR_LIMIT, guest_gdtr_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_IDTR_LIMIT, guest_idtr_limit, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_ES_AR_BYTES, guest_es_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_CS_AR_BYTES, guest_cs_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_SS_AR_BYTES, guest_ss_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_DS_AR_BYTES, guest_ds_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_FS_AR_BYTES, guest_fs_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_GS_AR_BYTES, guest_gs_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_LDTR_AR_BYTES, guest_ldtr_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_TR_AR_BYTES, guest_tr_ar_bytes, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_ACTIVITY_STATE, guest_activity_state, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - EVMCS1_FIELD(GUEST_SYSENTER_CS, guest_sysenter_cs, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), - - /* 32 bit read only */ - EVMCS1_FIELD(VM_INSTRUCTION_ERROR, vm_instruction_error, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(VM_EXIT_REASON, vm_exit_reason, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(VM_EXIT_INTR_INFO, vm_exit_intr_info, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(VM_EXIT_INTR_ERROR_CODE, vm_exit_intr_error_code, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(IDT_VECTORING_INFO_FIELD, idt_vectoring_info_field, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(IDT_VECTORING_ERROR_CODE, idt_vectoring_error_code, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(VM_EXIT_INSTRUCTION_LEN, vm_exit_instruction_len, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - EVMCS1_FIELD(VMX_INSTRUCTION_INFO, vmx_instruction_info, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), - - /* No mask defined in the spec (not used) */ - EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MASK, page_fault_error_code_mask, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MATCH, page_fault_error_code_match, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - EVMCS1_FIELD(CR3_TARGET_COUNT, cr3_target_count, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - EVMCS1_FIELD(VM_EXIT_MSR_STORE_COUNT, vm_exit_msr_store_count, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - EVMCS1_FIELD(VM_EXIT_MSR_LOAD_COUNT, vm_exit_msr_load_count, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_COUNT, vm_entry_msr_load_count, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), - - /* 16 bit rw */ - EVMCS1_FIELD(HOST_ES_SELECTOR, host_es_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_CS_SELECTOR, host_cs_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_SS_SELECTOR, host_ss_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_DS_SELECTOR, host_ds_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_FS_SELECTOR, host_fs_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_GS_SELECTOR, host_gs_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(HOST_TR_SELECTOR, host_tr_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), - EVMCS1_FIELD(GUEST_ES_SELECTOR, guest_es_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_CS_SELECTOR, guest_cs_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_SS_SELECTOR, guest_ss_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_DS_SELECTOR, guest_ds_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_FS_SELECTOR, guest_fs_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_GS_SELECTOR, guest_gs_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_LDTR_SELECTOR, guest_ldtr_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(GUEST_TR_SELECTOR, guest_tr_selector, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), - EVMCS1_FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id, - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), -}; -const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); - u64 nested_get_evmptr(struct kvm_vcpu *vcpu) { struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); diff --git a/arch/x86/kvm/vmx/hyperv.h b/arch/x86/kvm/vmx/hyperv.h index 9401dbfaea7c..d4ed99008518 100644 --- a/arch/x86/kvm/vmx/hyperv.h +++ b/arch/x86/kvm/vmx/hyperv.h @@ -2,170 +2,9 @@ #ifndef __KVM_X86_VMX_HYPERV_H #define __KVM_X86_VMX_HYPERV_H -#include <linux/jump_label.h> - -#include <asm/hyperv-tlfs.h> -#include <asm/mshyperv.h> -#include <asm/vmx.h> - -#include "../hyperv.h" - -#include "capabilities.h" -#include "vmcs.h" +#include <linux/kvm_host.h> #include "vmcs12.h" -#define KVM_EVMCS_VERSION 1 - -/* - * Enlightened VMCSv1 doesn't support these: - * - * POSTED_INTR_NV = 0x00000002, - * GUEST_INTR_STATUS = 0x00000810, - * APIC_ACCESS_ADDR = 0x00002014, - * POSTED_INTR_DESC_ADDR = 0x00002016, - * EOI_EXIT_BITMAP0 = 0x0000201c, - * EOI_EXIT_BITMAP1 = 0x0000201e, - * EOI_EXIT_BITMAP2 = 0x00002020, - * EOI_EXIT_BITMAP3 = 0x00002022, - * GUEST_PML_INDEX = 0x00000812, - * PML_ADDRESS = 0x0000200e, - * VM_FUNCTION_CONTROL = 0x00002018, - * EPTP_LIST_ADDRESS = 0x00002024, - * VMREAD_BITMAP = 0x00002026, - * VMWRITE_BITMAP = 0x00002028, - * - * TSC_MULTIPLIER = 0x00002032, - * PLE_GAP = 0x00004020, - * PLE_WINDOW = 0x00004022, - * VMX_PREEMPTION_TIMER_VALUE = 0x0000482E, - * - * Currently unsupported in KVM: - * GUEST_IA32_RTIT_CTL = 0x00002814, - */ -#define EVMCS1_SUPPORTED_PINCTRL \ - (PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ - PIN_BASED_EXT_INTR_MASK | \ - PIN_BASED_NMI_EXITING | \ - PIN_BASED_VIRTUAL_NMIS) - -#define EVMCS1_SUPPORTED_EXEC_CTRL \ - (CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ - CPU_BASED_HLT_EXITING | \ - CPU_BASED_CR3_LOAD_EXITING | \ - CPU_BASED_CR3_STORE_EXITING | \ - CPU_BASED_UNCOND_IO_EXITING | \ - CPU_BASED_MOV_DR_EXITING | \ - CPU_BASED_USE_TSC_OFFSETTING | \ - CPU_BASED_MWAIT_EXITING | \ - CPU_BASED_MONITOR_EXITING | \ - CPU_BASED_INVLPG_EXITING | \ - CPU_BASED_RDPMC_EXITING | \ - CPU_BASED_INTR_WINDOW_EXITING | \ - CPU_BASED_CR8_LOAD_EXITING | \ - CPU_BASED_CR8_STORE_EXITING | \ - CPU_BASED_RDTSC_EXITING | \ - CPU_BASED_TPR_SHADOW | \ - CPU_BASED_USE_IO_BITMAPS | \ - CPU_BASED_MONITOR_TRAP_FLAG | \ - CPU_BASED_USE_MSR_BITMAPS | \ - CPU_BASED_NMI_WINDOW_EXITING | \ - CPU_BASED_PAUSE_EXITING | \ - CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) - -#define EVMCS1_SUPPORTED_2NDEXEC \ - (SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | \ - SECONDARY_EXEC_WBINVD_EXITING | \ - SECONDARY_EXEC_ENABLE_VPID | \ - SECONDARY_EXEC_ENABLE_EPT | \ - SECONDARY_EXEC_UNRESTRICTED_GUEST | \ - SECONDARY_EXEC_DESC | \ - SECONDARY_EXEC_ENABLE_RDTSCP | \ - SECONDARY_EXEC_ENABLE_INVPCID | \ - SECONDARY_EXEC_ENABLE_XSAVES | \ - SECONDARY_EXEC_RDSEED_EXITING | \ - SECONDARY_EXEC_RDRAND_EXITING | \ - SECONDARY_EXEC_TSC_SCALING | \ - SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | \ - SECONDARY_EXEC_PT_USE_GPA | \ - SECONDARY_EXEC_PT_CONCEAL_VMX | \ - SECONDARY_EXEC_BUS_LOCK_DETECTION | \ - SECONDARY_EXEC_NOTIFY_VM_EXITING | \ - SECONDARY_EXEC_ENCLS_EXITING) - -#define EVMCS1_SUPPORTED_3RDEXEC (0ULL) - -#define EVMCS1_SUPPORTED_VMEXIT_CTRL \ - (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | \ - VM_EXIT_SAVE_DEBUG_CONTROLS | \ - VM_EXIT_ACK_INTR_ON_EXIT | \ - VM_EXIT_HOST_ADDR_SPACE_SIZE | \ - VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | \ - VM_EXIT_SAVE_IA32_PAT | \ - VM_EXIT_LOAD_IA32_PAT | \ - VM_EXIT_SAVE_IA32_EFER | \ - VM_EXIT_LOAD_IA32_EFER | \ - VM_EXIT_CLEAR_BNDCFGS | \ - VM_EXIT_PT_CONCEAL_PIP | \ - VM_EXIT_CLEAR_IA32_RTIT_CTL) - -#define EVMCS1_SUPPORTED_VMENTRY_CTRL \ - (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | \ - VM_ENTRY_LOAD_DEBUG_CONTROLS | \ - VM_ENTRY_IA32E_MODE | \ - VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | \ - VM_ENTRY_LOAD_IA32_PAT | \ - VM_ENTRY_LOAD_IA32_EFER | \ - VM_ENTRY_LOAD_BNDCFGS | \ - VM_ENTRY_PT_CONCEAL_PIP | \ - VM_ENTRY_LOAD_IA32_RTIT_CTL) - -#define EVMCS1_SUPPORTED_VMFUNC (0) - -struct evmcs_field { - u16 offset; - u16 clean_field; -}; - -extern const struct evmcs_field vmcs_field_to_evmcs_1[]; -extern const unsigned int nr_evmcs_1_fields; - -static __always_inline int evmcs_field_offset(unsigned long field, - u16 *clean_field) -{ - unsigned int index = ROL16(field, 6); - const struct evmcs_field *evmcs_field; - - if (unlikely(index >= nr_evmcs_1_fields)) - return -ENOENT; - - evmcs_field = &vmcs_field_to_evmcs_1[index]; - - /* - * Use offset=0 to detect holes in eVMCS. This offset belongs to - * 'revision_id' but this field has no encoding and is supposed to - * be accessed directly. - */ - if (unlikely(!evmcs_field->offset)) - return -ENOENT; - - if (clean_field) - *clean_field = evmcs_field->clean_field; - - return evmcs_field->offset; -} - -static inline u64 evmcs_read_any(struct hv_enlightened_vmcs *evmcs, - unsigned long field, u16 offset) -{ - /* - * vmcs12_read_any() doesn't care whether the supplied structure - * is 'struct vmcs12' or 'struct hv_enlightened_vmcs' as it takes - * the exact offset of the required field, use it for convenience - * here. - */ - return vmcs12_read_any((void *)evmcs, field, offset); -} - #define EVMPTR_INVALID (-1ULL) #define EVMPTR_MAP_PENDING (-2ULL) diff --git a/arch/x86/kvm/vmx/hyperv_evmcs.c b/arch/x86/kvm/vmx/hyperv_evmcs.c new file mode 100644 index 000000000000..57a2e0470ac8 --- /dev/null +++ b/arch/x86/kvm/vmx/hyperv_evmcs.c @@ -0,0 +1,311 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "hyperv_evmcs.h" + +#define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x) +#define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \ + {EVMCS1_OFFSET(name), clean_field} + +const struct evmcs_field vmcs_field_to_evmcs_1[] = { + /* 64 bit rw */ + EVMCS1_FIELD(GUEST_RIP, guest_rip, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(GUEST_RSP, guest_rsp, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), + EVMCS1_FIELD(GUEST_RFLAGS, guest_rflags, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), + EVMCS1_FIELD(HOST_IA32_PAT, host_ia32_pat, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_IA32_EFER, host_ia32_efer, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_CR0, host_cr0, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_CR3, host_cr3, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_CR4, host_cr4, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_RIP, host_rip, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(IO_BITMAP_A, io_bitmap_a, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), + EVMCS1_FIELD(IO_BITMAP_B, io_bitmap_b, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), + EVMCS1_FIELD(MSR_BITMAP, msr_bitmap, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP), + EVMCS1_FIELD(GUEST_ES_BASE, guest_es_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_CS_BASE, guest_cs_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_SS_BASE, guest_ss_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_DS_BASE, guest_ds_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_FS_BASE, guest_fs_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_GS_BASE, guest_gs_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_LDTR_BASE, guest_ldtr_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_TR_BASE, guest_tr_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_GDTR_BASE, guest_gdtr_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_IDTR_BASE, guest_idtr_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(TSC_OFFSET, tsc_offset, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), + EVMCS1_FIELD(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), + EVMCS1_FIELD(VMCS_LINK_POINTER, vmcs_link_pointer, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_IA32_PAT, guest_ia32_pat, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_IA32_EFER, guest_ia32_efer, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_PDPTR0, guest_pdptr0, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_PDPTR1, guest_pdptr1, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_PDPTR2, guest_pdptr2, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_PDPTR3, guest_pdptr3, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(CR0_READ_SHADOW, cr0_read_shadow, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(CR4_READ_SHADOW, cr4_read_shadow, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(GUEST_CR0, guest_cr0, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(GUEST_CR3, guest_cr3, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(GUEST_CR4, guest_cr4, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(GUEST_DR7, guest_dr7, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), + EVMCS1_FIELD(HOST_FS_BASE, host_fs_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), + EVMCS1_FIELD(HOST_GS_BASE, host_gs_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), + EVMCS1_FIELD(HOST_TR_BASE, host_tr_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), + EVMCS1_FIELD(HOST_GDTR_BASE, host_gdtr_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), + EVMCS1_FIELD(HOST_IDTR_BASE, host_idtr_base, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), + EVMCS1_FIELD(HOST_RSP, host_rsp, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), + EVMCS1_FIELD(EPT_POINTER, ept_pointer, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), + EVMCS1_FIELD(GUEST_BNDCFGS, guest_bndcfgs, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(XSS_EXIT_BITMAP, xss_exit_bitmap, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), + EVMCS1_FIELD(ENCLS_EXITING_BITMAP, encls_exiting_bitmap, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), + EVMCS1_FIELD(TSC_MULTIPLIER, tsc_multiplier, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), + /* + * Not used by KVM: + * + * EVMCS1_FIELD(0x00006828, guest_ia32_s_cet, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + * EVMCS1_FIELD(0x0000682A, guest_ssp, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), + * EVMCS1_FIELD(0x0000682C, guest_ia32_int_ssp_table_addr, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + * EVMCS1_FIELD(0x00002816, guest_ia32_lbr_ctl, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + * EVMCS1_FIELD(0x00006C18, host_ia32_s_cet, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + * EVMCS1_FIELD(0x00006C1A, host_ssp, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + * EVMCS1_FIELD(0x00006C1C, host_ia32_int_ssp_table_addr, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + */ + + /* 64 bit read only */ + EVMCS1_FIELD(GUEST_PHYSICAL_ADDRESS, guest_physical_address, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(EXIT_QUALIFICATION, exit_qualification, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + /* + * Not defined in KVM: + * + * EVMCS1_FIELD(0x00006402, exit_io_instruction_ecx, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); + * EVMCS1_FIELD(0x00006404, exit_io_instruction_esi, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); + * EVMCS1_FIELD(0x00006406, exit_io_instruction_esi, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); + * EVMCS1_FIELD(0x00006408, exit_io_instruction_eip, + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); + */ + EVMCS1_FIELD(GUEST_LINEAR_ADDRESS, guest_linear_address, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + + /* + * No mask defined in the spec as Hyper-V doesn't currently support + * these. Future proof by resetting the whole clean field mask on + * access. + */ + EVMCS1_FIELD(VM_EXIT_MSR_STORE_ADDR, vm_exit_msr_store_addr, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + EVMCS1_FIELD(VM_EXIT_MSR_LOAD_ADDR, vm_exit_msr_load_addr, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_ADDR, vm_entry_msr_load_addr, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + + /* 32 bit rw */ + EVMCS1_FIELD(TPR_THRESHOLD, tpr_threshold, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(GUEST_INTERRUPTIBILITY_INFO, guest_interruptibility_info, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), + EVMCS1_FIELD(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC), + EVMCS1_FIELD(EXCEPTION_BITMAP, exception_bitmap, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN), + EVMCS1_FIELD(VM_ENTRY_CONTROLS, vm_entry_controls, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY), + EVMCS1_FIELD(VM_ENTRY_INTR_INFO_FIELD, vm_entry_intr_info_field, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), + EVMCS1_FIELD(VM_ENTRY_EXCEPTION_ERROR_CODE, + vm_entry_exception_error_code, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), + EVMCS1_FIELD(VM_ENTRY_INSTRUCTION_LEN, vm_entry_instruction_len, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), + EVMCS1_FIELD(HOST_IA32_SYSENTER_CS, host_ia32_sysenter_cs, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(PIN_BASED_VM_EXEC_CONTROL, pin_based_vm_exec_control, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), + EVMCS1_FIELD(VM_EXIT_CONTROLS, vm_exit_controls, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), + EVMCS1_FIELD(SECONDARY_VM_EXEC_CONTROL, secondary_vm_exec_control, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), + EVMCS1_FIELD(GUEST_ES_LIMIT, guest_es_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_CS_LIMIT, guest_cs_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_SS_LIMIT, guest_ss_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_DS_LIMIT, guest_ds_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_FS_LIMIT, guest_fs_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_GS_LIMIT, guest_gs_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_LDTR_LIMIT, guest_ldtr_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_TR_LIMIT, guest_tr_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_GDTR_LIMIT, guest_gdtr_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_IDTR_LIMIT, guest_idtr_limit, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_ES_AR_BYTES, guest_es_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_CS_AR_BYTES, guest_cs_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_SS_AR_BYTES, guest_ss_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_DS_AR_BYTES, guest_ds_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_FS_AR_BYTES, guest_fs_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_GS_AR_BYTES, guest_gs_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_LDTR_AR_BYTES, guest_ldtr_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_TR_AR_BYTES, guest_tr_ar_bytes, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_ACTIVITY_STATE, guest_activity_state, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + EVMCS1_FIELD(GUEST_SYSENTER_CS, guest_sysenter_cs, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), + + /* 32 bit read only */ + EVMCS1_FIELD(VM_INSTRUCTION_ERROR, vm_instruction_error, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(VM_EXIT_REASON, vm_exit_reason, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(VM_EXIT_INTR_INFO, vm_exit_intr_info, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(VM_EXIT_INTR_ERROR_CODE, vm_exit_intr_error_code, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(IDT_VECTORING_INFO_FIELD, idt_vectoring_info_field, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(IDT_VECTORING_ERROR_CODE, idt_vectoring_error_code, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(VM_EXIT_INSTRUCTION_LEN, vm_exit_instruction_len, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + EVMCS1_FIELD(VMX_INSTRUCTION_INFO, vmx_instruction_info, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), + + /* No mask defined in the spec (not used) */ + EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MASK, page_fault_error_code_mask, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MATCH, page_fault_error_code_match, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + EVMCS1_FIELD(CR3_TARGET_COUNT, cr3_target_count, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + EVMCS1_FIELD(VM_EXIT_MSR_STORE_COUNT, vm_exit_msr_store_count, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + EVMCS1_FIELD(VM_EXIT_MSR_LOAD_COUNT, vm_exit_msr_load_count, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_COUNT, vm_entry_msr_load_count, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), + + /* 16 bit rw */ + EVMCS1_FIELD(HOST_ES_SELECTOR, host_es_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_CS_SELECTOR, host_cs_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_SS_SELECTOR, host_ss_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_DS_SELECTOR, host_ds_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_FS_SELECTOR, host_fs_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_GS_SELECTOR, host_gs_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(HOST_TR_SELECTOR, host_tr_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), + EVMCS1_FIELD(GUEST_ES_SELECTOR, guest_es_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_CS_SELECTOR, guest_cs_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_SS_SELECTOR, guest_ss_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_DS_SELECTOR, guest_ds_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_FS_SELECTOR, guest_fs_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_GS_SELECTOR, guest_gs_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_LDTR_SELECTOR, guest_ldtr_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(GUEST_TR_SELECTOR, guest_tr_selector, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), + EVMCS1_FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id, + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), +}; +const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); diff --git a/arch/x86/kvm/vmx/hyperv_evmcs.h b/arch/x86/kvm/vmx/hyperv_evmcs.h new file mode 100644 index 000000000000..11d96975e7cc --- /dev/null +++ b/arch/x86/kvm/vmx/hyperv_evmcs.h @@ -0,0 +1,162 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __KVM_X86_VMX_HYPERV_EVMCS_H +#define __KVM_X86_VMX_HYPERV_EVMCS_H + +#include <asm/hyperv-tlfs.h> + +#include "capabilities.h" +#include "vmcs12.h" + +#define KVM_EVMCS_VERSION 1 + +/* + * Enlightened VMCSv1 doesn't support these: + * + * POSTED_INTR_NV = 0x00000002, + * GUEST_INTR_STATUS = 0x00000810, + * APIC_ACCESS_ADDR = 0x00002014, + * POSTED_INTR_DESC_ADDR = 0x00002016, + * EOI_EXIT_BITMAP0 = 0x0000201c, + * EOI_EXIT_BITMAP1 = 0x0000201e, + * EOI_EXIT_BITMAP2 = 0x00002020, + * EOI_EXIT_BITMAP3 = 0x00002022, + * GUEST_PML_INDEX = 0x00000812, + * PML_ADDRESS = 0x0000200e, + * VM_FUNCTION_CONTROL = 0x00002018, + * EPTP_LIST_ADDRESS = 0x00002024, + * VMREAD_BITMAP = 0x00002026, + * VMWRITE_BITMAP = 0x00002028, + * + * TSC_MULTIPLIER = 0x00002032, + * PLE_GAP = 0x00004020, + * PLE_WINDOW = 0x00004022, + * VMX_PREEMPTION_TIMER_VALUE = 0x0000482E, + * + * Currently unsupported in KVM: + * GUEST_IA32_RTIT_CTL = 0x00002814, + */ +#define EVMCS1_SUPPORTED_PINCTRL \ + (PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ + PIN_BASED_EXT_INTR_MASK | \ + PIN_BASED_NMI_EXITING | \ + PIN_BASED_VIRTUAL_NMIS) + +#define EVMCS1_SUPPORTED_EXEC_CTRL \ + (CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ + CPU_BASED_HLT_EXITING | \ + CPU_BASED_CR3_LOAD_EXITING | \ + CPU_BASED_CR3_STORE_EXITING | \ + CPU_BASED_UNCOND_IO_EXITING | \ + CPU_BASED_MOV_DR_EXITING | \ + CPU_BASED_USE_TSC_OFFSETTING | \ + CPU_BASED_MWAIT_EXITING | \ + CPU_BASED_MONITOR_EXITING | \ + CPU_BASED_INVLPG_EXITING | \ + CPU_BASED_RDPMC_EXITING | \ + CPU_BASED_INTR_WINDOW_EXITING | \ + CPU_BASED_CR8_LOAD_EXITING | \ + CPU_BASED_CR8_STORE_EXITING | \ + CPU_BASED_RDTSC_EXITING | \ + CPU_BASED_TPR_SHADOW | \ + CPU_BASED_USE_IO_BITMAPS | \ + CPU_BASED_MONITOR_TRAP_FLAG | \ + CPU_BASED_USE_MSR_BITMAPS | \ + CPU_BASED_NMI_WINDOW_EXITING | \ + CPU_BASED_PAUSE_EXITING | \ + CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) + +#define EVMCS1_SUPPORTED_2NDEXEC \ + (SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | \ + SECONDARY_EXEC_WBINVD_EXITING | \ + SECONDARY_EXEC_ENABLE_VPID | \ + SECONDARY_EXEC_ENABLE_EPT | \ + SECONDARY_EXEC_UNRESTRICTED_GUEST | \ + SECONDARY_EXEC_DESC | \ + SECONDARY_EXEC_ENABLE_RDTSCP | \ + SECONDARY_EXEC_ENABLE_INVPCID | \ + SECONDARY_EXEC_ENABLE_XSAVES | \ + SECONDARY_EXEC_RDSEED_EXITING | \ + SECONDARY_EXEC_RDRAND_EXITING | \ + SECONDARY_EXEC_TSC_SCALING | \ + SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | \ + SECONDARY_EXEC_PT_USE_GPA | \ + SECONDARY_EXEC_PT_CONCEAL_VMX | \ + SECONDARY_EXEC_BUS_LOCK_DETECTION | \ + SECONDARY_EXEC_NOTIFY_VM_EXITING | \ + SECONDARY_EXEC_ENCLS_EXITING) + +#define EVMCS1_SUPPORTED_3RDEXEC (0ULL) + +#define EVMCS1_SUPPORTED_VMEXIT_CTRL \ + (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | \ + VM_EXIT_SAVE_DEBUG_CONTROLS | \ + VM_EXIT_ACK_INTR_ON_EXIT | \ + VM_EXIT_HOST_ADDR_SPACE_SIZE | \ + VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | \ + VM_EXIT_SAVE_IA32_PAT | \ + VM_EXIT_LOAD_IA32_PAT | \ + VM_EXIT_SAVE_IA32_EFER | \ + VM_EXIT_LOAD_IA32_EFER | \ + VM_EXIT_CLEAR_BNDCFGS | \ + VM_EXIT_PT_CONCEAL_PIP | \ + VM_EXIT_CLEAR_IA32_RTIT_CTL) + +#define EVMCS1_SUPPORTED_VMENTRY_CTRL \ + (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | \ + VM_ENTRY_LOAD_DEBUG_CONTROLS | \ + VM_ENTRY_IA32E_MODE | \ + VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | \ + VM_ENTRY_LOAD_IA32_PAT | \ + VM_ENTRY_LOAD_IA32_EFER | \ + VM_ENTRY_LOAD_BNDCFGS | \ + VM_ENTRY_PT_CONCEAL_PIP | \ + VM_ENTRY_LOAD_IA32_RTIT_CTL) + +#define EVMCS1_SUPPORTED_VMFUNC (0) + +struct evmcs_field { + u16 offset; + u16 clean_field; +}; + +extern const struct evmcs_field vmcs_field_to_evmcs_1[]; +extern const unsigned int nr_evmcs_1_fields; + +static __always_inline int evmcs_field_offset(unsigned long field, + u16 *clean_field) +{ + unsigned int index = ROL16(field, 6); + const struct evmcs_field *evmcs_field; + + if (unlikely(index >= nr_evmcs_1_fields)) + return -ENOENT; + + evmcs_field = &vmcs_field_to_evmcs_1[index]; + + /* + * Use offset=0 to detect holes in eVMCS. This offset belongs to + * 'revision_id' but this field has no encoding and is supposed to + * be accessed directly. + */ + if (unlikely(!evmcs_field->offset)) + return -ENOENT; + + if (clean_field) + *clean_field = evmcs_field->clean_field; + + return evmcs_field->offset; +} + +static inline u64 evmcs_read_any(struct hv_enlightened_vmcs *evmcs, + unsigned long field, u16 offset) +{ + /* + * vmcs12_read_any() doesn't care whether the supplied structure + * is 'struct vmcs12' or 'struct hv_enlightened_vmcs' as it takes + * the exact offset of the required field, use it for convenience + * here. + */ + return vmcs12_read_any((void *)evmcs, field, offset); +} + +#endif /* __KVM_X86_VMX_HYPERV_H */ diff --git a/arch/x86/kvm/vmx/vmx_onhyperv.h b/arch/x86/kvm/vmx/vmx_onhyperv.h index 11541d272dbd..eb48153bfd73 100644 --- a/arch/x86/kvm/vmx/vmx_onhyperv.h +++ b/arch/x86/kvm/vmx/vmx_onhyperv.h @@ -4,11 +4,12 @@ #define __ARCH_X86_KVM_VMX_ONHYPERV_H__ #include <asm/hyperv-tlfs.h> +#include <asm/mshyperv.h> #include <linux/jump_label.h> #include "capabilities.h" -#include "hyperv.h" +#include "hyperv_evmcs.h" #include "vmcs12.h" #define current_evmcs ((struct hv_enlightened_vmcs *)this_cpu_read(current_vmcs)) -- 2.41.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch} 2023-10-10 16:02 ` [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch} Vitaly Kuznetsov @ 2023-10-12 19:40 ` Maxim Levitsky 2023-10-16 12:47 ` Vitaly Kuznetsov 0 siblings, 1 reply; 5+ messages in thread From: Maxim Levitsky @ 2023-10-12 19:40 UTC (permalink / raw) To: Vitaly Kuznetsov, kvm, Paolo Bonzini, Sean Christopherson; +Cc: linux-kernel У вт, 2023-10-10 у 18:02 +0200, Vitaly Kuznetsov пише: > Some Enlightened VMCS related code is needed both by Hyper-V on KVM and > KVM on Hyper-V. As a preparation to making Hyper-V emulation optional, > create dedicated 'hyperv_evmcs.{ch}' files which are used by both. > I think it might be a good idea, to put this comment at the start of the hyperv_evmcs.h and/or hyperv_evmcs.c, explaining the fact that this file has code that is common for kvm on hyperv and for hyperv on kvm. > No functional change intended. > > Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> > --- > arch/x86/kvm/Makefile | 2 +- > arch/x86/kvm/vmx/hyperv.c | 308 ------------------------------- > arch/x86/kvm/vmx/hyperv.h | 163 +---------------- > arch/x86/kvm/vmx/hyperv_evmcs.c | 311 ++++++++++++++++++++++++++++++++ > arch/x86/kvm/vmx/hyperv_evmcs.h | 162 +++++++++++++++++ > arch/x86/kvm/vmx/vmx_onhyperv.h | 3 +- > 6 files changed, 477 insertions(+), 472 deletions(-) > create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.c > create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.h > > diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile > index a99ffc3f3a3f..8ea872401cd6 100644 > --- a/arch/x86/kvm/Makefile > +++ b/arch/x86/kvm/Makefile > @@ -23,7 +23,7 @@ kvm-$(CONFIG_KVM_XEN) += xen.o > kvm-$(CONFIG_KVM_SMM) += smm.o > > kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ > - vmx/hyperv.o vmx/nested.o vmx/posted_intr.o > + vmx/hyperv.o vmx/hyperv_evmcs.o vmx/nested.o vmx/posted_intr.o > kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o > > ifdef CONFIG_HYPERV > diff --git a/arch/x86/kvm/vmx/hyperv.c b/arch/x86/kvm/vmx/hyperv.c > index de13dc14fe1d..fab6a1ad98dc 100644 > --- a/arch/x86/kvm/vmx/hyperv.c > +++ b/arch/x86/kvm/vmx/hyperv.c > @@ -13,314 +13,6 @@ > > #define CC KVM_NESTED_VMENTER_CONSISTENCY_CHECK > > -#define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x) > -#define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \ > - {EVMCS1_OFFSET(name), clean_field} > - > -const struct evmcs_field vmcs_field_to_evmcs_1[] = { > - /* 64 bit rw */ > - EVMCS1_FIELD(GUEST_RIP, guest_rip, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(GUEST_RSP, guest_rsp, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > - EVMCS1_FIELD(GUEST_RFLAGS, guest_rflags, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > - EVMCS1_FIELD(HOST_IA32_PAT, host_ia32_pat, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_IA32_EFER, host_ia32_efer, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_CR0, host_cr0, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_CR3, host_cr3, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_CR4, host_cr4, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_RIP, host_rip, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(IO_BITMAP_A, io_bitmap_a, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), > - EVMCS1_FIELD(IO_BITMAP_B, io_bitmap_b, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), > - EVMCS1_FIELD(MSR_BITMAP, msr_bitmap, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP), > - EVMCS1_FIELD(GUEST_ES_BASE, guest_es_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_CS_BASE, guest_cs_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_SS_BASE, guest_ss_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_DS_BASE, guest_ds_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_FS_BASE, guest_fs_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_GS_BASE, guest_gs_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_LDTR_BASE, guest_ldtr_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_TR_BASE, guest_tr_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_GDTR_BASE, guest_gdtr_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_IDTR_BASE, guest_idtr_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(TSC_OFFSET, tsc_offset, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > - EVMCS1_FIELD(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > - EVMCS1_FIELD(VMCS_LINK_POINTER, vmcs_link_pointer, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_IA32_PAT, guest_ia32_pat, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_IA32_EFER, guest_ia32_efer, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_PDPTR0, guest_pdptr0, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_PDPTR1, guest_pdptr1, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_PDPTR2, guest_pdptr2, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_PDPTR3, guest_pdptr3, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(CR0_READ_SHADOW, cr0_read_shadow, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(CR4_READ_SHADOW, cr4_read_shadow, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(GUEST_CR0, guest_cr0, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(GUEST_CR3, guest_cr3, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(GUEST_CR4, guest_cr4, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(GUEST_DR7, guest_dr7, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > - EVMCS1_FIELD(HOST_FS_BASE, host_fs_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > - EVMCS1_FIELD(HOST_GS_BASE, host_gs_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > - EVMCS1_FIELD(HOST_TR_BASE, host_tr_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > - EVMCS1_FIELD(HOST_GDTR_BASE, host_gdtr_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > - EVMCS1_FIELD(HOST_IDTR_BASE, host_idtr_base, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > - EVMCS1_FIELD(HOST_RSP, host_rsp, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > - EVMCS1_FIELD(EPT_POINTER, ept_pointer, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), > - EVMCS1_FIELD(GUEST_BNDCFGS, guest_bndcfgs, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(XSS_EXIT_BITMAP, xss_exit_bitmap, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > - EVMCS1_FIELD(ENCLS_EXITING_BITMAP, encls_exiting_bitmap, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > - EVMCS1_FIELD(TSC_MULTIPLIER, tsc_multiplier, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > - /* > - * Not used by KVM: > - * > - * EVMCS1_FIELD(0x00006828, guest_ia32_s_cet, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - * EVMCS1_FIELD(0x0000682A, guest_ssp, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > - * EVMCS1_FIELD(0x0000682C, guest_ia32_int_ssp_table_addr, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - * EVMCS1_FIELD(0x00002816, guest_ia32_lbr_ctl, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - * EVMCS1_FIELD(0x00006C18, host_ia32_s_cet, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - * EVMCS1_FIELD(0x00006C1A, host_ssp, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - * EVMCS1_FIELD(0x00006C1C, host_ia32_int_ssp_table_addr, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - */ > - > - /* 64 bit read only */ > - EVMCS1_FIELD(GUEST_PHYSICAL_ADDRESS, guest_physical_address, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(EXIT_QUALIFICATION, exit_qualification, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - /* > - * Not defined in KVM: > - * > - * EVMCS1_FIELD(0x00006402, exit_io_instruction_ecx, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > - * EVMCS1_FIELD(0x00006404, exit_io_instruction_esi, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > - * EVMCS1_FIELD(0x00006406, exit_io_instruction_esi, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > - * EVMCS1_FIELD(0x00006408, exit_io_instruction_eip, > - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > - */ > - EVMCS1_FIELD(GUEST_LINEAR_ADDRESS, guest_linear_address, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - > - /* > - * No mask defined in the spec as Hyper-V doesn't currently support > - * these. Future proof by resetting the whole clean field mask on > - * access. > - */ > - EVMCS1_FIELD(VM_EXIT_MSR_STORE_ADDR, vm_exit_msr_store_addr, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - EVMCS1_FIELD(VM_EXIT_MSR_LOAD_ADDR, vm_exit_msr_load_addr, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_ADDR, vm_entry_msr_load_addr, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - > - /* 32 bit rw */ > - EVMCS1_FIELD(TPR_THRESHOLD, tpr_threshold, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(GUEST_INTERRUPTIBILITY_INFO, guest_interruptibility_info, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > - EVMCS1_FIELD(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC), > - EVMCS1_FIELD(EXCEPTION_BITMAP, exception_bitmap, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN), > - EVMCS1_FIELD(VM_ENTRY_CONTROLS, vm_entry_controls, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY), > - EVMCS1_FIELD(VM_ENTRY_INTR_INFO_FIELD, vm_entry_intr_info_field, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), > - EVMCS1_FIELD(VM_ENTRY_EXCEPTION_ERROR_CODE, > - vm_entry_exception_error_code, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), > - EVMCS1_FIELD(VM_ENTRY_INSTRUCTION_LEN, vm_entry_instruction_len, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), > - EVMCS1_FIELD(HOST_IA32_SYSENTER_CS, host_ia32_sysenter_cs, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(PIN_BASED_VM_EXEC_CONTROL, pin_based_vm_exec_control, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), > - EVMCS1_FIELD(VM_EXIT_CONTROLS, vm_exit_controls, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), > - EVMCS1_FIELD(SECONDARY_VM_EXEC_CONTROL, secondary_vm_exec_control, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), > - EVMCS1_FIELD(GUEST_ES_LIMIT, guest_es_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_CS_LIMIT, guest_cs_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_SS_LIMIT, guest_ss_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_DS_LIMIT, guest_ds_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_FS_LIMIT, guest_fs_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_GS_LIMIT, guest_gs_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_LDTR_LIMIT, guest_ldtr_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_TR_LIMIT, guest_tr_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_GDTR_LIMIT, guest_gdtr_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_IDTR_LIMIT, guest_idtr_limit, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_ES_AR_BYTES, guest_es_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_CS_AR_BYTES, guest_cs_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_SS_AR_BYTES, guest_ss_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_DS_AR_BYTES, guest_ds_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_FS_AR_BYTES, guest_fs_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_GS_AR_BYTES, guest_gs_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_LDTR_AR_BYTES, guest_ldtr_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_TR_AR_BYTES, guest_tr_ar_bytes, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_ACTIVITY_STATE, guest_activity_state, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - EVMCS1_FIELD(GUEST_SYSENTER_CS, guest_sysenter_cs, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > - > - /* 32 bit read only */ > - EVMCS1_FIELD(VM_INSTRUCTION_ERROR, vm_instruction_error, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(VM_EXIT_REASON, vm_exit_reason, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(VM_EXIT_INTR_INFO, vm_exit_intr_info, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(VM_EXIT_INTR_ERROR_CODE, vm_exit_intr_error_code, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(IDT_VECTORING_INFO_FIELD, idt_vectoring_info_field, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(IDT_VECTORING_ERROR_CODE, idt_vectoring_error_code, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(VM_EXIT_INSTRUCTION_LEN, vm_exit_instruction_len, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - EVMCS1_FIELD(VMX_INSTRUCTION_INFO, vmx_instruction_info, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > - > - /* No mask defined in the spec (not used) */ > - EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MASK, page_fault_error_code_mask, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MATCH, page_fault_error_code_match, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - EVMCS1_FIELD(CR3_TARGET_COUNT, cr3_target_count, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - EVMCS1_FIELD(VM_EXIT_MSR_STORE_COUNT, vm_exit_msr_store_count, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - EVMCS1_FIELD(VM_EXIT_MSR_LOAD_COUNT, vm_exit_msr_load_count, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_COUNT, vm_entry_msr_load_count, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > - > - /* 16 bit rw */ > - EVMCS1_FIELD(HOST_ES_SELECTOR, host_es_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_CS_SELECTOR, host_cs_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_SS_SELECTOR, host_ss_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_DS_SELECTOR, host_ds_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_FS_SELECTOR, host_fs_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_GS_SELECTOR, host_gs_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(HOST_TR_SELECTOR, host_tr_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > - EVMCS1_FIELD(GUEST_ES_SELECTOR, guest_es_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_CS_SELECTOR, guest_cs_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_SS_SELECTOR, guest_ss_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_DS_SELECTOR, guest_ds_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_FS_SELECTOR, guest_fs_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_GS_SELECTOR, guest_gs_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_LDTR_SELECTOR, guest_ldtr_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(GUEST_TR_SELECTOR, guest_tr_selector, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > - EVMCS1_FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id, > - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), > -}; > -const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); > - > u64 nested_get_evmptr(struct kvm_vcpu *vcpu) > { > struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); > diff --git a/arch/x86/kvm/vmx/hyperv.h b/arch/x86/kvm/vmx/hyperv.h > index 9401dbfaea7c..d4ed99008518 100644 > --- a/arch/x86/kvm/vmx/hyperv.h > +++ b/arch/x86/kvm/vmx/hyperv.h > @@ -2,170 +2,9 @@ > #ifndef __KVM_X86_VMX_HYPERV_H > #define __KVM_X86_VMX_HYPERV_H > > -#include <linux/jump_label.h> > - > -#include <asm/hyperv-tlfs.h> > -#include <asm/mshyperv.h> > -#include <asm/vmx.h> > - > -#include "../hyperv.h" > - > -#include "capabilities.h" > -#include "vmcs.h" > +#include <linux/kvm_host.h> > #include "vmcs12.h" > > -#define KVM_EVMCS_VERSION 1 > - > -/* > - * Enlightened VMCSv1 doesn't support these: > - * > - * POSTED_INTR_NV = 0x00000002, > - * GUEST_INTR_STATUS = 0x00000810, > - * APIC_ACCESS_ADDR = 0x00002014, > - * POSTED_INTR_DESC_ADDR = 0x00002016, > - * EOI_EXIT_BITMAP0 = 0x0000201c, > - * EOI_EXIT_BITMAP1 = 0x0000201e, > - * EOI_EXIT_BITMAP2 = 0x00002020, > - * EOI_EXIT_BITMAP3 = 0x00002022, > - * GUEST_PML_INDEX = 0x00000812, > - * PML_ADDRESS = 0x0000200e, > - * VM_FUNCTION_CONTROL = 0x00002018, > - * EPTP_LIST_ADDRESS = 0x00002024, > - * VMREAD_BITMAP = 0x00002026, > - * VMWRITE_BITMAP = 0x00002028, > - * > - * TSC_MULTIPLIER = 0x00002032, > - * PLE_GAP = 0x00004020, > - * PLE_WINDOW = 0x00004022, > - * VMX_PREEMPTION_TIMER_VALUE = 0x0000482E, > - * > - * Currently unsupported in KVM: > - * GUEST_IA32_RTIT_CTL = 0x00002814, > - */ > -#define EVMCS1_SUPPORTED_PINCTRL \ > - (PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ > - PIN_BASED_EXT_INTR_MASK | \ > - PIN_BASED_NMI_EXITING | \ > - PIN_BASED_VIRTUAL_NMIS) > - > -#define EVMCS1_SUPPORTED_EXEC_CTRL \ > - (CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ > - CPU_BASED_HLT_EXITING | \ > - CPU_BASED_CR3_LOAD_EXITING | \ > - CPU_BASED_CR3_STORE_EXITING | \ > - CPU_BASED_UNCOND_IO_EXITING | \ > - CPU_BASED_MOV_DR_EXITING | \ > - CPU_BASED_USE_TSC_OFFSETTING | \ > - CPU_BASED_MWAIT_EXITING | \ > - CPU_BASED_MONITOR_EXITING | \ > - CPU_BASED_INVLPG_EXITING | \ > - CPU_BASED_RDPMC_EXITING | \ > - CPU_BASED_INTR_WINDOW_EXITING | \ > - CPU_BASED_CR8_LOAD_EXITING | \ > - CPU_BASED_CR8_STORE_EXITING | \ > - CPU_BASED_RDTSC_EXITING | \ > - CPU_BASED_TPR_SHADOW | \ > - CPU_BASED_USE_IO_BITMAPS | \ > - CPU_BASED_MONITOR_TRAP_FLAG | \ > - CPU_BASED_USE_MSR_BITMAPS | \ > - CPU_BASED_NMI_WINDOW_EXITING | \ > - CPU_BASED_PAUSE_EXITING | \ > - CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) > - > -#define EVMCS1_SUPPORTED_2NDEXEC \ > - (SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | \ > - SECONDARY_EXEC_WBINVD_EXITING | \ > - SECONDARY_EXEC_ENABLE_VPID | \ > - SECONDARY_EXEC_ENABLE_EPT | \ > - SECONDARY_EXEC_UNRESTRICTED_GUEST | \ > - SECONDARY_EXEC_DESC | \ > - SECONDARY_EXEC_ENABLE_RDTSCP | \ > - SECONDARY_EXEC_ENABLE_INVPCID | \ > - SECONDARY_EXEC_ENABLE_XSAVES | \ > - SECONDARY_EXEC_RDSEED_EXITING | \ > - SECONDARY_EXEC_RDRAND_EXITING | \ > - SECONDARY_EXEC_TSC_SCALING | \ > - SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | \ > - SECONDARY_EXEC_PT_USE_GPA | \ > - SECONDARY_EXEC_PT_CONCEAL_VMX | \ > - SECONDARY_EXEC_BUS_LOCK_DETECTION | \ > - SECONDARY_EXEC_NOTIFY_VM_EXITING | \ > - SECONDARY_EXEC_ENCLS_EXITING) > - > -#define EVMCS1_SUPPORTED_3RDEXEC (0ULL) > - > -#define EVMCS1_SUPPORTED_VMEXIT_CTRL \ > - (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | \ > - VM_EXIT_SAVE_DEBUG_CONTROLS | \ > - VM_EXIT_ACK_INTR_ON_EXIT | \ > - VM_EXIT_HOST_ADDR_SPACE_SIZE | \ > - VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | \ > - VM_EXIT_SAVE_IA32_PAT | \ > - VM_EXIT_LOAD_IA32_PAT | \ > - VM_EXIT_SAVE_IA32_EFER | \ > - VM_EXIT_LOAD_IA32_EFER | \ > - VM_EXIT_CLEAR_BNDCFGS | \ > - VM_EXIT_PT_CONCEAL_PIP | \ > - VM_EXIT_CLEAR_IA32_RTIT_CTL) > - > -#define EVMCS1_SUPPORTED_VMENTRY_CTRL \ > - (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | \ > - VM_ENTRY_LOAD_DEBUG_CONTROLS | \ > - VM_ENTRY_IA32E_MODE | \ > - VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | \ > - VM_ENTRY_LOAD_IA32_PAT | \ > - VM_ENTRY_LOAD_IA32_EFER | \ > - VM_ENTRY_LOAD_BNDCFGS | \ > - VM_ENTRY_PT_CONCEAL_PIP | \ > - VM_ENTRY_LOAD_IA32_RTIT_CTL) > - > -#define EVMCS1_SUPPORTED_VMFUNC (0) > - > -struct evmcs_field { > - u16 offset; > - u16 clean_field; > -}; > - > -extern const struct evmcs_field vmcs_field_to_evmcs_1[]; > -extern const unsigned int nr_evmcs_1_fields; > - > -static __always_inline int evmcs_field_offset(unsigned long field, > - u16 *clean_field) > -{ > - unsigned int index = ROL16(field, 6); > - const struct evmcs_field *evmcs_field; > - > - if (unlikely(index >= nr_evmcs_1_fields)) > - return -ENOENT; > - > - evmcs_field = &vmcs_field_to_evmcs_1[index]; > - > - /* > - * Use offset=0 to detect holes in eVMCS. This offset belongs to > - * 'revision_id' but this field has no encoding and is supposed to > - * be accessed directly. > - */ > - if (unlikely(!evmcs_field->offset)) > - return -ENOENT; > - > - if (clean_field) > - *clean_field = evmcs_field->clean_field; > - > - return evmcs_field->offset; > -} > - > -static inline u64 evmcs_read_any(struct hv_enlightened_vmcs *evmcs, > - unsigned long field, u16 offset) > -{ > - /* > - * vmcs12_read_any() doesn't care whether the supplied structure > - * is 'struct vmcs12' or 'struct hv_enlightened_vmcs' as it takes > - * the exact offset of the required field, use it for convenience > - * here. > - */ > - return vmcs12_read_any((void *)evmcs, field, offset); > -} > - > #define EVMPTR_INVALID (-1ULL) > #define EVMPTR_MAP_PENDING (-2ULL) > > diff --git a/arch/x86/kvm/vmx/hyperv_evmcs.c b/arch/x86/kvm/vmx/hyperv_evmcs.c > new file mode 100644 > index 000000000000..57a2e0470ac8 > --- /dev/null > +++ b/arch/x86/kvm/vmx/hyperv_evmcs.c > @@ -0,0 +1,311 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include "hyperv_evmcs.h" > + > +#define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x) > +#define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \ > + {EVMCS1_OFFSET(name), clean_field} > + > +const struct evmcs_field vmcs_field_to_evmcs_1[] = { > + /* 64 bit rw */ > + EVMCS1_FIELD(GUEST_RIP, guest_rip, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(GUEST_RSP, guest_rsp, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > + EVMCS1_FIELD(GUEST_RFLAGS, guest_rflags, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > + EVMCS1_FIELD(HOST_IA32_PAT, host_ia32_pat, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_IA32_EFER, host_ia32_efer, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_CR0, host_cr0, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_CR3, host_cr3, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_CR4, host_cr4, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_RIP, host_rip, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(IO_BITMAP_A, io_bitmap_a, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), > + EVMCS1_FIELD(IO_BITMAP_B, io_bitmap_b, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), > + EVMCS1_FIELD(MSR_BITMAP, msr_bitmap, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP), > + EVMCS1_FIELD(GUEST_ES_BASE, guest_es_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_CS_BASE, guest_cs_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_SS_BASE, guest_ss_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_DS_BASE, guest_ds_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_FS_BASE, guest_fs_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_GS_BASE, guest_gs_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_LDTR_BASE, guest_ldtr_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_TR_BASE, guest_tr_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_GDTR_BASE, guest_gdtr_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_IDTR_BASE, guest_idtr_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(TSC_OFFSET, tsc_offset, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > + EVMCS1_FIELD(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > + EVMCS1_FIELD(VMCS_LINK_POINTER, vmcs_link_pointer, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_IA32_PAT, guest_ia32_pat, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_IA32_EFER, guest_ia32_efer, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_PDPTR0, guest_pdptr0, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_PDPTR1, guest_pdptr1, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_PDPTR2, guest_pdptr2, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_PDPTR3, guest_pdptr3, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(CR0_READ_SHADOW, cr0_read_shadow, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(CR4_READ_SHADOW, cr4_read_shadow, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(GUEST_CR0, guest_cr0, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(GUEST_CR3, guest_cr3, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(GUEST_CR4, guest_cr4, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(GUEST_DR7, guest_dr7, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), > + EVMCS1_FIELD(HOST_FS_BASE, host_fs_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > + EVMCS1_FIELD(HOST_GS_BASE, host_gs_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > + EVMCS1_FIELD(HOST_TR_BASE, host_tr_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > + EVMCS1_FIELD(HOST_GDTR_BASE, host_gdtr_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > + EVMCS1_FIELD(HOST_IDTR_BASE, host_idtr_base, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > + EVMCS1_FIELD(HOST_RSP, host_rsp, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), > + EVMCS1_FIELD(EPT_POINTER, ept_pointer, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), > + EVMCS1_FIELD(GUEST_BNDCFGS, guest_bndcfgs, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(XSS_EXIT_BITMAP, xss_exit_bitmap, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > + EVMCS1_FIELD(ENCLS_EXITING_BITMAP, encls_exiting_bitmap, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > + EVMCS1_FIELD(TSC_MULTIPLIER, tsc_multiplier, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), > + /* > + * Not used by KVM: > + * > + * EVMCS1_FIELD(0x00006828, guest_ia32_s_cet, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + * EVMCS1_FIELD(0x0000682A, guest_ssp, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > + * EVMCS1_FIELD(0x0000682C, guest_ia32_int_ssp_table_addr, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + * EVMCS1_FIELD(0x00002816, guest_ia32_lbr_ctl, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + * EVMCS1_FIELD(0x00006C18, host_ia32_s_cet, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + * EVMCS1_FIELD(0x00006C1A, host_ssp, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + * EVMCS1_FIELD(0x00006C1C, host_ia32_int_ssp_table_addr, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + */ > + > + /* 64 bit read only */ > + EVMCS1_FIELD(GUEST_PHYSICAL_ADDRESS, guest_physical_address, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(EXIT_QUALIFICATION, exit_qualification, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + /* > + * Not defined in KVM: > + * > + * EVMCS1_FIELD(0x00006402, exit_io_instruction_ecx, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > + * EVMCS1_FIELD(0x00006404, exit_io_instruction_esi, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > + * EVMCS1_FIELD(0x00006406, exit_io_instruction_esi, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > + * EVMCS1_FIELD(0x00006408, exit_io_instruction_eip, > + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); > + */ > + EVMCS1_FIELD(GUEST_LINEAR_ADDRESS, guest_linear_address, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + > + /* > + * No mask defined in the spec as Hyper-V doesn't currently support > + * these. Future proof by resetting the whole clean field mask on > + * access. > + */ > + EVMCS1_FIELD(VM_EXIT_MSR_STORE_ADDR, vm_exit_msr_store_addr, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + EVMCS1_FIELD(VM_EXIT_MSR_LOAD_ADDR, vm_exit_msr_load_addr, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_ADDR, vm_entry_msr_load_addr, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + > + /* 32 bit rw */ > + EVMCS1_FIELD(TPR_THRESHOLD, tpr_threshold, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(GUEST_INTERRUPTIBILITY_INFO, guest_interruptibility_info, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), > + EVMCS1_FIELD(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC), > + EVMCS1_FIELD(EXCEPTION_BITMAP, exception_bitmap, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN), > + EVMCS1_FIELD(VM_ENTRY_CONTROLS, vm_entry_controls, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY), > + EVMCS1_FIELD(VM_ENTRY_INTR_INFO_FIELD, vm_entry_intr_info_field, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), > + EVMCS1_FIELD(VM_ENTRY_EXCEPTION_ERROR_CODE, > + vm_entry_exception_error_code, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), > + EVMCS1_FIELD(VM_ENTRY_INSTRUCTION_LEN, vm_entry_instruction_len, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), > + EVMCS1_FIELD(HOST_IA32_SYSENTER_CS, host_ia32_sysenter_cs, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(PIN_BASED_VM_EXEC_CONTROL, pin_based_vm_exec_control, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), > + EVMCS1_FIELD(VM_EXIT_CONTROLS, vm_exit_controls, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), > + EVMCS1_FIELD(SECONDARY_VM_EXEC_CONTROL, secondary_vm_exec_control, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), > + EVMCS1_FIELD(GUEST_ES_LIMIT, guest_es_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_CS_LIMIT, guest_cs_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_SS_LIMIT, guest_ss_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_DS_LIMIT, guest_ds_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_FS_LIMIT, guest_fs_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_GS_LIMIT, guest_gs_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_LDTR_LIMIT, guest_ldtr_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_TR_LIMIT, guest_tr_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_GDTR_LIMIT, guest_gdtr_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_IDTR_LIMIT, guest_idtr_limit, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_ES_AR_BYTES, guest_es_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_CS_AR_BYTES, guest_cs_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_SS_AR_BYTES, guest_ss_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_DS_AR_BYTES, guest_ds_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_FS_AR_BYTES, guest_fs_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_GS_AR_BYTES, guest_gs_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_LDTR_AR_BYTES, guest_ldtr_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_TR_AR_BYTES, guest_tr_ar_bytes, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_ACTIVITY_STATE, guest_activity_state, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + EVMCS1_FIELD(GUEST_SYSENTER_CS, guest_sysenter_cs, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), > + > + /* 32 bit read only */ > + EVMCS1_FIELD(VM_INSTRUCTION_ERROR, vm_instruction_error, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(VM_EXIT_REASON, vm_exit_reason, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(VM_EXIT_INTR_INFO, vm_exit_intr_info, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(VM_EXIT_INTR_ERROR_CODE, vm_exit_intr_error_code, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(IDT_VECTORING_INFO_FIELD, idt_vectoring_info_field, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(IDT_VECTORING_ERROR_CODE, idt_vectoring_error_code, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(VM_EXIT_INSTRUCTION_LEN, vm_exit_instruction_len, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + EVMCS1_FIELD(VMX_INSTRUCTION_INFO, vmx_instruction_info, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), > + > + /* No mask defined in the spec (not used) */ > + EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MASK, page_fault_error_code_mask, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MATCH, page_fault_error_code_match, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + EVMCS1_FIELD(CR3_TARGET_COUNT, cr3_target_count, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + EVMCS1_FIELD(VM_EXIT_MSR_STORE_COUNT, vm_exit_msr_store_count, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + EVMCS1_FIELD(VM_EXIT_MSR_LOAD_COUNT, vm_exit_msr_load_count, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_COUNT, vm_entry_msr_load_count, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), > + > + /* 16 bit rw */ > + EVMCS1_FIELD(HOST_ES_SELECTOR, host_es_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_CS_SELECTOR, host_cs_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_SS_SELECTOR, host_ss_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_DS_SELECTOR, host_ds_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_FS_SELECTOR, host_fs_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_GS_SELECTOR, host_gs_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(HOST_TR_SELECTOR, host_tr_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), > + EVMCS1_FIELD(GUEST_ES_SELECTOR, guest_es_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_CS_SELECTOR, guest_cs_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_SS_SELECTOR, guest_ss_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_DS_SELECTOR, guest_ds_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_FS_SELECTOR, guest_fs_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_GS_SELECTOR, guest_gs_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_LDTR_SELECTOR, guest_ldtr_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(GUEST_TR_SELECTOR, guest_tr_selector, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), > + EVMCS1_FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id, > + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), > +}; > +const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); > diff --git a/arch/x86/kvm/vmx/hyperv_evmcs.h b/arch/x86/kvm/vmx/hyperv_evmcs.h > new file mode 100644 > index 000000000000..11d96975e7cc > --- /dev/null > +++ b/arch/x86/kvm/vmx/hyperv_evmcs.h > @@ -0,0 +1,162 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef __KVM_X86_VMX_HYPERV_EVMCS_H > +#define __KVM_X86_VMX_HYPERV_EVMCS_H > + > +#include <asm/hyperv-tlfs.h> > + > +#include "capabilities.h" > +#include "vmcs12.h" > + > +#define KVM_EVMCS_VERSION 1 > + > +/* > + * Enlightened VMCSv1 doesn't support these: > + * > + * POSTED_INTR_NV = 0x00000002, > + * GUEST_INTR_STATUS = 0x00000810, > + * APIC_ACCESS_ADDR = 0x00002014, > + * POSTED_INTR_DESC_ADDR = 0x00002016, > + * EOI_EXIT_BITMAP0 = 0x0000201c, > + * EOI_EXIT_BITMAP1 = 0x0000201e, > + * EOI_EXIT_BITMAP2 = 0x00002020, > + * EOI_EXIT_BITMAP3 = 0x00002022, > + * GUEST_PML_INDEX = 0x00000812, > + * PML_ADDRESS = 0x0000200e, > + * VM_FUNCTION_CONTROL = 0x00002018, > + * EPTP_LIST_ADDRESS = 0x00002024, > + * VMREAD_BITMAP = 0x00002026, > + * VMWRITE_BITMAP = 0x00002028, > + * > + * TSC_MULTIPLIER = 0x00002032, > + * PLE_GAP = 0x00004020, > + * PLE_WINDOW = 0x00004022, > + * VMX_PREEMPTION_TIMER_VALUE = 0x0000482E, > + * > + * Currently unsupported in KVM: > + * GUEST_IA32_RTIT_CTL = 0x00002814, > + */ > +#define EVMCS1_SUPPORTED_PINCTRL \ > + (PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ > + PIN_BASED_EXT_INTR_MASK | \ > + PIN_BASED_NMI_EXITING | \ > + PIN_BASED_VIRTUAL_NMIS) > + > +#define EVMCS1_SUPPORTED_EXEC_CTRL \ > + (CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ > + CPU_BASED_HLT_EXITING | \ > + CPU_BASED_CR3_LOAD_EXITING | \ > + CPU_BASED_CR3_STORE_EXITING | \ > + CPU_BASED_UNCOND_IO_EXITING | \ > + CPU_BASED_MOV_DR_EXITING | \ > + CPU_BASED_USE_TSC_OFFSETTING | \ > + CPU_BASED_MWAIT_EXITING | \ > + CPU_BASED_MONITOR_EXITING | \ > + CPU_BASED_INVLPG_EXITING | \ > + CPU_BASED_RDPMC_EXITING | \ > + CPU_BASED_INTR_WINDOW_EXITING | \ > + CPU_BASED_CR8_LOAD_EXITING | \ > + CPU_BASED_CR8_STORE_EXITING | \ > + CPU_BASED_RDTSC_EXITING | \ > + CPU_BASED_TPR_SHADOW | \ > + CPU_BASED_USE_IO_BITMAPS | \ > + CPU_BASED_MONITOR_TRAP_FLAG | \ > + CPU_BASED_USE_MSR_BITMAPS | \ > + CPU_BASED_NMI_WINDOW_EXITING | \ > + CPU_BASED_PAUSE_EXITING | \ > + CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) > + > +#define EVMCS1_SUPPORTED_2NDEXEC \ > + (SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | \ > + SECONDARY_EXEC_WBINVD_EXITING | \ > + SECONDARY_EXEC_ENABLE_VPID | \ > + SECONDARY_EXEC_ENABLE_EPT | \ > + SECONDARY_EXEC_UNRESTRICTED_GUEST | \ > + SECONDARY_EXEC_DESC | \ > + SECONDARY_EXEC_ENABLE_RDTSCP | \ > + SECONDARY_EXEC_ENABLE_INVPCID | \ > + SECONDARY_EXEC_ENABLE_XSAVES | \ > + SECONDARY_EXEC_RDSEED_EXITING | \ > + SECONDARY_EXEC_RDRAND_EXITING | \ > + SECONDARY_EXEC_TSC_SCALING | \ > + SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | \ > + SECONDARY_EXEC_PT_USE_GPA | \ > + SECONDARY_EXEC_PT_CONCEAL_VMX | \ > + SECONDARY_EXEC_BUS_LOCK_DETECTION | \ > + SECONDARY_EXEC_NOTIFY_VM_EXITING | \ > + SECONDARY_EXEC_ENCLS_EXITING) > + > +#define EVMCS1_SUPPORTED_3RDEXEC (0ULL) > + > +#define EVMCS1_SUPPORTED_VMEXIT_CTRL \ > + (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | \ > + VM_EXIT_SAVE_DEBUG_CONTROLS | \ > + VM_EXIT_ACK_INTR_ON_EXIT | \ > + VM_EXIT_HOST_ADDR_SPACE_SIZE | \ > + VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | \ > + VM_EXIT_SAVE_IA32_PAT | \ > + VM_EXIT_LOAD_IA32_PAT | \ > + VM_EXIT_SAVE_IA32_EFER | \ > + VM_EXIT_LOAD_IA32_EFER | \ > + VM_EXIT_CLEAR_BNDCFGS | \ > + VM_EXIT_PT_CONCEAL_PIP | \ > + VM_EXIT_CLEAR_IA32_RTIT_CTL) > + > +#define EVMCS1_SUPPORTED_VMENTRY_CTRL \ > + (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | \ > + VM_ENTRY_LOAD_DEBUG_CONTROLS | \ > + VM_ENTRY_IA32E_MODE | \ > + VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | \ > + VM_ENTRY_LOAD_IA32_PAT | \ > + VM_ENTRY_LOAD_IA32_EFER | \ > + VM_ENTRY_LOAD_BNDCFGS | \ > + VM_ENTRY_PT_CONCEAL_PIP | \ > + VM_ENTRY_LOAD_IA32_RTIT_CTL) > + > +#define EVMCS1_SUPPORTED_VMFUNC (0) > + > +struct evmcs_field { > + u16 offset; > + u16 clean_field; > +}; > + > +extern const struct evmcs_field vmcs_field_to_evmcs_1[]; > +extern const unsigned int nr_evmcs_1_fields; > + > +static __always_inline int evmcs_field_offset(unsigned long field, > + u16 *clean_field) > +{ > + unsigned int index = ROL16(field, 6); > + const struct evmcs_field *evmcs_field; > + > + if (unlikely(index >= nr_evmcs_1_fields)) > + return -ENOENT; > + > + evmcs_field = &vmcs_field_to_evmcs_1[index]; > + > + /* > + * Use offset=0 to detect holes in eVMCS. This offset belongs to > + * 'revision_id' but this field has no encoding and is supposed to > + * be accessed directly. > + */ > + if (unlikely(!evmcs_field->offset)) > + return -ENOENT; > + > + if (clean_field) > + *clean_field = evmcs_field->clean_field; > + > + return evmcs_field->offset; > +} > + > +static inline u64 evmcs_read_any(struct hv_enlightened_vmcs *evmcs, > + unsigned long field, u16 offset) > +{ > + /* > + * vmcs12_read_any() doesn't care whether the supplied structure > + * is 'struct vmcs12' or 'struct hv_enlightened_vmcs' as it takes > + * the exact offset of the required field, use it for convenience > + * here. > + */ > + return vmcs12_read_any((void *)evmcs, field, offset); > +} > + > +#endif /* __KVM_X86_VMX_HYPERV_H */ > diff --git a/arch/x86/kvm/vmx/vmx_onhyperv.h b/arch/x86/kvm/vmx/vmx_onhyperv.h > index 11541d272dbd..eb48153bfd73 100644 > --- a/arch/x86/kvm/vmx/vmx_onhyperv.h > +++ b/arch/x86/kvm/vmx/vmx_onhyperv.h > @@ -4,11 +4,12 @@ > #define __ARCH_X86_KVM_VMX_ONHYPERV_H__ > > #include <asm/hyperv-tlfs.h> > +#include <asm/mshyperv.h> > > #include <linux/jump_label.h> > > #include "capabilities.h" > -#include "hyperv.h" > +#include "hyperv_evmcs.h" > #include "vmcs12.h" > > #define current_evmcs ((struct hv_enlightened_vmcs *)this_cpu_read(current_vmcs)) This patch fails the build because of vmx_has_valid_vmcs12() in nested.h which uses EVMPTR_INVALID. vmx/nested.h includes vmx/vmx.h which includes vmx_ops.h, it includes vmx_onhyperv.h which used to include hyperv.h but not anymore. We can either add hyperv.h to vmx/nested.h, or we can move the code in vmx_has_valid_vmcs12 to hyperv_evmcs.h. Besides the build error, Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> Best regards, Maxim Levitsky ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch} 2023-10-12 19:40 ` Maxim Levitsky @ 2023-10-16 12:47 ` Vitaly Kuznetsov 0 siblings, 0 replies; 5+ messages in thread From: Vitaly Kuznetsov @ 2023-10-16 12:47 UTC (permalink / raw) To: Maxim Levitsky, kvm, Paolo Bonzini, Sean Christopherson; +Cc: linux-kernel Maxim Levitsky <mlevitsk@redhat.com> writes: > У вт, 2023-10-10 у 18:02 +0200, Vitaly Kuznetsov пише: >> Some Enlightened VMCS related code is needed both by Hyper-V on KVM and >> KVM on Hyper-V. As a preparation to making Hyper-V emulation optional, >> create dedicated 'hyperv_evmcs.{ch}' files which are used by both. >> > > I think it might be a good idea, to put this comment at the start of the > hyperv_evmcs.h and/or hyperv_evmcs.c, explaining the fact that this file > has code that is common for kvm on hyperv and for hyperv on kvm. > > >> No functional change intended. >> >> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> >> --- >> arch/x86/kvm/Makefile | 2 +- >> arch/x86/kvm/vmx/hyperv.c | 308 ------------------------------- >> arch/x86/kvm/vmx/hyperv.h | 163 +---------------- >> arch/x86/kvm/vmx/hyperv_evmcs.c | 311 ++++++++++++++++++++++++++++++++ >> arch/x86/kvm/vmx/hyperv_evmcs.h | 162 +++++++++++++++++ >> arch/x86/kvm/vmx/vmx_onhyperv.h | 3 +- >> 6 files changed, 477 insertions(+), 472 deletions(-) >> create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.c >> create mode 100644 arch/x86/kvm/vmx/hyperv_evmcs.h >> >> diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile >> index a99ffc3f3a3f..8ea872401cd6 100644 >> --- a/arch/x86/kvm/Makefile >> +++ b/arch/x86/kvm/Makefile >> @@ -23,7 +23,7 @@ kvm-$(CONFIG_KVM_XEN) += xen.o >> kvm-$(CONFIG_KVM_SMM) += smm.o >> >> kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ >> - vmx/hyperv.o vmx/nested.o vmx/posted_intr.o >> + vmx/hyperv.o vmx/hyperv_evmcs.o vmx/nested.o vmx/posted_intr.o >> kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o >> >> ifdef CONFIG_HYPERV >> diff --git a/arch/x86/kvm/vmx/hyperv.c b/arch/x86/kvm/vmx/hyperv.c >> index de13dc14fe1d..fab6a1ad98dc 100644 >> --- a/arch/x86/kvm/vmx/hyperv.c >> +++ b/arch/x86/kvm/vmx/hyperv.c >> @@ -13,314 +13,6 @@ >> >> #define CC KVM_NESTED_VMENTER_CONSISTENCY_CHECK >> >> -#define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x) >> -#define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \ >> - {EVMCS1_OFFSET(name), clean_field} >> - >> -const struct evmcs_field vmcs_field_to_evmcs_1[] = { >> - /* 64 bit rw */ >> - EVMCS1_FIELD(GUEST_RIP, guest_rip, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(GUEST_RSP, guest_rsp, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> - EVMCS1_FIELD(GUEST_RFLAGS, guest_rflags, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> - EVMCS1_FIELD(HOST_IA32_PAT, host_ia32_pat, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_IA32_EFER, host_ia32_efer, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_CR0, host_cr0, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_CR3, host_cr3, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_CR4, host_cr4, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_RIP, host_rip, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(IO_BITMAP_A, io_bitmap_a, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), >> - EVMCS1_FIELD(IO_BITMAP_B, io_bitmap_b, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), >> - EVMCS1_FIELD(MSR_BITMAP, msr_bitmap, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP), >> - EVMCS1_FIELD(GUEST_ES_BASE, guest_es_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_CS_BASE, guest_cs_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_SS_BASE, guest_ss_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_DS_BASE, guest_ds_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_FS_BASE, guest_fs_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_GS_BASE, guest_gs_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_LDTR_BASE, guest_ldtr_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_TR_BASE, guest_tr_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_GDTR_BASE, guest_gdtr_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_IDTR_BASE, guest_idtr_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(TSC_OFFSET, tsc_offset, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> - EVMCS1_FIELD(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> - EVMCS1_FIELD(VMCS_LINK_POINTER, vmcs_link_pointer, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_IA32_PAT, guest_ia32_pat, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_IA32_EFER, guest_ia32_efer, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_PDPTR0, guest_pdptr0, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_PDPTR1, guest_pdptr1, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_PDPTR2, guest_pdptr2, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_PDPTR3, guest_pdptr3, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(CR0_READ_SHADOW, cr0_read_shadow, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(CR4_READ_SHADOW, cr4_read_shadow, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(GUEST_CR0, guest_cr0, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(GUEST_CR3, guest_cr3, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(GUEST_CR4, guest_cr4, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(GUEST_DR7, guest_dr7, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> - EVMCS1_FIELD(HOST_FS_BASE, host_fs_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> - EVMCS1_FIELD(HOST_GS_BASE, host_gs_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> - EVMCS1_FIELD(HOST_TR_BASE, host_tr_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> - EVMCS1_FIELD(HOST_GDTR_BASE, host_gdtr_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> - EVMCS1_FIELD(HOST_IDTR_BASE, host_idtr_base, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> - EVMCS1_FIELD(HOST_RSP, host_rsp, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> - EVMCS1_FIELD(EPT_POINTER, ept_pointer, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), >> - EVMCS1_FIELD(GUEST_BNDCFGS, guest_bndcfgs, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(XSS_EXIT_BITMAP, xss_exit_bitmap, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> - EVMCS1_FIELD(ENCLS_EXITING_BITMAP, encls_exiting_bitmap, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> - EVMCS1_FIELD(TSC_MULTIPLIER, tsc_multiplier, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> - /* >> - * Not used by KVM: >> - * >> - * EVMCS1_FIELD(0x00006828, guest_ia32_s_cet, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - * EVMCS1_FIELD(0x0000682A, guest_ssp, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> - * EVMCS1_FIELD(0x0000682C, guest_ia32_int_ssp_table_addr, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - * EVMCS1_FIELD(0x00002816, guest_ia32_lbr_ctl, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - * EVMCS1_FIELD(0x00006C18, host_ia32_s_cet, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - * EVMCS1_FIELD(0x00006C1A, host_ssp, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - * EVMCS1_FIELD(0x00006C1C, host_ia32_int_ssp_table_addr, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - */ >> - >> - /* 64 bit read only */ >> - EVMCS1_FIELD(GUEST_PHYSICAL_ADDRESS, guest_physical_address, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(EXIT_QUALIFICATION, exit_qualification, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - /* >> - * Not defined in KVM: >> - * >> - * EVMCS1_FIELD(0x00006402, exit_io_instruction_ecx, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> - * EVMCS1_FIELD(0x00006404, exit_io_instruction_esi, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> - * EVMCS1_FIELD(0x00006406, exit_io_instruction_esi, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> - * EVMCS1_FIELD(0x00006408, exit_io_instruction_eip, >> - * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> - */ >> - EVMCS1_FIELD(GUEST_LINEAR_ADDRESS, guest_linear_address, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - >> - /* >> - * No mask defined in the spec as Hyper-V doesn't currently support >> - * these. Future proof by resetting the whole clean field mask on >> - * access. >> - */ >> - EVMCS1_FIELD(VM_EXIT_MSR_STORE_ADDR, vm_exit_msr_store_addr, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - EVMCS1_FIELD(VM_EXIT_MSR_LOAD_ADDR, vm_exit_msr_load_addr, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_ADDR, vm_entry_msr_load_addr, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - >> - /* 32 bit rw */ >> - EVMCS1_FIELD(TPR_THRESHOLD, tpr_threshold, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(GUEST_INTERRUPTIBILITY_INFO, guest_interruptibility_info, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> - EVMCS1_FIELD(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC), >> - EVMCS1_FIELD(EXCEPTION_BITMAP, exception_bitmap, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN), >> - EVMCS1_FIELD(VM_ENTRY_CONTROLS, vm_entry_controls, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY), >> - EVMCS1_FIELD(VM_ENTRY_INTR_INFO_FIELD, vm_entry_intr_info_field, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), >> - EVMCS1_FIELD(VM_ENTRY_EXCEPTION_ERROR_CODE, >> - vm_entry_exception_error_code, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), >> - EVMCS1_FIELD(VM_ENTRY_INSTRUCTION_LEN, vm_entry_instruction_len, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), >> - EVMCS1_FIELD(HOST_IA32_SYSENTER_CS, host_ia32_sysenter_cs, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(PIN_BASED_VM_EXEC_CONTROL, pin_based_vm_exec_control, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), >> - EVMCS1_FIELD(VM_EXIT_CONTROLS, vm_exit_controls, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), >> - EVMCS1_FIELD(SECONDARY_VM_EXEC_CONTROL, secondary_vm_exec_control, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), >> - EVMCS1_FIELD(GUEST_ES_LIMIT, guest_es_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_CS_LIMIT, guest_cs_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_SS_LIMIT, guest_ss_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_DS_LIMIT, guest_ds_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_FS_LIMIT, guest_fs_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_GS_LIMIT, guest_gs_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_LDTR_LIMIT, guest_ldtr_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_TR_LIMIT, guest_tr_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_GDTR_LIMIT, guest_gdtr_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_IDTR_LIMIT, guest_idtr_limit, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_ES_AR_BYTES, guest_es_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_CS_AR_BYTES, guest_cs_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_SS_AR_BYTES, guest_ss_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_DS_AR_BYTES, guest_ds_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_FS_AR_BYTES, guest_fs_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_GS_AR_BYTES, guest_gs_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_LDTR_AR_BYTES, guest_ldtr_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_TR_AR_BYTES, guest_tr_ar_bytes, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_ACTIVITY_STATE, guest_activity_state, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - EVMCS1_FIELD(GUEST_SYSENTER_CS, guest_sysenter_cs, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> - >> - /* 32 bit read only */ >> - EVMCS1_FIELD(VM_INSTRUCTION_ERROR, vm_instruction_error, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(VM_EXIT_REASON, vm_exit_reason, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(VM_EXIT_INTR_INFO, vm_exit_intr_info, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(VM_EXIT_INTR_ERROR_CODE, vm_exit_intr_error_code, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(IDT_VECTORING_INFO_FIELD, idt_vectoring_info_field, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(IDT_VECTORING_ERROR_CODE, idt_vectoring_error_code, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(VM_EXIT_INSTRUCTION_LEN, vm_exit_instruction_len, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - EVMCS1_FIELD(VMX_INSTRUCTION_INFO, vmx_instruction_info, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> - >> - /* No mask defined in the spec (not used) */ >> - EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MASK, page_fault_error_code_mask, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MATCH, page_fault_error_code_match, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - EVMCS1_FIELD(CR3_TARGET_COUNT, cr3_target_count, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - EVMCS1_FIELD(VM_EXIT_MSR_STORE_COUNT, vm_exit_msr_store_count, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - EVMCS1_FIELD(VM_EXIT_MSR_LOAD_COUNT, vm_exit_msr_load_count, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_COUNT, vm_entry_msr_load_count, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> - >> - /* 16 bit rw */ >> - EVMCS1_FIELD(HOST_ES_SELECTOR, host_es_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_CS_SELECTOR, host_cs_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_SS_SELECTOR, host_ss_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_DS_SELECTOR, host_ds_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_FS_SELECTOR, host_fs_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_GS_SELECTOR, host_gs_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(HOST_TR_SELECTOR, host_tr_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> - EVMCS1_FIELD(GUEST_ES_SELECTOR, guest_es_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_CS_SELECTOR, guest_cs_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_SS_SELECTOR, guest_ss_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_DS_SELECTOR, guest_ds_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_FS_SELECTOR, guest_fs_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_GS_SELECTOR, guest_gs_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_LDTR_SELECTOR, guest_ldtr_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(GUEST_TR_SELECTOR, guest_tr_selector, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> - EVMCS1_FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id, >> - HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), >> -}; >> -const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); >> - >> u64 nested_get_evmptr(struct kvm_vcpu *vcpu) >> { >> struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); >> diff --git a/arch/x86/kvm/vmx/hyperv.h b/arch/x86/kvm/vmx/hyperv.h >> index 9401dbfaea7c..d4ed99008518 100644 >> --- a/arch/x86/kvm/vmx/hyperv.h >> +++ b/arch/x86/kvm/vmx/hyperv.h >> @@ -2,170 +2,9 @@ >> #ifndef __KVM_X86_VMX_HYPERV_H >> #define __KVM_X86_VMX_HYPERV_H >> >> -#include <linux/jump_label.h> >> - >> -#include <asm/hyperv-tlfs.h> >> -#include <asm/mshyperv.h> >> -#include <asm/vmx.h> >> - >> -#include "../hyperv.h" >> - >> -#include "capabilities.h" >> -#include "vmcs.h" >> +#include <linux/kvm_host.h> >> #include "vmcs12.h" >> >> -#define KVM_EVMCS_VERSION 1 >> - >> -/* >> - * Enlightened VMCSv1 doesn't support these: >> - * >> - * POSTED_INTR_NV = 0x00000002, >> - * GUEST_INTR_STATUS = 0x00000810, >> - * APIC_ACCESS_ADDR = 0x00002014, >> - * POSTED_INTR_DESC_ADDR = 0x00002016, >> - * EOI_EXIT_BITMAP0 = 0x0000201c, >> - * EOI_EXIT_BITMAP1 = 0x0000201e, >> - * EOI_EXIT_BITMAP2 = 0x00002020, >> - * EOI_EXIT_BITMAP3 = 0x00002022, >> - * GUEST_PML_INDEX = 0x00000812, >> - * PML_ADDRESS = 0x0000200e, >> - * VM_FUNCTION_CONTROL = 0x00002018, >> - * EPTP_LIST_ADDRESS = 0x00002024, >> - * VMREAD_BITMAP = 0x00002026, >> - * VMWRITE_BITMAP = 0x00002028, >> - * >> - * TSC_MULTIPLIER = 0x00002032, >> - * PLE_GAP = 0x00004020, >> - * PLE_WINDOW = 0x00004022, >> - * VMX_PREEMPTION_TIMER_VALUE = 0x0000482E, >> - * >> - * Currently unsupported in KVM: >> - * GUEST_IA32_RTIT_CTL = 0x00002814, >> - */ >> -#define EVMCS1_SUPPORTED_PINCTRL \ >> - (PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ >> - PIN_BASED_EXT_INTR_MASK | \ >> - PIN_BASED_NMI_EXITING | \ >> - PIN_BASED_VIRTUAL_NMIS) >> - >> -#define EVMCS1_SUPPORTED_EXEC_CTRL \ >> - (CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ >> - CPU_BASED_HLT_EXITING | \ >> - CPU_BASED_CR3_LOAD_EXITING | \ >> - CPU_BASED_CR3_STORE_EXITING | \ >> - CPU_BASED_UNCOND_IO_EXITING | \ >> - CPU_BASED_MOV_DR_EXITING | \ >> - CPU_BASED_USE_TSC_OFFSETTING | \ >> - CPU_BASED_MWAIT_EXITING | \ >> - CPU_BASED_MONITOR_EXITING | \ >> - CPU_BASED_INVLPG_EXITING | \ >> - CPU_BASED_RDPMC_EXITING | \ >> - CPU_BASED_INTR_WINDOW_EXITING | \ >> - CPU_BASED_CR8_LOAD_EXITING | \ >> - CPU_BASED_CR8_STORE_EXITING | \ >> - CPU_BASED_RDTSC_EXITING | \ >> - CPU_BASED_TPR_SHADOW | \ >> - CPU_BASED_USE_IO_BITMAPS | \ >> - CPU_BASED_MONITOR_TRAP_FLAG | \ >> - CPU_BASED_USE_MSR_BITMAPS | \ >> - CPU_BASED_NMI_WINDOW_EXITING | \ >> - CPU_BASED_PAUSE_EXITING | \ >> - CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) >> - >> -#define EVMCS1_SUPPORTED_2NDEXEC \ >> - (SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | \ >> - SECONDARY_EXEC_WBINVD_EXITING | \ >> - SECONDARY_EXEC_ENABLE_VPID | \ >> - SECONDARY_EXEC_ENABLE_EPT | \ >> - SECONDARY_EXEC_UNRESTRICTED_GUEST | \ >> - SECONDARY_EXEC_DESC | \ >> - SECONDARY_EXEC_ENABLE_RDTSCP | \ >> - SECONDARY_EXEC_ENABLE_INVPCID | \ >> - SECONDARY_EXEC_ENABLE_XSAVES | \ >> - SECONDARY_EXEC_RDSEED_EXITING | \ >> - SECONDARY_EXEC_RDRAND_EXITING | \ >> - SECONDARY_EXEC_TSC_SCALING | \ >> - SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | \ >> - SECONDARY_EXEC_PT_USE_GPA | \ >> - SECONDARY_EXEC_PT_CONCEAL_VMX | \ >> - SECONDARY_EXEC_BUS_LOCK_DETECTION | \ >> - SECONDARY_EXEC_NOTIFY_VM_EXITING | \ >> - SECONDARY_EXEC_ENCLS_EXITING) >> - >> -#define EVMCS1_SUPPORTED_3RDEXEC (0ULL) >> - >> -#define EVMCS1_SUPPORTED_VMEXIT_CTRL \ >> - (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | \ >> - VM_EXIT_SAVE_DEBUG_CONTROLS | \ >> - VM_EXIT_ACK_INTR_ON_EXIT | \ >> - VM_EXIT_HOST_ADDR_SPACE_SIZE | \ >> - VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | \ >> - VM_EXIT_SAVE_IA32_PAT | \ >> - VM_EXIT_LOAD_IA32_PAT | \ >> - VM_EXIT_SAVE_IA32_EFER | \ >> - VM_EXIT_LOAD_IA32_EFER | \ >> - VM_EXIT_CLEAR_BNDCFGS | \ >> - VM_EXIT_PT_CONCEAL_PIP | \ >> - VM_EXIT_CLEAR_IA32_RTIT_CTL) >> - >> -#define EVMCS1_SUPPORTED_VMENTRY_CTRL \ >> - (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | \ >> - VM_ENTRY_LOAD_DEBUG_CONTROLS | \ >> - VM_ENTRY_IA32E_MODE | \ >> - VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | \ >> - VM_ENTRY_LOAD_IA32_PAT | \ >> - VM_ENTRY_LOAD_IA32_EFER | \ >> - VM_ENTRY_LOAD_BNDCFGS | \ >> - VM_ENTRY_PT_CONCEAL_PIP | \ >> - VM_ENTRY_LOAD_IA32_RTIT_CTL) >> - >> -#define EVMCS1_SUPPORTED_VMFUNC (0) >> - >> -struct evmcs_field { >> - u16 offset; >> - u16 clean_field; >> -}; >> - >> -extern const struct evmcs_field vmcs_field_to_evmcs_1[]; >> -extern const unsigned int nr_evmcs_1_fields; >> - >> -static __always_inline int evmcs_field_offset(unsigned long field, >> - u16 *clean_field) >> -{ >> - unsigned int index = ROL16(field, 6); >> - const struct evmcs_field *evmcs_field; >> - >> - if (unlikely(index >= nr_evmcs_1_fields)) >> - return -ENOENT; >> - >> - evmcs_field = &vmcs_field_to_evmcs_1[index]; >> - >> - /* >> - * Use offset=0 to detect holes in eVMCS. This offset belongs to >> - * 'revision_id' but this field has no encoding and is supposed to >> - * be accessed directly. >> - */ >> - if (unlikely(!evmcs_field->offset)) >> - return -ENOENT; >> - >> - if (clean_field) >> - *clean_field = evmcs_field->clean_field; >> - >> - return evmcs_field->offset; >> -} >> - >> -static inline u64 evmcs_read_any(struct hv_enlightened_vmcs *evmcs, >> - unsigned long field, u16 offset) >> -{ >> - /* >> - * vmcs12_read_any() doesn't care whether the supplied structure >> - * is 'struct vmcs12' or 'struct hv_enlightened_vmcs' as it takes >> - * the exact offset of the required field, use it for convenience >> - * here. >> - */ >> - return vmcs12_read_any((void *)evmcs, field, offset); >> -} >> - >> #define EVMPTR_INVALID (-1ULL) >> #define EVMPTR_MAP_PENDING (-2ULL) >> >> diff --git a/arch/x86/kvm/vmx/hyperv_evmcs.c b/arch/x86/kvm/vmx/hyperv_evmcs.c >> new file mode 100644 >> index 000000000000..57a2e0470ac8 >> --- /dev/null >> +++ b/arch/x86/kvm/vmx/hyperv_evmcs.c >> @@ -0,0 +1,311 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> + >> +#include "hyperv_evmcs.h" >> + >> +#define EVMCS1_OFFSET(x) offsetof(struct hv_enlightened_vmcs, x) >> +#define EVMCS1_FIELD(number, name, clean_field)[ROL16(number, 6)] = \ >> + {EVMCS1_OFFSET(name), clean_field} >> + >> +const struct evmcs_field vmcs_field_to_evmcs_1[] = { >> + /* 64 bit rw */ >> + EVMCS1_FIELD(GUEST_RIP, guest_rip, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(GUEST_RSP, guest_rsp, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> + EVMCS1_FIELD(GUEST_RFLAGS, guest_rflags, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> + EVMCS1_FIELD(HOST_IA32_PAT, host_ia32_pat, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_IA32_EFER, host_ia32_efer, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_IA32_PERF_GLOBAL_CTRL, host_ia32_perf_global_ctrl, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_CR0, host_cr0, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_CR3, host_cr3, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_CR4, host_cr4, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_IA32_SYSENTER_ESP, host_ia32_sysenter_esp, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_IA32_SYSENTER_EIP, host_ia32_sysenter_eip, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_RIP, host_rip, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(IO_BITMAP_A, io_bitmap_a, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), >> + EVMCS1_FIELD(IO_BITMAP_B, io_bitmap_b, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP), >> + EVMCS1_FIELD(MSR_BITMAP, msr_bitmap, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP), >> + EVMCS1_FIELD(GUEST_ES_BASE, guest_es_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_CS_BASE, guest_cs_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_SS_BASE, guest_ss_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_DS_BASE, guest_ds_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_FS_BASE, guest_fs_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_GS_BASE, guest_gs_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_LDTR_BASE, guest_ldtr_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_TR_BASE, guest_tr_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_GDTR_BASE, guest_gdtr_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_IDTR_BASE, guest_idtr_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(TSC_OFFSET, tsc_offset, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> + EVMCS1_FIELD(VIRTUAL_APIC_PAGE_ADDR, virtual_apic_page_addr, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> + EVMCS1_FIELD(VMCS_LINK_POINTER, vmcs_link_pointer, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_IA32_DEBUGCTL, guest_ia32_debugctl, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_IA32_PAT, guest_ia32_pat, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_IA32_EFER, guest_ia32_efer, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_IA32_PERF_GLOBAL_CTRL, guest_ia32_perf_global_ctrl, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_PDPTR0, guest_pdptr0, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_PDPTR1, guest_pdptr1, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_PDPTR2, guest_pdptr2, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_PDPTR3, guest_pdptr3, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_PENDING_DBG_EXCEPTIONS, guest_pending_dbg_exceptions, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_SYSENTER_ESP, guest_sysenter_esp, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_SYSENTER_EIP, guest_sysenter_eip, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(CR0_GUEST_HOST_MASK, cr0_guest_host_mask, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(CR4_GUEST_HOST_MASK, cr4_guest_host_mask, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(CR0_READ_SHADOW, cr0_read_shadow, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(CR4_READ_SHADOW, cr4_read_shadow, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(GUEST_CR0, guest_cr0, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(GUEST_CR3, guest_cr3, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(GUEST_CR4, guest_cr4, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(GUEST_DR7, guest_dr7, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR), >> + EVMCS1_FIELD(HOST_FS_BASE, host_fs_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> + EVMCS1_FIELD(HOST_GS_BASE, host_gs_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> + EVMCS1_FIELD(HOST_TR_BASE, host_tr_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> + EVMCS1_FIELD(HOST_GDTR_BASE, host_gdtr_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> + EVMCS1_FIELD(HOST_IDTR_BASE, host_idtr_base, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> + EVMCS1_FIELD(HOST_RSP, host_rsp, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER), >> + EVMCS1_FIELD(EPT_POINTER, ept_pointer, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), >> + EVMCS1_FIELD(GUEST_BNDCFGS, guest_bndcfgs, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(XSS_EXIT_BITMAP, xss_exit_bitmap, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> + EVMCS1_FIELD(ENCLS_EXITING_BITMAP, encls_exiting_bitmap, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> + EVMCS1_FIELD(TSC_MULTIPLIER, tsc_multiplier, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2), >> + /* >> + * Not used by KVM: >> + * >> + * EVMCS1_FIELD(0x00006828, guest_ia32_s_cet, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + * EVMCS1_FIELD(0x0000682A, guest_ssp, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> + * EVMCS1_FIELD(0x0000682C, guest_ia32_int_ssp_table_addr, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + * EVMCS1_FIELD(0x00002816, guest_ia32_lbr_ctl, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + * EVMCS1_FIELD(0x00006C18, host_ia32_s_cet, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + * EVMCS1_FIELD(0x00006C1A, host_ssp, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + * EVMCS1_FIELD(0x00006C1C, host_ia32_int_ssp_table_addr, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + */ >> + >> + /* 64 bit read only */ >> + EVMCS1_FIELD(GUEST_PHYSICAL_ADDRESS, guest_physical_address, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(EXIT_QUALIFICATION, exit_qualification, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + /* >> + * Not defined in KVM: >> + * >> + * EVMCS1_FIELD(0x00006402, exit_io_instruction_ecx, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> + * EVMCS1_FIELD(0x00006404, exit_io_instruction_esi, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> + * EVMCS1_FIELD(0x00006406, exit_io_instruction_esi, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> + * EVMCS1_FIELD(0x00006408, exit_io_instruction_eip, >> + * HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE); >> + */ >> + EVMCS1_FIELD(GUEST_LINEAR_ADDRESS, guest_linear_address, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + >> + /* >> + * No mask defined in the spec as Hyper-V doesn't currently support >> + * these. Future proof by resetting the whole clean field mask on >> + * access. >> + */ >> + EVMCS1_FIELD(VM_EXIT_MSR_STORE_ADDR, vm_exit_msr_store_addr, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + EVMCS1_FIELD(VM_EXIT_MSR_LOAD_ADDR, vm_exit_msr_load_addr, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_ADDR, vm_entry_msr_load_addr, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + >> + /* 32 bit rw */ >> + EVMCS1_FIELD(TPR_THRESHOLD, tpr_threshold, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(GUEST_INTERRUPTIBILITY_INFO, guest_interruptibility_info, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC), >> + EVMCS1_FIELD(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC), >> + EVMCS1_FIELD(EXCEPTION_BITMAP, exception_bitmap, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN), >> + EVMCS1_FIELD(VM_ENTRY_CONTROLS, vm_entry_controls, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY), >> + EVMCS1_FIELD(VM_ENTRY_INTR_INFO_FIELD, vm_entry_intr_info_field, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), >> + EVMCS1_FIELD(VM_ENTRY_EXCEPTION_ERROR_CODE, >> + vm_entry_exception_error_code, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), >> + EVMCS1_FIELD(VM_ENTRY_INSTRUCTION_LEN, vm_entry_instruction_len, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT), >> + EVMCS1_FIELD(HOST_IA32_SYSENTER_CS, host_ia32_sysenter_cs, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(PIN_BASED_VM_EXEC_CONTROL, pin_based_vm_exec_control, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), >> + EVMCS1_FIELD(VM_EXIT_CONTROLS, vm_exit_controls, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), >> + EVMCS1_FIELD(SECONDARY_VM_EXEC_CONTROL, secondary_vm_exec_control, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1), >> + EVMCS1_FIELD(GUEST_ES_LIMIT, guest_es_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_CS_LIMIT, guest_cs_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_SS_LIMIT, guest_ss_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_DS_LIMIT, guest_ds_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_FS_LIMIT, guest_fs_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_GS_LIMIT, guest_gs_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_LDTR_LIMIT, guest_ldtr_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_TR_LIMIT, guest_tr_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_GDTR_LIMIT, guest_gdtr_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_IDTR_LIMIT, guest_idtr_limit, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_ES_AR_BYTES, guest_es_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_CS_AR_BYTES, guest_cs_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_SS_AR_BYTES, guest_ss_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_DS_AR_BYTES, guest_ds_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_FS_AR_BYTES, guest_fs_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_GS_AR_BYTES, guest_gs_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_LDTR_AR_BYTES, guest_ldtr_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_TR_AR_BYTES, guest_tr_ar_bytes, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_ACTIVITY_STATE, guest_activity_state, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + EVMCS1_FIELD(GUEST_SYSENTER_CS, guest_sysenter_cs, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1), >> + >> + /* 32 bit read only */ >> + EVMCS1_FIELD(VM_INSTRUCTION_ERROR, vm_instruction_error, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(VM_EXIT_REASON, vm_exit_reason, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(VM_EXIT_INTR_INFO, vm_exit_intr_info, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(VM_EXIT_INTR_ERROR_CODE, vm_exit_intr_error_code, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(IDT_VECTORING_INFO_FIELD, idt_vectoring_info_field, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(IDT_VECTORING_ERROR_CODE, idt_vectoring_error_code, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(VM_EXIT_INSTRUCTION_LEN, vm_exit_instruction_len, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + EVMCS1_FIELD(VMX_INSTRUCTION_INFO, vmx_instruction_info, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE), >> + >> + /* No mask defined in the spec (not used) */ >> + EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MASK, page_fault_error_code_mask, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + EVMCS1_FIELD(PAGE_FAULT_ERROR_CODE_MATCH, page_fault_error_code_match, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + EVMCS1_FIELD(CR3_TARGET_COUNT, cr3_target_count, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + EVMCS1_FIELD(VM_EXIT_MSR_STORE_COUNT, vm_exit_msr_store_count, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + EVMCS1_FIELD(VM_EXIT_MSR_LOAD_COUNT, vm_exit_msr_load_count, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + EVMCS1_FIELD(VM_ENTRY_MSR_LOAD_COUNT, vm_entry_msr_load_count, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL), >> + >> + /* 16 bit rw */ >> + EVMCS1_FIELD(HOST_ES_SELECTOR, host_es_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_CS_SELECTOR, host_cs_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_SS_SELECTOR, host_ss_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_DS_SELECTOR, host_ds_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_FS_SELECTOR, host_fs_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_GS_SELECTOR, host_gs_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(HOST_TR_SELECTOR, host_tr_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1), >> + EVMCS1_FIELD(GUEST_ES_SELECTOR, guest_es_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_CS_SELECTOR, guest_cs_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_SS_SELECTOR, guest_ss_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_DS_SELECTOR, guest_ds_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_FS_SELECTOR, guest_fs_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_GS_SELECTOR, guest_gs_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_LDTR_SELECTOR, guest_ldtr_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(GUEST_TR_SELECTOR, guest_tr_selector, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2), >> + EVMCS1_FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id, >> + HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT), >> +}; >> +const unsigned int nr_evmcs_1_fields = ARRAY_SIZE(vmcs_field_to_evmcs_1); >> diff --git a/arch/x86/kvm/vmx/hyperv_evmcs.h b/arch/x86/kvm/vmx/hyperv_evmcs.h >> new file mode 100644 >> index 000000000000..11d96975e7cc >> --- /dev/null >> +++ b/arch/x86/kvm/vmx/hyperv_evmcs.h >> @@ -0,0 +1,162 @@ >> +/* SPDX-License-Identifier: GPL-2.0 */ >> +#ifndef __KVM_X86_VMX_HYPERV_EVMCS_H >> +#define __KVM_X86_VMX_HYPERV_EVMCS_H >> + >> +#include <asm/hyperv-tlfs.h> >> + >> +#include "capabilities.h" >> +#include "vmcs12.h" >> + >> +#define KVM_EVMCS_VERSION 1 >> + >> +/* >> + * Enlightened VMCSv1 doesn't support these: >> + * >> + * POSTED_INTR_NV = 0x00000002, >> + * GUEST_INTR_STATUS = 0x00000810, >> + * APIC_ACCESS_ADDR = 0x00002014, >> + * POSTED_INTR_DESC_ADDR = 0x00002016, >> + * EOI_EXIT_BITMAP0 = 0x0000201c, >> + * EOI_EXIT_BITMAP1 = 0x0000201e, >> + * EOI_EXIT_BITMAP2 = 0x00002020, >> + * EOI_EXIT_BITMAP3 = 0x00002022, >> + * GUEST_PML_INDEX = 0x00000812, >> + * PML_ADDRESS = 0x0000200e, >> + * VM_FUNCTION_CONTROL = 0x00002018, >> + * EPTP_LIST_ADDRESS = 0x00002024, >> + * VMREAD_BITMAP = 0x00002026, >> + * VMWRITE_BITMAP = 0x00002028, >> + * >> + * TSC_MULTIPLIER = 0x00002032, >> + * PLE_GAP = 0x00004020, >> + * PLE_WINDOW = 0x00004022, >> + * VMX_PREEMPTION_TIMER_VALUE = 0x0000482E, >> + * >> + * Currently unsupported in KVM: >> + * GUEST_IA32_RTIT_CTL = 0x00002814, >> + */ >> +#define EVMCS1_SUPPORTED_PINCTRL \ >> + (PIN_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ >> + PIN_BASED_EXT_INTR_MASK | \ >> + PIN_BASED_NMI_EXITING | \ >> + PIN_BASED_VIRTUAL_NMIS) >> + >> +#define EVMCS1_SUPPORTED_EXEC_CTRL \ >> + (CPU_BASED_ALWAYSON_WITHOUT_TRUE_MSR | \ >> + CPU_BASED_HLT_EXITING | \ >> + CPU_BASED_CR3_LOAD_EXITING | \ >> + CPU_BASED_CR3_STORE_EXITING | \ >> + CPU_BASED_UNCOND_IO_EXITING | \ >> + CPU_BASED_MOV_DR_EXITING | \ >> + CPU_BASED_USE_TSC_OFFSETTING | \ >> + CPU_BASED_MWAIT_EXITING | \ >> + CPU_BASED_MONITOR_EXITING | \ >> + CPU_BASED_INVLPG_EXITING | \ >> + CPU_BASED_RDPMC_EXITING | \ >> + CPU_BASED_INTR_WINDOW_EXITING | \ >> + CPU_BASED_CR8_LOAD_EXITING | \ >> + CPU_BASED_CR8_STORE_EXITING | \ >> + CPU_BASED_RDTSC_EXITING | \ >> + CPU_BASED_TPR_SHADOW | \ >> + CPU_BASED_USE_IO_BITMAPS | \ >> + CPU_BASED_MONITOR_TRAP_FLAG | \ >> + CPU_BASED_USE_MSR_BITMAPS | \ >> + CPU_BASED_NMI_WINDOW_EXITING | \ >> + CPU_BASED_PAUSE_EXITING | \ >> + CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) >> + >> +#define EVMCS1_SUPPORTED_2NDEXEC \ >> + (SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | \ >> + SECONDARY_EXEC_WBINVD_EXITING | \ >> + SECONDARY_EXEC_ENABLE_VPID | \ >> + SECONDARY_EXEC_ENABLE_EPT | \ >> + SECONDARY_EXEC_UNRESTRICTED_GUEST | \ >> + SECONDARY_EXEC_DESC | \ >> + SECONDARY_EXEC_ENABLE_RDTSCP | \ >> + SECONDARY_EXEC_ENABLE_INVPCID | \ >> + SECONDARY_EXEC_ENABLE_XSAVES | \ >> + SECONDARY_EXEC_RDSEED_EXITING | \ >> + SECONDARY_EXEC_RDRAND_EXITING | \ >> + SECONDARY_EXEC_TSC_SCALING | \ >> + SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE | \ >> + SECONDARY_EXEC_PT_USE_GPA | \ >> + SECONDARY_EXEC_PT_CONCEAL_VMX | \ >> + SECONDARY_EXEC_BUS_LOCK_DETECTION | \ >> + SECONDARY_EXEC_NOTIFY_VM_EXITING | \ >> + SECONDARY_EXEC_ENCLS_EXITING) >> + >> +#define EVMCS1_SUPPORTED_3RDEXEC (0ULL) >> + >> +#define EVMCS1_SUPPORTED_VMEXIT_CTRL \ >> + (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR | \ >> + VM_EXIT_SAVE_DEBUG_CONTROLS | \ >> + VM_EXIT_ACK_INTR_ON_EXIT | \ >> + VM_EXIT_HOST_ADDR_SPACE_SIZE | \ >> + VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | \ >> + VM_EXIT_SAVE_IA32_PAT | \ >> + VM_EXIT_LOAD_IA32_PAT | \ >> + VM_EXIT_SAVE_IA32_EFER | \ >> + VM_EXIT_LOAD_IA32_EFER | \ >> + VM_EXIT_CLEAR_BNDCFGS | \ >> + VM_EXIT_PT_CONCEAL_PIP | \ >> + VM_EXIT_CLEAR_IA32_RTIT_CTL) >> + >> +#define EVMCS1_SUPPORTED_VMENTRY_CTRL \ >> + (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | \ >> + VM_ENTRY_LOAD_DEBUG_CONTROLS | \ >> + VM_ENTRY_IA32E_MODE | \ >> + VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | \ >> + VM_ENTRY_LOAD_IA32_PAT | \ >> + VM_ENTRY_LOAD_IA32_EFER | \ >> + VM_ENTRY_LOAD_BNDCFGS | \ >> + VM_ENTRY_PT_CONCEAL_PIP | \ >> + VM_ENTRY_LOAD_IA32_RTIT_CTL) >> + >> +#define EVMCS1_SUPPORTED_VMFUNC (0) >> + >> +struct evmcs_field { >> + u16 offset; >> + u16 clean_field; >> +}; >> + >> +extern const struct evmcs_field vmcs_field_to_evmcs_1[]; >> +extern const unsigned int nr_evmcs_1_fields; >> + >> +static __always_inline int evmcs_field_offset(unsigned long field, >> + u16 *clean_field) >> +{ >> + unsigned int index = ROL16(field, 6); >> + const struct evmcs_field *evmcs_field; >> + >> + if (unlikely(index >= nr_evmcs_1_fields)) >> + return -ENOENT; >> + >> + evmcs_field = &vmcs_field_to_evmcs_1[index]; >> + >> + /* >> + * Use offset=0 to detect holes in eVMCS. This offset belongs to >> + * 'revision_id' but this field has no encoding and is supposed to >> + * be accessed directly. >> + */ >> + if (unlikely(!evmcs_field->offset)) >> + return -ENOENT; >> + >> + if (clean_field) >> + *clean_field = evmcs_field->clean_field; >> + >> + return evmcs_field->offset; >> +} >> + >> +static inline u64 evmcs_read_any(struct hv_enlightened_vmcs *evmcs, >> + unsigned long field, u16 offset) >> +{ >> + /* >> + * vmcs12_read_any() doesn't care whether the supplied structure >> + * is 'struct vmcs12' or 'struct hv_enlightened_vmcs' as it takes >> + * the exact offset of the required field, use it for convenience >> + * here. >> + */ >> + return vmcs12_read_any((void *)evmcs, field, offset); >> +} >> + >> +#endif /* __KVM_X86_VMX_HYPERV_H */ >> diff --git a/arch/x86/kvm/vmx/vmx_onhyperv.h b/arch/x86/kvm/vmx/vmx_onhyperv.h >> index 11541d272dbd..eb48153bfd73 100644 >> --- a/arch/x86/kvm/vmx/vmx_onhyperv.h >> +++ b/arch/x86/kvm/vmx/vmx_onhyperv.h >> @@ -4,11 +4,12 @@ >> #define __ARCH_X86_KVM_VMX_ONHYPERV_H__ >> >> #include <asm/hyperv-tlfs.h> >> +#include <asm/mshyperv.h> >> >> #include <linux/jump_label.h> >> >> #include "capabilities.h" >> -#include "hyperv.h" >> +#include "hyperv_evmcs.h" >> #include "vmcs12.h" >> >> #define current_evmcs ((struct hv_enlightened_vmcs *)this_cpu_read(current_vmcs)) > > > This patch fails the build because of vmx_has_valid_vmcs12() in nested.h which uses EVMPTR_INVALID. > > vmx/nested.h includes vmx/vmx.h which includes vmx_ops.h, it includes vmx_onhyperv.h which used to include hyperv.h but not anymore. > > We can either add hyperv.h to vmx/nested.h, or we can move the code in > vmx_has_valid_vmcs12 to hyperv_evmcs.h. That's weird as I'm pretty sure I've tested all 4 option states for CONFIG_KVM_HYPERV/CONFIG_HYPERV before sending this out but I'll retest. > > > Besides the build error, > Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> > > Best regards, > Maxim Levitsky > > > -- Vitaly ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-10-16 12:48 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-13 21:26 [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch} kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2023-10-14 14:50 kernel test robot
2023-10-10 16:02 [PATCH RFC 00/11] KVM: x86: Make Hyper-V emulation optional (AKA introduce CONFIG_KVM_HYPERV) Vitaly Kuznetsov
2023-10-10 16:02 ` [PATCH RFC 06/11] KVM: VMX: Split off hyperv_evmcs.{ch} Vitaly Kuznetsov
2023-10-12 19:40 ` Maxim Levitsky
2023-10-16 12:47 ` Vitaly Kuznetsov
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.