[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 06/11] VMX/altp2m: add code to support EPTP switching and #VE.
On 01/16/2015 09:50 AM, Tim Deegan wrote: > At 10:55 -0800 on 15 Jan (1421315724), Ed White wrote: >> On 01/15/2015 08:56 AM, Tim Deegan wrote: >>> Hi, >>> >>> At 13:26 -0800 on 09 Jan (1420806396), Ed White wrote: >>>> @@ -2551,6 +2640,17 @@ static void vmx_vmexit_ud_intercept(struct >>>> cpu_user_regs *regs) >>>> hvm_inject_hw_exception(TRAP_invalid_op, >>>> HVM_DELIVER_NO_ERROR_CODE); >>>> break; >>>> case X86EMUL_EXCEPTION: >>>> + /* check for a VMFUNC that should be emulated */ >>>> + if ( !cpu_has_vmx_vmfunc && altp2mhvm_active(current->domain) && >>>> + ctxt.insn_buf_bytes >= 3 && ctxt.insn_buf[0] == 0x0f && >>>> + ctxt.insn_buf[1] == 0x01 && ctxt.insn_buf[2] == 0xd4 && >>>> + regs->eax == 0 && >>>> + p2m_switch_vcpu_altp2m_by_id(current, (uint16_t)regs->ecx) ) >>>> + { >>>> + regs->eip += 3; >>>> + return; >>>> + } >>>> + >>> >>> I think Andrew already pointed out that this needs to be done by >>> adding VMFUNC to the emulator itself with a callback. Apart from >>> anything else that will DTRT with prefix bytes &c. >>> >>>> + if ( (uint16_t)idx != vcpu_altp2mhvm(v).p2midx ) >>>> + { >>>> + cpumask_clear_cpu(v->vcpu_id, >>>> p2m_get_altp2m(v)->dirty_cpumask); >>>> + vcpu_altp2mhvm(v).p2midx = (uint16_t)idx; >>>> + cpumask_set_cpu(v->vcpu_id, p2m_get_altp2m(v)->dirty_cpumask); >>> >>> This looks wrong -- you need to do a TLB flush before you can remove >>> this CPU from the dirty_cpumask. >>> >> >> No, the whole point of multiple EPTP's is that you can switch between them >> without a flush. The EPTP is part of the TLB tag, and you want that entry >> to stay in the TLB because you're probably going to switch back and use >> it again. > > That's actually what I was worried about... > >> If you tear the whole table down you need a flush, but I think the >> existing EPT code handles that. I only use the mask to make sure I >> don't tear down a table that is the current table for a vcpu. > > and this is why I was confused. The meaning of 'dirty_cpumask' in Xen > generally is 'all CPUs that might hold state derived from this', > i.e. all the CPUs you'd have to IPI if you wanted to be sure that a > mapping you removed from this table wasn't still cached. IOW, this > could be used to mask down flush IPIs when p2m updates happen to this > table. > > Looking at the code, the current (non-nested) HAP code uses the > _domain_'s dirty_cpumask for all flushes, so for altp2m this field is > not needed. > > I'm not comfortable with it being reused for something > almost-but-not-quite like the usual semantics, though. Can you please > use a simple counter for this instead? Will do. Since the mask is already there and not needed for anything else in the non-nested case, I thought it was useful in case there was a future need to know which vcpu's were using a given alt p2m, but there is no such need currently. Ed _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |