Skip to content

Commit

Permalink
KVM: x86: move guest_pv_has out of user_access section
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: David Woodhouse <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
bonzini committed Nov 12, 2021
1 parent f5396f2 commit 3e067fd
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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"
Expand All @@ -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;
}
Expand Down

0 comments on commit 3e067fd

Please sign in to comment.