From: Wei Liu Date: Mon, 24 Apr 2017 12:05:19 +0000 (+0100) Subject: x86/domain: provide pv_{create,destroy}_gdt_ldt_l1tab and use them X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~2078 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ba61ebe1da452c5887c54b6fbd96e6ee116570c2;p=xen.git x86/domain: provide pv_{create,destroy}_gdt_ldt_l1tab and use them This patch encapsulates the perdomain creation and destruction into helper functions and use them where appropriate. Since destroy_perdomain_mapping is idempotent, it is safe to call the destruction function multiple times. Signed-off-by: Wei Liu Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index d9f3cfad29..f2847cf871 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -387,6 +387,20 @@ int switch_compat(struct domain *d) return rc; } +static int pv_create_gdt_ldt_l1tab(struct vcpu *v) +{ + return create_perdomain_mapping(v->domain, GDT_VIRT_START(v), + 1U << GDT_LDT_VCPU_SHIFT, + v->domain->arch.pv_domain.gdt_ldt_l1tab, + NULL); +} + +static void pv_destroy_gdt_ldt_l1tab(struct vcpu *v) +{ + destroy_perdomain_mapping(v->domain, GDT_VIRT_START(v), + 1U << GDT_LDT_VCPU_SHIFT); +} + int vcpu_initialise(struct vcpu *v) { struct domain *d = v->domain; @@ -423,9 +437,7 @@ int vcpu_initialise(struct vcpu *v) if ( !is_idle_domain(d) ) { - rc = create_perdomain_mapping(d, GDT_VIRT_START(v), - 1 << GDT_LDT_VCPU_SHIFT, - d->arch.pv_domain.gdt_ldt_l1tab, NULL); + rc = pv_create_gdt_ldt_l1tab(v); if ( rc ) goto done; @@ -435,6 +447,7 @@ int vcpu_initialise(struct vcpu *v) NR_VECTORS); if ( !v->arch.pv_vcpu.trap_ctxt ) { + pv_destroy_gdt_ldt_l1tab(v); rc = -ENOMEM; goto done; } @@ -464,7 +477,10 @@ int vcpu_initialise(struct vcpu *v) vcpu_destroy_fpu(v); if ( is_pv_domain(d) ) + { + pv_destroy_gdt_ldt_l1tab(v); xfree(v->arch.pv_vcpu.trap_ctxt); + } } else if ( !is_idle_domain(v->domain) ) vpmu_initialise(v); @@ -491,7 +507,10 @@ void vcpu_destroy(struct vcpu *v) if ( is_hvm_vcpu(v) ) hvm_vcpu_destroy(v); else + { + pv_destroy_gdt_ldt_l1tab(v); xfree(v->arch.pv_vcpu.trap_ctxt); + } } static bool emulation_flags_ok(const struct domain *d, uint32_t emflags)