The specification [1] defines a type so we should use it, rather than just OR-ing and AND-ing magic bits.
No functional change. NOTE: The type defined in the specification does include an anonymous sub-struct in the page type but, as we currently use only the first element, the struct declaration has been omitted. [1] https://github.com/MicrosoftDocs/Virtualization-Documentation/raw/live/tlfs/Hypervisor%20Top%20Level%20Functional%20Specification%20v5.0C.pdf Signed-off-by: Paul Durrant <paul.durr...@citrix.com> --- Cc: Jan Beulich <jbeul...@suse.com> Cc: Andrew Cooper <andrew.coop...@citrix.com> Cc: Wei Liu <wei.l...@citrix.com> --- xen/arch/x86/hvm/viridian/synic.c | 52 +++++++++++++++++++++++--------------- xen/include/asm-x86/hvm/viridian.h | 2 +- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/xen/arch/x86/hvm/viridian/synic.c b/xen/arch/x86/hvm/viridian/synic.c index e01ac941ea..5500d44186 100644 --- a/xen/arch/x86/hvm/viridian/synic.c +++ b/xen/arch/x86/hvm/viridian/synic.c @@ -14,6 +14,18 @@ #include <asm/apic.h> #include <asm/hvm/support.h> +typedef struct _HV_VIRTUAL_APIC_ASSIST +{ + uint32_t no_eoi:1; + uint32_t reserved_zero:31; +} HV_VIRTUAL_APIC_ASSIST; + +typedef union _HV_VP_ASSIST_PAGE +{ + HV_VIRTUAL_APIC_ASSIST ApicAssist; + uint8_t ReservedZBytePadding[PAGE_SIZE]; +} HV_VP_ASSIST_PAGE; + static void dump_vp_assist(const struct vcpu *v) { const union viridian_page_msr *va = &v->arch.hvm.viridian.vp_assist.msr; @@ -30,9 +42,9 @@ static void initialize_vp_assist(struct vcpu *v) struct domain *d = v->domain; unsigned long gmfn = v->arch.hvm.viridian.vp_assist.msr.fields.pfn; struct page_info *page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC); - void *va; + HV_VP_ASSIST_PAGE *ptr; - ASSERT(!v->arch.hvm.viridian.vp_assist.va); + ASSERT(!v->arch.hvm.viridian.vp_assist.ptr); if ( !page ) goto fail; @@ -43,16 +55,16 @@ static void initialize_vp_assist(struct vcpu *v) goto fail; } - va = __map_domain_page_global(page); - if ( !va ) + ptr = __map_domain_page_global(page); + if ( !ptr ) { put_page_and_type(page); goto fail; } - clear_page(va); + clear_page(ptr); - v->arch.hvm.viridian.vp_assist.va = va; + v->arch.hvm.viridian.vp_assist.ptr = ptr; return; fail: @@ -62,25 +74,25 @@ static void initialize_vp_assist(struct vcpu *v) static void teardown_vp_assist(struct vcpu *v) { - void *va = v->arch.hvm.viridian.vp_assist.va; + HV_VP_ASSIST_PAGE *ptr = v->arch.hvm.viridian.vp_assist.ptr; struct page_info *page; - if ( !va ) + if ( !ptr ) return; - v->arch.hvm.viridian.vp_assist.va = NULL; + v->arch.hvm.viridian.vp_assist.ptr = NULL; - page = mfn_to_page(domain_page_map_to_mfn(va)); + page = mfn_to_page(domain_page_map_to_mfn(ptr)); - unmap_domain_page_global(va); + unmap_domain_page_global(ptr); put_page_and_type(page); } void viridian_apic_assist_set(struct vcpu *v) { - uint32_t *va = v->arch.hvm.viridian.vp_assist.va; + HV_VP_ASSIST_PAGE *ptr = v->arch.hvm.viridian.vp_assist.ptr; - if ( !va ) + if ( !ptr ) return; /* @@ -92,18 +104,18 @@ void viridian_apic_assist_set(struct vcpu *v) domain_crash(v->domain); v->arch.hvm.viridian.vp_assist.pending = true; - *va |= 1u; + ptr->ApicAssist.no_eoi = 1; } bool viridian_apic_assist_completed(struct vcpu *v) { - uint32_t *va = v->arch.hvm.viridian.vp_assist.va; + HV_VP_ASSIST_PAGE *ptr = v->arch.hvm.viridian.vp_assist.ptr; - if ( !va ) + if ( !ptr ) return false; if ( v->arch.hvm.viridian.vp_assist.pending && - !(*va & 1u) ) + !ptr->ApicAssist.no_eoi ) { /* An EOI has been avoided */ v->arch.hvm.viridian.vp_assist.pending = false; @@ -115,12 +127,12 @@ bool viridian_apic_assist_completed(struct vcpu *v) void viridian_apic_assist_clear(struct vcpu *v) { - uint32_t *va = v->arch.hvm.viridian.vp_assist.va; + HV_VP_ASSIST_PAGE *ptr = v->arch.hvm.viridian.vp_assist.ptr; - if ( !va ) + if ( !ptr ) return; - *va &= ~1u; + ptr->ApicAssist.no_eoi = 0; v->arch.hvm.viridian.vp_assist.pending = false; } diff --git a/xen/include/asm-x86/hvm/viridian.h b/xen/include/asm-x86/hvm/viridian.h index 9a26f6bed0..11abf77198 100644 --- a/xen/include/asm-x86/hvm/viridian.h +++ b/xen/include/asm-x86/hvm/viridian.h @@ -92,7 +92,7 @@ struct viridian_vcpu { struct { union viridian_page_msr msr; - void *va; + void *ptr; bool pending; } vp_assist; uint64_t crash_param[5]; -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel