Shifting signed 32-bit value by 31 bits is undefined, so changing significant bit to unsigned. The UBSAN warning calltrace like below: UBSAN: shift-out-of-bounds in arch/x86/kvm/reverse_cpuid.h:101:11 left shift of 1 by 31 places cannot be represented in type 'int' Call Trace: <TASK> dump_stack_lvl+0x7d/0xa5 dump_stack+0x15/0x1b ubsan_epilogue+0xe/0x4e __ubsan_handle_shift_out_of_bounds+0x1e7/0x20c kvm_set_cpu_caps+0x15a/0x770 [kvm] hardware_setup+0xa6f/0xdfe [kvm_intel] kvm_arch_hardware_setup+0x100/0x1e80 [kvm] kvm_init+0xdb/0x560 [kvm] vmx_init+0x161/0x2b4 [kvm_intel] do_one_initcall+0x76/0x430 do_init_module+0x61/0x28a load_module+0x1f82/0x2e50 __do_sys_finit_module+0xf8/0x190 __x64_sys_finit_module+0x23/0x30 do_syscall_64+0x58/0x80 entry_SYSCALL_64_after_hwframe+0x63/0xcd </TASK> Fixes: a7c48c3f56db ("KVM: x86: Expand build-time assertion on reverse CPUID usage") Signed-off-by: Gaosheng Cui <cuigaosheng1@xxxxxxxxxx> --- arch/x86/kvm/reverse_cpuid.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/reverse_cpuid.h b/arch/x86/kvm/reverse_cpuid.h index a19d473d0184..ebd6b621d3b8 100644 --- a/arch/x86/kvm/reverse_cpuid.h +++ b/arch/x86/kvm/reverse_cpuid.h @@ -98,7 +98,7 @@ static __always_inline u32 __feature_bit(int x86_feature) x86_feature = __feature_translate(x86_feature); reverse_cpuid_check(x86_feature / 32); - return 1 << (x86_feature & 31); + return 1U << (x86_feature & 31); } #define feature_bit(name) __feature_bit(X86_FEATURE_##name) -- 2.25.1