Message ID | 20211112075422.3821671-1-pbonzini@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: x86: move guest_pv_has out of user_access section | expand |
On Fri, 2021-11-12 at 02:54 -0500, Paolo Bonzini wrote: > When UBSAN is enabled, the code emitted for the call to guest_pv_has > includes a call to __ubsan_handle_load_invalid_value. objtool > complains that this call happens with UACCESS enabled; to avoid > the warning, pull the calls to user_access_begin into both arms > of the "if" statement, after the check for guest_pv_has. > > Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> > Cc: David Woodhouse <dwmw2@infradead.org> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Acked-by: David Woodhouse <dwmw@amazon.co.uk> Thanks. I found a bunch of those objtool warnings during my original experimentation and testing, but clearly missed that one. I'll turn on CONFIG_UBSAN.
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index dd7b8b465675..dc7eb5fddfd3 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3292,9 +3292,6 @@ static void record_steal_time(struct kvm_vcpu *vcpu) } st = (struct kvm_steal_time __user *)ghc->hva; - if (!user_access_begin(st, sizeof(*st))) - return; - /* * Doing a TLB flush here, on the guest's behalf, can avoid * expensive IPIs. @@ -3303,6 +3300,9 @@ static void record_steal_time(struct kvm_vcpu *vcpu) u8 st_preempted = 0; int err = -EFAULT; + if (!user_access_begin(st, sizeof(*st))) + return; + asm volatile("1: xchgb %0, %2\n" "xor %1, %1\n" "2:\n" @@ -3325,6 +3325,9 @@ static void record_steal_time(struct kvm_vcpu *vcpu) if (!user_access_begin(st, sizeof(*st))) goto dirty; } else { + if (!user_access_begin(st, sizeof(*st))) + return; + unsafe_put_user(0, &st->preempted, out); vcpu->arch.st.preempted = 0; }
When UBSAN is enabled, the code emitted for the call to guest_pv_has includes a call to __ubsan_handle_load_invalid_value. objtool complains that this call happens with UACCESS enabled; to avoid the warning, pull the calls to user_access_begin into both arms of the "if" statement, after the check for guest_pv_has. Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Cc: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- arch/x86/kvm/x86.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)