void __init native_pagetable_reserve(u64 start, u64 end)
{
+ if (start < PFN_PHYS(pgt_buf_start) || end > PFN_PHYS(pgt_buf_top))
+ panic("Invalid address range: [%#llx-%#llx] should be a subset of [%#llx-%#llx]\n",
+ start, end, (u64)PFN_PHYS(pgt_buf_start),
+ (u64)PFN_PHYS(pgt_buf_top));
memblock_reserve(start, end - start);
}
static __init void xen_mapping_pagetable_reserve(u64 start, u64 end)
{
+ u64 begin;
+
+ begin = PFN_PHYS(pgt_buf_start);
+
+ if (start < begin || end > PFN_PHYS(pgt_buf_top))
+ panic("Invalid address range: [%#llx-%#llx] should be a subset of [%#llx-%#llx]\n",
+ start, end, begin, (u64)PFN_PHYS(pgt_buf_top));
+
+ /* set RW the initial range */
+ if (start != begin)
+ pr_debug("xen: setting RW the range [%#llx-%#llx]\n",
+ begin, start);
+ while (begin < start) {
+ make_lowmem_page_readwrite(__va(begin));
+ begin += PAGE_SIZE;
+ }
+
/* reserve the range used */
native_pagetable_reserve(start, end);
/* set as RW the rest */
- printk(KERN_DEBUG "xen: setting RW the range %llx - %llx\n", end,
- PFN_PHYS(pgt_buf_top));
+ if (end != PFN_PHYS(pgt_buf_top))
+ pr_debug("xen: setting RW the range [%#llx-%#llx]\n",
+ end, (u64)PFN_PHYS(pgt_buf_top));
while (end < PFN_PHYS(pgt_buf_top)) {
make_lowmem_page_readwrite(__va(end));
end += PAGE_SIZE;