xen: Init memory regions for PVH
Add all usable memory regions to grub memory management and add the needed mmap iterate code, which will be used by grub core (e.g. grub-core/lib/relocator.c or grub-core/mmap/mmap.c). As we are running in 32-bit mode don't add memory above 4GB. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> Tested-by: Hans van Kranenburg <hans@knorrie.org>
This commit is contained in:
parent
4c9b4a7c92
commit
1d2473a024
1 changed files with 35 additions and 0 deletions
|
@ -241,6 +241,30 @@ grub_xen_set_mmap (void)
|
||||||
(grub_uint32_t) (&memmap), 0, 0, 0, 0);
|
(grub_uint32_t) (&memmap), 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_xen_mm_init_regions (void)
|
||||||
|
{
|
||||||
|
grub_uint64_t modend, from, to;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
modend = grub_modules_get_end ();
|
||||||
|
|
||||||
|
for (i = 0; i < nr_map_entries; i++)
|
||||||
|
{
|
||||||
|
if (map[i].type != GRUB_MEMORY_AVAILABLE)
|
||||||
|
continue;
|
||||||
|
from = map[i].addr;
|
||||||
|
to = from + map[i].len;
|
||||||
|
if (from < modend)
|
||||||
|
from = modend;
|
||||||
|
if (from >= to || from >= (1ULL << 32))
|
||||||
|
continue;
|
||||||
|
if (to > (1ULL << 32))
|
||||||
|
to = 1ULL << 32;
|
||||||
|
grub_mm_init_region ((void *) (grub_addr_t) from, to - from);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static grub_uint64_t
|
static grub_uint64_t
|
||||||
grub_xen_find_page (grub_uint64_t start)
|
grub_xen_find_page (grub_uint64_t start)
|
||||||
{
|
{
|
||||||
|
@ -325,10 +349,21 @@ grub_xen_setup_pvh (void)
|
||||||
(void *) par);
|
(void *) par);
|
||||||
grub_xen_set_mmap ();
|
grub_xen_set_mmap ();
|
||||||
|
|
||||||
|
grub_xen_mm_init_regions ();
|
||||||
|
|
||||||
grub_rsdp_addr = pvh_start_info->rsdp_paddr;
|
grub_rsdp_addr = pvh_start_info->rsdp_paddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
|
grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
|
||||||
{
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nr_map_entries; i++)
|
||||||
|
{
|
||||||
|
if (map[i].len && hook (map[i].addr, map[i].len, map[i].type, hook_data))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue