From: kernel test robot <lkp@intel.com>
To: Like Xu <like.xu.linux@gmail.com>, Paolo Bonzini <pbonzini@redhat.com>
Cc: llvm@lists.linux.dev, kbuild-all@lists.01.org,
Tian Kevin <kevin.tian@intel.com>,
Jim Mattson <jmattson@google.com>,
Sean Christopherson <seanjc@google.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Wanpeng Li <wanpengli@tencent.com>,
Joerg Roedel <joro@8bytes.org>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] KVM: x86/cpuid: Exclude unpermitted xfeatures sizes at KVM_GET_SUPPORTED_CPUID
Date: Mon, 24 Jan 2022 22:40:49 +0800 [thread overview]
Message-ID: <202201242213.f6Bez3vZ-lkp@intel.com> (raw)
In-Reply-To: <20220124080251.60558-1-likexu@tencent.com>
Hi Like,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on kvm/queue]
[also build test WARNING on v5.17-rc1 next-20220124]
[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]
url: https://github.com/0day-ci/linux/commits/Like-Xu/KVM-x86-cpuid-Exclude-unpermitted-xfeatures-sizes-at-KVM_GET_SUPPORTED_CPUID/20220124-160452
base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue
config: x86_64-randconfig-a015-20220124 (https://download.01.org/0day-ci/archive/20220124/202201242213.f6Bez3vZ-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 2e58a18910867ba6795066e044293e6daf89edf5)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/b29c71ea177d9a2225208d501987598610261749
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Like-Xu/KVM-x86-cpuid-Exclude-unpermitted-xfeatures-sizes-at-KVM_GET_SUPPORTED_CPUID/20220124-160452
git checkout b29c71ea177d9a2225208d501987598610261749
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash arch/x86/kvm/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> arch/x86/kvm/cpuid.c:890:24: warning: variable 'supported_xcr0' is uninitialized when used within its own initialization [-Wuninitialized]
u64 supported_xcr0 = supported_xcr0 & xstate_get_guest_group_perm();
~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~
1 warning generated.
vim +/supported_xcr0 +890 arch/x86/kvm/cpuid.c
758
759 static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
760 {
761 struct kvm_cpuid_entry2 *entry;
762 int r, i, max_idx;
763
764 /* all calls to cpuid_count() should be made on the same cpu */
765 get_cpu();
766
767 r = -E2BIG;
768
769 entry = do_host_cpuid(array, function, 0);
770 if (!entry)
771 goto out;
772
773 switch (function) {
774 case 0:
775 /* Limited to the highest leaf implemented in KVM. */
776 entry->eax = min(entry->eax, 0x1fU);
777 break;
778 case 1:
779 cpuid_entry_override(entry, CPUID_1_EDX);
780 cpuid_entry_override(entry, CPUID_1_ECX);
781 break;
782 case 2:
783 /*
784 * On ancient CPUs, function 2 entries are STATEFUL. That is,
785 * CPUID(function=2, index=0) may return different results each
786 * time, with the least-significant byte in EAX enumerating the
787 * number of times software should do CPUID(2, 0).
788 *
789 * Modern CPUs, i.e. every CPU KVM has *ever* run on are less
790 * idiotic. Intel's SDM states that EAX & 0xff "will always
791 * return 01H. Software should ignore this value and not
792 * interpret it as an informational descriptor", while AMD's
793 * APM states that CPUID(2) is reserved.
794 *
795 * WARN if a frankenstein CPU that supports virtualization and
796 * a stateful CPUID.0x2 is encountered.
797 */
798 WARN_ON_ONCE((entry->eax & 0xff) > 1);
799 break;
800 /* functions 4 and 0x8000001d have additional index. */
801 case 4:
802 case 0x8000001d:
803 /*
804 * Read entries until the cache type in the previous entry is
805 * zero, i.e. indicates an invalid entry.
806 */
807 for (i = 1; entry->eax & 0x1f; ++i) {
808 entry = do_host_cpuid(array, function, i);
809 if (!entry)
810 goto out;
811 }
812 break;
813 case 6: /* Thermal management */
814 entry->eax = 0x4; /* allow ARAT */
815 entry->ebx = 0;
816 entry->ecx = 0;
817 entry->edx = 0;
818 break;
819 /* function 7 has additional index. */
820 case 7:
821 entry->eax = min(entry->eax, 1u);
822 cpuid_entry_override(entry, CPUID_7_0_EBX);
823 cpuid_entry_override(entry, CPUID_7_ECX);
824 cpuid_entry_override(entry, CPUID_7_EDX);
825
826 /* KVM only supports 0x7.0 and 0x7.1, capped above via min(). */
827 if (entry->eax == 1) {
828 entry = do_host_cpuid(array, function, 1);
829 if (!entry)
830 goto out;
831
832 cpuid_entry_override(entry, CPUID_7_1_EAX);
833 entry->ebx = 0;
834 entry->ecx = 0;
835 entry->edx = 0;
836 }
837 break;
838 case 9:
839 break;
840 case 0xa: { /* Architectural Performance Monitoring */
841 struct x86_pmu_capability cap;
842 union cpuid10_eax eax;
843 union cpuid10_edx edx;
844
845 perf_get_x86_pmu_capability(&cap);
846
847 /*
848 * The guest architecture pmu is only supported if the architecture
849 * pmu exists on the host and the module parameters allow it.
850 */
851 if (!cap.version || !enable_pmu)
852 memset(&cap, 0, sizeof(cap));
853
854 eax.split.version_id = min(cap.version, 2);
855 eax.split.num_counters = cap.num_counters_gp;
856 eax.split.bit_width = cap.bit_width_gp;
857 eax.split.mask_length = cap.events_mask_len;
858
859 edx.split.num_counters_fixed = min(cap.num_counters_fixed, MAX_FIXED_COUNTERS);
860 edx.split.bit_width_fixed = cap.bit_width_fixed;
861 if (cap.version)
862 edx.split.anythread_deprecated = 1;
863 edx.split.reserved1 = 0;
864 edx.split.reserved2 = 0;
865
866 entry->eax = eax.full;
867 entry->ebx = cap.events_mask;
868 entry->ecx = 0;
869 entry->edx = edx.full;
870 break;
871 }
872 /*
873 * Per Intel's SDM, the 0x1f is a superset of 0xb,
874 * thus they can be handled by common code.
875 */
876 case 0x1f:
877 case 0xb:
878 /*
879 * Populate entries until the level type (ECX[15:8]) of the
880 * previous entry is zero. Note, CPUID EAX.{0x1f,0xb}.0 is
881 * the starting entry, filled by the primary do_host_cpuid().
882 */
883 for (i = 1; entry->ecx & 0xff00; ++i) {
884 entry = do_host_cpuid(array, function, i);
885 if (!entry)
886 goto out;
887 }
888 break;
889 case 0xd: {
> 890 u64 supported_xcr0 = supported_xcr0 & xstate_get_guest_group_perm();
891
892 entry->eax &= supported_xcr0;
893 entry->ebx = xstate_required_size(supported_xcr0, false);
894 entry->ecx = entry->ebx;
895 entry->edx &= supported_xcr0 >> 32;
896 if (!supported_xcr0)
897 break;
898
899 entry = do_host_cpuid(array, function, 1);
900 if (!entry)
901 goto out;
902
903 cpuid_entry_override(entry, CPUID_D_1_EAX);
904 if (entry->eax & (F(XSAVES)|F(XSAVEC)))
905 entry->ebx = xstate_required_size(supported_xcr0 | supported_xss,
906 true);
907 else {
908 WARN_ON_ONCE(supported_xss != 0);
909 entry->ebx = 0;
910 }
911 entry->ecx &= supported_xss;
912 entry->edx &= supported_xss >> 32;
913
914 for (i = 2; i < 64; ++i) {
915 bool s_state;
916 if (supported_xcr0 & BIT_ULL(i))
917 s_state = false;
918 else if (supported_xss & BIT_ULL(i))
919 s_state = true;
920 else
921 continue;
922
923 entry = do_host_cpuid(array, function, i);
924 if (!entry)
925 goto out;
926
927 /*
928 * The supported check above should have filtered out
929 * invalid sub-leafs. Only valid sub-leafs should
930 * reach this point, and they should have a non-zero
931 * save state size. Furthermore, check whether the
932 * processor agrees with supported_xcr0/supported_xss
933 * on whether this is an XCR0- or IA32_XSS-managed area.
934 */
935 if (WARN_ON_ONCE(!entry->eax || (entry->ecx & 0x1) != s_state)) {
936 --array->nent;
937 continue;
938 }
939
940 if (!kvm_cpu_cap_has(X86_FEATURE_XFD))
941 entry->ecx &= ~BIT_ULL(2);
942 entry->edx = 0;
943 }
944 break;
945 }
946 case 0x12:
947 /* Intel SGX */
948 if (!kvm_cpu_cap_has(X86_FEATURE_SGX)) {
949 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
950 break;
951 }
952
953 /*
954 * Index 0: Sub-features, MISCSELECT (a.k.a extended features)
955 * and max enclave sizes. The SGX sub-features and MISCSELECT
956 * are restricted by kernel and KVM capabilities (like most
957 * feature flags), while enclave size is unrestricted.
958 */
959 cpuid_entry_override(entry, CPUID_12_EAX);
960 entry->ebx &= SGX_MISC_EXINFO;
961
962 entry = do_host_cpuid(array, function, 1);
963 if (!entry)
964 goto out;
965
966 /*
967 * Index 1: SECS.ATTRIBUTES. ATTRIBUTES are restricted a la
968 * feature flags. Advertise all supported flags, including
969 * privileged attributes that require explicit opt-in from
970 * userspace. ATTRIBUTES.XFRM is not adjusted as userspace is
971 * expected to derive it from supported XCR0.
972 */
973 entry->eax &= SGX_ATTR_DEBUG | SGX_ATTR_MODE64BIT |
974 SGX_ATTR_PROVISIONKEY | SGX_ATTR_EINITTOKENKEY |
975 SGX_ATTR_KSS;
976 entry->ebx &= 0;
977 break;
978 /* Intel PT */
979 case 0x14:
980 if (!kvm_cpu_cap_has(X86_FEATURE_INTEL_PT)) {
981 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
982 break;
983 }
984
985 for (i = 1, max_idx = entry->eax; i <= max_idx; ++i) {
986 if (!do_host_cpuid(array, function, i))
987 goto out;
988 }
989 break;
990 /* Intel AMX TILE */
991 case 0x1d:
992 if (!kvm_cpu_cap_has(X86_FEATURE_AMX_TILE)) {
993 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
994 break;
995 }
996
997 for (i = 1, max_idx = entry->eax; i <= max_idx; ++i) {
998 if (!do_host_cpuid(array, function, i))
999 goto out;
1000 }
1001 break;
1002 case 0x1e: /* TMUL information */
1003 if (!kvm_cpu_cap_has(X86_FEATURE_AMX_TILE)) {
1004 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1005 break;
1006 }
1007 break;
1008 case KVM_CPUID_SIGNATURE: {
1009 const u32 *sigptr = (const u32 *)KVM_SIGNATURE;
1010 entry->eax = KVM_CPUID_FEATURES;
1011 entry->ebx = sigptr[0];
1012 entry->ecx = sigptr[1];
1013 entry->edx = sigptr[2];
1014 break;
1015 }
1016 case KVM_CPUID_FEATURES:
1017 entry->eax = (1 << KVM_FEATURE_CLOCKSOURCE) |
1018 (1 << KVM_FEATURE_NOP_IO_DELAY) |
1019 (1 << KVM_FEATURE_CLOCKSOURCE2) |
1020 (1 << KVM_FEATURE_ASYNC_PF) |
1021 (1 << KVM_FEATURE_PV_EOI) |
1022 (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT) |
1023 (1 << KVM_FEATURE_PV_UNHALT) |
1024 (1 << KVM_FEATURE_PV_TLB_FLUSH) |
1025 (1 << KVM_FEATURE_ASYNC_PF_VMEXIT) |
1026 (1 << KVM_FEATURE_PV_SEND_IPI) |
1027 (1 << KVM_FEATURE_POLL_CONTROL) |
1028 (1 << KVM_FEATURE_PV_SCHED_YIELD) |
1029 (1 << KVM_FEATURE_ASYNC_PF_INT);
1030
1031 if (sched_info_on())
1032 entry->eax |= (1 << KVM_FEATURE_STEAL_TIME);
1033
1034 entry->ebx = 0;
1035 entry->ecx = 0;
1036 entry->edx = 0;
1037 break;
1038 case 0x80000000:
1039 entry->eax = min(entry->eax, 0x8000001f);
1040 break;
1041 case 0x80000001:
1042 cpuid_entry_override(entry, CPUID_8000_0001_EDX);
1043 cpuid_entry_override(entry, CPUID_8000_0001_ECX);
1044 break;
1045 case 0x80000006:
1046 /* L2 cache and TLB: pass through host info. */
1047 break;
1048 case 0x80000007: /* Advanced power management */
1049 /* invariant TSC is CPUID.80000007H:EDX[8] */
1050 entry->edx &= (1 << 8);
1051 /* mask against host */
1052 entry->edx &= boot_cpu_data.x86_power;
1053 entry->eax = entry->ebx = entry->ecx = 0;
1054 break;
1055 case 0x80000008: {
1056 unsigned g_phys_as = (entry->eax >> 16) & 0xff;
1057 unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U);
1058 unsigned phys_as = entry->eax & 0xff;
1059
1060 /*
1061 * If TDP (NPT) is disabled use the adjusted host MAXPHYADDR as
1062 * the guest operates in the same PA space as the host, i.e.
1063 * reductions in MAXPHYADDR for memory encryption affect shadow
1064 * paging, too.
1065 *
1066 * If TDP is enabled but an explicit guest MAXPHYADDR is not
1067 * provided, use the raw bare metal MAXPHYADDR as reductions to
1068 * the HPAs do not affect GPAs.
1069 */
1070 if (!tdp_enabled)
1071 g_phys_as = boot_cpu_data.x86_phys_bits;
1072 else if (!g_phys_as)
1073 g_phys_as = phys_as;
1074
1075 entry->eax = g_phys_as | (virt_as << 8);
1076 entry->edx = 0;
1077 cpuid_entry_override(entry, CPUID_8000_0008_EBX);
1078 break;
1079 }
1080 case 0x8000000A:
1081 if (!kvm_cpu_cap_has(X86_FEATURE_SVM)) {
1082 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1083 break;
1084 }
1085 entry->eax = 1; /* SVM revision 1 */
1086 entry->ebx = 8; /* Lets support 8 ASIDs in case we add proper
1087 ASID emulation to nested SVM */
1088 entry->ecx = 0; /* Reserved */
1089 cpuid_entry_override(entry, CPUID_8000_000A_EDX);
1090 break;
1091 case 0x80000019:
1092 entry->ecx = entry->edx = 0;
1093 break;
1094 case 0x8000001a:
1095 case 0x8000001e:
1096 break;
1097 case 0x8000001F:
1098 if (!kvm_cpu_cap_has(X86_FEATURE_SEV)) {
1099 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1100 } else {
1101 cpuid_entry_override(entry, CPUID_8000_001F_EAX);
1102
1103 /*
1104 * Enumerate '0' for "PA bits reduction", the adjusted
1105 * MAXPHYADDR is enumerated directly (see 0x80000008).
1106 */
1107 entry->ebx &= ~GENMASK(11, 6);
1108 }
1109 break;
1110 /*Add support for Centaur's CPUID instruction*/
1111 case 0xC0000000:
1112 /*Just support up to 0xC0000004 now*/
1113 entry->eax = min(entry->eax, 0xC0000004);
1114 break;
1115 case 0xC0000001:
1116 cpuid_entry_override(entry, CPUID_C000_0001_EDX);
1117 break;
1118 case 3: /* Processor serial number */
1119 case 5: /* MONITOR/MWAIT */
1120 case 0xC0000002:
1121 case 0xC0000003:
1122 case 0xC0000004:
1123 default:
1124 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1125 break;
1126 }
1127
1128 r = 0;
1129
1130 out:
1131 put_cpu();
1132
1133 return r;
1134 }
1135
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH] KVM: x86/cpuid: Exclude unpermitted xfeatures sizes at KVM_GET_SUPPORTED_CPUID
Date: Mon, 24 Jan 2022 22:40:49 +0800 [thread overview]
Message-ID: <202201242213.f6Bez3vZ-lkp@intel.com> (raw)
In-Reply-To: <20220124080251.60558-1-likexu@tencent.com>
[-- Attachment #1: Type: text/plain, Size: 15675 bytes --]
Hi Like,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on kvm/queue]
[also build test WARNING on v5.17-rc1 next-20220124]
[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]
url: https://github.com/0day-ci/linux/commits/Like-Xu/KVM-x86-cpuid-Exclude-unpermitted-xfeatures-sizes-at-KVM_GET_SUPPORTED_CPUID/20220124-160452
base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue
config: x86_64-randconfig-a015-20220124 (https://download.01.org/0day-ci/archive/20220124/202201242213.f6Bez3vZ-lkp(a)intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 2e58a18910867ba6795066e044293e6daf89edf5)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/b29c71ea177d9a2225208d501987598610261749
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Like-Xu/KVM-x86-cpuid-Exclude-unpermitted-xfeatures-sizes-at-KVM_GET_SUPPORTED_CPUID/20220124-160452
git checkout b29c71ea177d9a2225208d501987598610261749
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash arch/x86/kvm/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> arch/x86/kvm/cpuid.c:890:24: warning: variable 'supported_xcr0' is uninitialized when used within its own initialization [-Wuninitialized]
u64 supported_xcr0 = supported_xcr0 & xstate_get_guest_group_perm();
~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~
1 warning generated.
vim +/supported_xcr0 +890 arch/x86/kvm/cpuid.c
758
759 static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
760 {
761 struct kvm_cpuid_entry2 *entry;
762 int r, i, max_idx;
763
764 /* all calls to cpuid_count() should be made on the same cpu */
765 get_cpu();
766
767 r = -E2BIG;
768
769 entry = do_host_cpuid(array, function, 0);
770 if (!entry)
771 goto out;
772
773 switch (function) {
774 case 0:
775 /* Limited to the highest leaf implemented in KVM. */
776 entry->eax = min(entry->eax, 0x1fU);
777 break;
778 case 1:
779 cpuid_entry_override(entry, CPUID_1_EDX);
780 cpuid_entry_override(entry, CPUID_1_ECX);
781 break;
782 case 2:
783 /*
784 * On ancient CPUs, function 2 entries are STATEFUL. That is,
785 * CPUID(function=2, index=0) may return different results each
786 * time, with the least-significant byte in EAX enumerating the
787 * number of times software should do CPUID(2, 0).
788 *
789 * Modern CPUs, i.e. every CPU KVM has *ever* run on are less
790 * idiotic. Intel's SDM states that EAX & 0xff "will always
791 * return 01H. Software should ignore this value and not
792 * interpret it as an informational descriptor", while AMD's
793 * APM states that CPUID(2) is reserved.
794 *
795 * WARN if a frankenstein CPU that supports virtualization and
796 * a stateful CPUID.0x2 is encountered.
797 */
798 WARN_ON_ONCE((entry->eax & 0xff) > 1);
799 break;
800 /* functions 4 and 0x8000001d have additional index. */
801 case 4:
802 case 0x8000001d:
803 /*
804 * Read entries until the cache type in the previous entry is
805 * zero, i.e. indicates an invalid entry.
806 */
807 for (i = 1; entry->eax & 0x1f; ++i) {
808 entry = do_host_cpuid(array, function, i);
809 if (!entry)
810 goto out;
811 }
812 break;
813 case 6: /* Thermal management */
814 entry->eax = 0x4; /* allow ARAT */
815 entry->ebx = 0;
816 entry->ecx = 0;
817 entry->edx = 0;
818 break;
819 /* function 7 has additional index. */
820 case 7:
821 entry->eax = min(entry->eax, 1u);
822 cpuid_entry_override(entry, CPUID_7_0_EBX);
823 cpuid_entry_override(entry, CPUID_7_ECX);
824 cpuid_entry_override(entry, CPUID_7_EDX);
825
826 /* KVM only supports 0x7.0 and 0x7.1, capped above via min(). */
827 if (entry->eax == 1) {
828 entry = do_host_cpuid(array, function, 1);
829 if (!entry)
830 goto out;
831
832 cpuid_entry_override(entry, CPUID_7_1_EAX);
833 entry->ebx = 0;
834 entry->ecx = 0;
835 entry->edx = 0;
836 }
837 break;
838 case 9:
839 break;
840 case 0xa: { /* Architectural Performance Monitoring */
841 struct x86_pmu_capability cap;
842 union cpuid10_eax eax;
843 union cpuid10_edx edx;
844
845 perf_get_x86_pmu_capability(&cap);
846
847 /*
848 * The guest architecture pmu is only supported if the architecture
849 * pmu exists on the host and the module parameters allow it.
850 */
851 if (!cap.version || !enable_pmu)
852 memset(&cap, 0, sizeof(cap));
853
854 eax.split.version_id = min(cap.version, 2);
855 eax.split.num_counters = cap.num_counters_gp;
856 eax.split.bit_width = cap.bit_width_gp;
857 eax.split.mask_length = cap.events_mask_len;
858
859 edx.split.num_counters_fixed = min(cap.num_counters_fixed, MAX_FIXED_COUNTERS);
860 edx.split.bit_width_fixed = cap.bit_width_fixed;
861 if (cap.version)
862 edx.split.anythread_deprecated = 1;
863 edx.split.reserved1 = 0;
864 edx.split.reserved2 = 0;
865
866 entry->eax = eax.full;
867 entry->ebx = cap.events_mask;
868 entry->ecx = 0;
869 entry->edx = edx.full;
870 break;
871 }
872 /*
873 * Per Intel's SDM, the 0x1f is a superset of 0xb,
874 * thus they can be handled by common code.
875 */
876 case 0x1f:
877 case 0xb:
878 /*
879 * Populate entries until the level type (ECX[15:8]) of the
880 * previous entry is zero. Note, CPUID EAX.{0x1f,0xb}.0 is
881 * the starting entry, filled by the primary do_host_cpuid().
882 */
883 for (i = 1; entry->ecx & 0xff00; ++i) {
884 entry = do_host_cpuid(array, function, i);
885 if (!entry)
886 goto out;
887 }
888 break;
889 case 0xd: {
> 890 u64 supported_xcr0 = supported_xcr0 & xstate_get_guest_group_perm();
891
892 entry->eax &= supported_xcr0;
893 entry->ebx = xstate_required_size(supported_xcr0, false);
894 entry->ecx = entry->ebx;
895 entry->edx &= supported_xcr0 >> 32;
896 if (!supported_xcr0)
897 break;
898
899 entry = do_host_cpuid(array, function, 1);
900 if (!entry)
901 goto out;
902
903 cpuid_entry_override(entry, CPUID_D_1_EAX);
904 if (entry->eax & (F(XSAVES)|F(XSAVEC)))
905 entry->ebx = xstate_required_size(supported_xcr0 | supported_xss,
906 true);
907 else {
908 WARN_ON_ONCE(supported_xss != 0);
909 entry->ebx = 0;
910 }
911 entry->ecx &= supported_xss;
912 entry->edx &= supported_xss >> 32;
913
914 for (i = 2; i < 64; ++i) {
915 bool s_state;
916 if (supported_xcr0 & BIT_ULL(i))
917 s_state = false;
918 else if (supported_xss & BIT_ULL(i))
919 s_state = true;
920 else
921 continue;
922
923 entry = do_host_cpuid(array, function, i);
924 if (!entry)
925 goto out;
926
927 /*
928 * The supported check above should have filtered out
929 * invalid sub-leafs. Only valid sub-leafs should
930 * reach this point, and they should have a non-zero
931 * save state size. Furthermore, check whether the
932 * processor agrees with supported_xcr0/supported_xss
933 * on whether this is an XCR0- or IA32_XSS-managed area.
934 */
935 if (WARN_ON_ONCE(!entry->eax || (entry->ecx & 0x1) != s_state)) {
936 --array->nent;
937 continue;
938 }
939
940 if (!kvm_cpu_cap_has(X86_FEATURE_XFD))
941 entry->ecx &= ~BIT_ULL(2);
942 entry->edx = 0;
943 }
944 break;
945 }
946 case 0x12:
947 /* Intel SGX */
948 if (!kvm_cpu_cap_has(X86_FEATURE_SGX)) {
949 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
950 break;
951 }
952
953 /*
954 * Index 0: Sub-features, MISCSELECT (a.k.a extended features)
955 * and max enclave sizes. The SGX sub-features and MISCSELECT
956 * are restricted by kernel and KVM capabilities (like most
957 * feature flags), while enclave size is unrestricted.
958 */
959 cpuid_entry_override(entry, CPUID_12_EAX);
960 entry->ebx &= SGX_MISC_EXINFO;
961
962 entry = do_host_cpuid(array, function, 1);
963 if (!entry)
964 goto out;
965
966 /*
967 * Index 1: SECS.ATTRIBUTES. ATTRIBUTES are restricted a la
968 * feature flags. Advertise all supported flags, including
969 * privileged attributes that require explicit opt-in from
970 * userspace. ATTRIBUTES.XFRM is not adjusted as userspace is
971 * expected to derive it from supported XCR0.
972 */
973 entry->eax &= SGX_ATTR_DEBUG | SGX_ATTR_MODE64BIT |
974 SGX_ATTR_PROVISIONKEY | SGX_ATTR_EINITTOKENKEY |
975 SGX_ATTR_KSS;
976 entry->ebx &= 0;
977 break;
978 /* Intel PT */
979 case 0x14:
980 if (!kvm_cpu_cap_has(X86_FEATURE_INTEL_PT)) {
981 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
982 break;
983 }
984
985 for (i = 1, max_idx = entry->eax; i <= max_idx; ++i) {
986 if (!do_host_cpuid(array, function, i))
987 goto out;
988 }
989 break;
990 /* Intel AMX TILE */
991 case 0x1d:
992 if (!kvm_cpu_cap_has(X86_FEATURE_AMX_TILE)) {
993 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
994 break;
995 }
996
997 for (i = 1, max_idx = entry->eax; i <= max_idx; ++i) {
998 if (!do_host_cpuid(array, function, i))
999 goto out;
1000 }
1001 break;
1002 case 0x1e: /* TMUL information */
1003 if (!kvm_cpu_cap_has(X86_FEATURE_AMX_TILE)) {
1004 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1005 break;
1006 }
1007 break;
1008 case KVM_CPUID_SIGNATURE: {
1009 const u32 *sigptr = (const u32 *)KVM_SIGNATURE;
1010 entry->eax = KVM_CPUID_FEATURES;
1011 entry->ebx = sigptr[0];
1012 entry->ecx = sigptr[1];
1013 entry->edx = sigptr[2];
1014 break;
1015 }
1016 case KVM_CPUID_FEATURES:
1017 entry->eax = (1 << KVM_FEATURE_CLOCKSOURCE) |
1018 (1 << KVM_FEATURE_NOP_IO_DELAY) |
1019 (1 << KVM_FEATURE_CLOCKSOURCE2) |
1020 (1 << KVM_FEATURE_ASYNC_PF) |
1021 (1 << KVM_FEATURE_PV_EOI) |
1022 (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT) |
1023 (1 << KVM_FEATURE_PV_UNHALT) |
1024 (1 << KVM_FEATURE_PV_TLB_FLUSH) |
1025 (1 << KVM_FEATURE_ASYNC_PF_VMEXIT) |
1026 (1 << KVM_FEATURE_PV_SEND_IPI) |
1027 (1 << KVM_FEATURE_POLL_CONTROL) |
1028 (1 << KVM_FEATURE_PV_SCHED_YIELD) |
1029 (1 << KVM_FEATURE_ASYNC_PF_INT);
1030
1031 if (sched_info_on())
1032 entry->eax |= (1 << KVM_FEATURE_STEAL_TIME);
1033
1034 entry->ebx = 0;
1035 entry->ecx = 0;
1036 entry->edx = 0;
1037 break;
1038 case 0x80000000:
1039 entry->eax = min(entry->eax, 0x8000001f);
1040 break;
1041 case 0x80000001:
1042 cpuid_entry_override(entry, CPUID_8000_0001_EDX);
1043 cpuid_entry_override(entry, CPUID_8000_0001_ECX);
1044 break;
1045 case 0x80000006:
1046 /* L2 cache and TLB: pass through host info. */
1047 break;
1048 case 0x80000007: /* Advanced power management */
1049 /* invariant TSC is CPUID.80000007H:EDX[8] */
1050 entry->edx &= (1 << 8);
1051 /* mask against host */
1052 entry->edx &= boot_cpu_data.x86_power;
1053 entry->eax = entry->ebx = entry->ecx = 0;
1054 break;
1055 case 0x80000008: {
1056 unsigned g_phys_as = (entry->eax >> 16) & 0xff;
1057 unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U);
1058 unsigned phys_as = entry->eax & 0xff;
1059
1060 /*
1061 * If TDP (NPT) is disabled use the adjusted host MAXPHYADDR as
1062 * the guest operates in the same PA space as the host, i.e.
1063 * reductions in MAXPHYADDR for memory encryption affect shadow
1064 * paging, too.
1065 *
1066 * If TDP is enabled but an explicit guest MAXPHYADDR is not
1067 * provided, use the raw bare metal MAXPHYADDR as reductions to
1068 * the HPAs do not affect GPAs.
1069 */
1070 if (!tdp_enabled)
1071 g_phys_as = boot_cpu_data.x86_phys_bits;
1072 else if (!g_phys_as)
1073 g_phys_as = phys_as;
1074
1075 entry->eax = g_phys_as | (virt_as << 8);
1076 entry->edx = 0;
1077 cpuid_entry_override(entry, CPUID_8000_0008_EBX);
1078 break;
1079 }
1080 case 0x8000000A:
1081 if (!kvm_cpu_cap_has(X86_FEATURE_SVM)) {
1082 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1083 break;
1084 }
1085 entry->eax = 1; /* SVM revision 1 */
1086 entry->ebx = 8; /* Lets support 8 ASIDs in case we add proper
1087 ASID emulation to nested SVM */
1088 entry->ecx = 0; /* Reserved */
1089 cpuid_entry_override(entry, CPUID_8000_000A_EDX);
1090 break;
1091 case 0x80000019:
1092 entry->ecx = entry->edx = 0;
1093 break;
1094 case 0x8000001a:
1095 case 0x8000001e:
1096 break;
1097 case 0x8000001F:
1098 if (!kvm_cpu_cap_has(X86_FEATURE_SEV)) {
1099 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1100 } else {
1101 cpuid_entry_override(entry, CPUID_8000_001F_EAX);
1102
1103 /*
1104 * Enumerate '0' for "PA bits reduction", the adjusted
1105 * MAXPHYADDR is enumerated directly (see 0x80000008).
1106 */
1107 entry->ebx &= ~GENMASK(11, 6);
1108 }
1109 break;
1110 /*Add support for Centaur's CPUID instruction*/
1111 case 0xC0000000:
1112 /*Just support up to 0xC0000004 now*/
1113 entry->eax = min(entry->eax, 0xC0000004);
1114 break;
1115 case 0xC0000001:
1116 cpuid_entry_override(entry, CPUID_C000_0001_EDX);
1117 break;
1118 case 3: /* Processor serial number */
1119 case 5: /* MONITOR/MWAIT */
1120 case 0xC0000002:
1121 case 0xC0000003:
1122 case 0xC0000004:
1123 default:
1124 entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
1125 break;
1126 }
1127
1128 r = 0;
1129
1130 out:
1131 put_cpu();
1132
1133 return r;
1134 }
1135
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
next prev parent reply other threads:[~2022-01-24 14:41 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-24 8:02 [PATCH] KVM: x86/cpuid: Exclude unpermitted xfeatures sizes at KVM_GET_SUPPORTED_CPUID Like Xu
2022-01-24 14:00 ` Paolo Bonzini
2022-01-25 1:26 ` Tian, Kevin
2022-01-24 14:40 ` kernel test robot [this message]
2022-01-24 14:40 ` kernel test robot
2022-01-25 3:48 ` kernel test robot
2022-01-25 3:48 ` kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202201242213.f6Bez3vZ-lkp@intel.com \
--to=lkp@intel.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kbuild-all@lists.01.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=like.xu.linux@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.