Messages in this thread | | | From | David Laight <> | Subject | RE: [PATCH] KVM: x86: handle wrap around 32-bit address space | Date | Thu, 30 Apr 2020 13:18:10 +0000 |
| |
From: Paolo Bonzini <pbonzini@redhat.com> > Sent: 30 April 2020 13:45 > On 29/04/20 10:56, David Laight wrote: > >>>> + if (unlikely(((rip ^ orig_rip) >> 31) == 3) && !is_64_bit_mode(vcpu)) > >> Isn't the more obvious: > >> if (((rip ^ orig_rip) & 1ull << 32) ... > >> equivalent? > > This one would not (it would also detect carry on high memory addresses, > not just 0x7fffffff to 0x80000000)...
So will the proposed one half the time. If (orig_rip & 1 << 32) is zero the high bits are all unchanged and cancel out.
> > Actually not even being clever, how about: > > if (orig_rip < (1ull << 32) && unlikely(rip >= (1ull << 32)) && ... > > ... but yes this one would be equivalent.
If sub 4G addresses are likely on 64bit you may want to do: if (unlikely((rip ^ orig_rip) & (1ull << 32)) && orig_rip < (1ull << 32)) && ... or unlikely((rip ^ orig_rip) >> 32)
I think you always want unlikely(a) && b rather than unlikely(a && b).
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
| |