[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 22/25] x86/HVM: do actual CMPXCHG in hvmemul_cmpxchg()
On 05/02/18 08:32, Jan Beulich wrote: >>>> On 02.02.18 at 17:36, <andrew.cooper3@xxxxxxxxxx> wrote: >> On 07/12/17 14:16, Jan Beulich wrote: >>> --- a/xen/arch/x86/hvm/emulate.c >>> +++ b/xen/arch/x86/hvm/emulate.c >>> @@ -1296,8 +1296,83 @@ static int hvmemul_cmpxchg( >>> bool lock, >>> struct x86_emulate_ctxt *ctxt) >>> { >>> - /* Fix this in case the guest is really relying on r-m-w atomicity. */ >>> - return hvmemul_write(seg, offset, p_new, bytes, ctxt); >>> + struct hvm_emulate_ctxt *hvmemul_ctxt = >>> + container_of(ctxt, struct hvm_emulate_ctxt, ctxt); >>> + struct vcpu *curr = current; >>> + unsigned long addr, reps = 1; >>> + uint32_t pfec = PFEC_page_present | PFEC_write_access; >> I'm fairly certain from my pagetable work that passing PFEC_page_present >> here is bogus, and I do have (eventual) plans to make the pagewalk >> reject such values. > Both here and in the subsequent RMW patch I'm simply following > what hvmemul_write() does. I'd prefer all three to stay in sync. Fair enough. > >>> + case 16: >>> + if ( cpu_has_cx16 ) >>> + { >>> + __uint128_t *old = p_old, cur; >>> + >>> + if ( lock ) >>> + cur = __cmpxchg16b(mapping, old, p_new); >>> + else >>> + cur = cmpxchg16b_local_(mapping, old, p_new); >>> + if ( cur != *old ) >>> + { >>> + *old = cur; >>> + rc = X86EMUL_CMPXCHG_FAILED; >>> + } >>> + break; >>> + } >>> + /* fall through */ >>> + default: >> ASSERT_UNREACHABLE() ? >> >>> + rc = X86EMUL_UNHANDLEABLE; >>> + break; >>> + } > I'm not sure - from an abstract POV cpu_has_cx16 and the guest > seeing the feature available in its CPUID policy could differ. Granted > we're unlikely to want to try to emulate CMPXCHG16B without having > the instruction available ourselves, but it still wouldn't seem entirely > correct to assert here. I could remove the fall-through and _then_ > assert in the default case only. Let me know. The point was to catch bad sizes from being passed in. There is only a single ancient range of 64bit processors which don't have CX16, but I'd still argue that it would be a bug for the emulator to pass 16 down in such cases. > >>> --- a/xen/include/asm-x86/system.h >>> +++ b/xen/include/asm-x86/system.h >>> @@ -110,6 +110,38 @@ static always_inline unsigned long __cmp >>> return old; >>> } >>> >>> +static always_inline unsigned long cmpxchg_local_( >> unlocked_cmpxchg() ? > Not in line with our current naming scheme. Its rather more in line than introducing a local_ suffix. Trailing underscores are almost non-existant, and as far as I can tell, used exclusively in the internals of the compat code. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |