[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 06/10] x86/SVM: Add AVIC vmexit handlers
> + > +static int avic_ldr_write(struct vcpu *v, u8 g_phy_id, u32 ldr, bool valid) > +{ > + struct avic_log_apic_id_ent *entry, new_entry; > + u32 *bp = avic_get_bk_page_entry(v, APIC_DFR); dfr would be a better name (and you use it in avic_handle_dfr_update()). Also, 'logical' instead of 'log' in avic_log_apic_id_ent would be far less confusing imo. > + > + if ( !bp ) > + return -EINVAL; > + > + entry = avic_get_logical_id_entry(v, ldr, (*bp == APIC_DFR_FLAT)); > + if (!entry) > + return -EINVAL; > + > + new_entry = *entry; > + smp_rmb(); > + new_entry.guest_phy_apic_id = g_phy_id; > + new_entry.valid = valid; > + *entry = new_entry; > + smp_wmb(); > + > + return 0; > +} > + > +static int avic_handle_apic_id_update(struct vcpu *v, bool init) > +{ > + struct avic_phy_apic_id_ent *old, *new; > + struct arch_svm_struct *s = &v->arch.hvm_svm; > + u32 *apic_id_reg = avic_get_bk_page_entry(v, APIC_ID); > + > + if ( !apic_id_reg ) > + return -EINVAL; > + > + old = s->avic_last_phy_id; > + ASSERT(old); > + > + new = avic_get_phy_apic_id_ent(v, GET_APIC_PHYSICAL_ID(*apic_id_reg)); > + if ( !new ) > + return 0; > + > + /* We need to move physical_id_entry to new offset */ > + *new = *old; > + *((u64 *)old) = 0ULL; This is pretty ugly. Can you define an invalid entry and assign it here instead? > + s->avic_last_phy_id = new; > + > + /* > + * Update the guest physical APIC ID in the logical > + * APIC ID table entry if LDR is already setup. > + */ > + if ( v->arch.hvm_svm.avic_last_ldr ) > + avic_handle_ldr_update(v); > + > + return 0; > +} > + > +static int avic_handle_dfr_update(struct vcpu *v) > +{ > + u32 mod; > + struct svm_domain *d = &v->domain->arch.hvm_domain.svm; > + u32 *dfr = avic_get_bk_page_entry(v, APIC_DFR); > + > + if ( !dfr ) > + return -EINVAL; > + > + mod = (*dfr >> 28) & 0xFu; > + > + spin_lock(&d->avic_ldr_mode_lock); > + if ( d->avic_ldr_mode != mod ) > + { > + /* > + * We assume that all local APICs are using the same type. > + * If LDR mode changes, we need to flush the domain AVIC logical > + * APIC id table. > + */ > + clear_domain_page(_mfn(d->avic_log_apic_id_table_mfn)); > + smp_wmb(); Is this needed? I think clear_page() guarantees visibility/ordering (we have SFENCE in clear_page_sse2() for this reason). -boris _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |