On Linux, the option CONFIG_ARM_PATCH_PHYS_VIRT (by default enabled) allows
the Kernel to be loaded anywhere (or nearly) by patching the translation
pv<->virt at boot time.
The current solution in Linux assuming that the delta physical address -
virtual address is always negative. A positive delta will destroy all the
optimisation to modify only a part of the translation instruction (add/sub).
By default, Xen is allocating memory from the top of memory and then
goes down. To avoid booting issue with Linux, we must allocate memory
from the bottom (ie starting from 0).
Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
int reg_size = dt_cells_to_size(dt_n_addr_cells(np) + dt_n_size_cells(np));
paddr_t start;
paddr_t size;
- struct page_info *pg;
+ struct page_info *pg = NULL;
unsigned int order = get_order_from_bytes(dom0_mem);
int res;
paddr_t spfn;
+ unsigned int bits;
+
+ for ( bits = PAGE_SHIFT + 1; bits < PADDR_BITS; bits++ )
+ {
+ pg = alloc_domheap_pages(d, order, MEMF_bits(bits));
+ if ( pg != NULL )
+ break;
+ }
- pg = alloc_domheap_pages(d, order, 0);
if ( !pg )
panic("Failed to allocate contiguous memory for dom0\n");