FIRST_RESERVED_GDT_PAGE)] = gdt_l1e;
}
- d->arch.physaddr_bitsize =
- /* 2^n entries can be contained in guest's p2m mapping space */
- fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 3
- /* 2^n pages -> 2^(n+PAGE_SHIFT) bits */
- + PAGE_SHIFT;
+ domain_set_alloc_bitsize(d);
return 0;
#endif
}
-#if defined(__x86_64__)
- if ( is_pv_32on64_domain(d) )
- d->arch.physaddr_bitsize =
- /* 2^n entries can be contained in guest's p2m mapping space */
- fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 3
- /* 2^n pages -> 2^(n+PAGE_SHIFT) bits */
- + PAGE_SHIFT;
-#endif
+ domain_set_alloc_bitsize(d);
/*
* Why do we need this? The number of page-table frames depends on the
if ( mpt_size > RDWR_COMPAT_MPT_VIRT_END - RDWR_COMPAT_MPT_VIRT_START )
mpt_size = RDWR_COMPAT_MPT_VIRT_END - RDWR_COMPAT_MPT_VIRT_START;
mpt_size &= ~((1UL << L2_PAGETABLE_SHIFT) - 1UL);
- if ( m2p_compat_vstart + mpt_size < MACH2PHYS_COMPAT_VIRT_END )
+ if ( (m2p_compat_vstart + mpt_size) < MACH2PHYS_COMPAT_VIRT_END )
m2p_compat_vstart = MACH2PHYS_COMPAT_VIRT_END - mpt_size;
for ( i = 0; i < (mpt_size >> L2_PAGETABLE_SHIFT); i++ )
{
return 0;
}
+void domain_set_alloc_bitsize(struct domain *d)
+{
+ if ( !is_pv_32on64_domain(d) ||
+ (MACH2PHYS_COMPAT_NR_ENTRIES(d) >= max_page) )
+ return;
+ d->arch.physaddr_bitsize =
+ /* 2^n entries can be contained in guest's p2m mapping space */
+ fls(MACH2PHYS_COMPAT_NR_ENTRIES(d)) - 1
+ /* 2^n pages -> 2^(n+PAGE_SHIFT) bits */
+ + PAGE_SHIFT;
+}
+
unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits)
{
- if ( (d == NULL) || !is_pv_32on64_domain(d) )
+ if ( (d == NULL) || (d->arch.physaddr_bitsize == 0) )
return bits;
return min(d->arch.physaddr_bitsize, bits);
}
int map_ldt_shadow_page(unsigned int);
#ifdef CONFIG_COMPAT
+void domain_set_alloc_bitsize(struct domain *d);
unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits);
#else
+# define domain_set_alloc_bitsize(d) ((void)0)
# define domain_clamp_alloc_bitsize(d, b) (b)
#endif