return true;
}
+static void pv_domain_destroy(struct domain *d)
+{
+ destroy_perdomain_mapping(d, GDT_LDT_VIRT_START,
+ GDT_LDT_MBYTES << (20 - PAGE_SHIFT));
+
+ xfree(d->arch.pv_domain.cpuidmasks);
+ d->arch.pv_domain.cpuidmasks = NULL;
+
+ free_xenheap_page(d->arch.pv_domain.gdt_ldt_l1tab);
+ d->arch.pv_domain.gdt_ldt_l1tab = NULL;
+}
+
int arch_domain_create(struct domain *d, unsigned int domcr_flags,
struct xen_arch_domainconfig *config)
{
xfree(d->arch.cpuid);
if ( paging_initialised )
paging_final_teardown(d);
- free_perdomain_mappings(d);
if ( is_pv_domain(d) )
- {
- xfree(d->arch.pv_domain.cpuidmasks);
- free_xenheap_page(d->arch.pv_domain.gdt_ldt_l1tab);
- }
+ pv_domain_destroy(d);
+ free_perdomain_mappings(d);
+
return rc;
}
paging_final_teardown(d);
- free_perdomain_mappings(d);
if ( is_pv_domain(d) )
- {
- free_xenheap_page(d->arch.pv_domain.gdt_ldt_l1tab);
- xfree(d->arch.pv_domain.cpuidmasks);
- }
+ pv_domain_destroy(d);
+ free_perdomain_mappings(d);
free_xenheap_page(d->shared_info);
cleanup_domain_irq_mapping(d);