|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v3][PATCH 06/16] hvmloader: get guest memory map into memory_map[]
> From: Chen, Tiejun
> Sent: Thursday, June 11, 2015 9:15 AM
>
> Now we get this map layout by call XENMEM_memory_map then
> save them into one global variable memory_map[]. It should
> include lowmem range, rdm range and highmem range. Note
> rdm range and highmem range may not exist in some cases.
>
> And here we need to check if any reserved memory conflicts with
> [RESERVED_MEMORY_DYNAMIC_START - 1, RESERVED_MEMORY_DYNAMIC_END].
> This range is used to allocate memory in hvmloder level, and
> we would lead hvmloader failed in case of conflict since its
> another rare possibility in real world.
>
> Signed-off-by: Tiejun Chen <tiejun.chen@xxxxxxxxx>
> ---
> tools/firmware/hvmloader/e820.h | 7 +++++++
> tools/firmware/hvmloader/hvmloader.c | 37
> ++++++++++++++++++++++++++++++++++++
> tools/firmware/hvmloader/util.c | 26 +++++++++++++++++++++++++
> tools/firmware/hvmloader/util.h | 11 +++++++++++
> 4 files changed, 81 insertions(+)
>
> diff --git a/tools/firmware/hvmloader/e820.h b/tools/firmware/hvmloader/e820.h
> index b2ead7f..8b5a9e0 100644
> --- a/tools/firmware/hvmloader/e820.h
> +++ b/tools/firmware/hvmloader/e820.h
> @@ -15,6 +15,13 @@ struct e820entry {
> uint32_t type;
> } __attribute__((packed));
>
> +#define E820MAX 128
> +
> +struct e820map {
> + unsigned int nr_map;
> + struct e820entry map[E820MAX];
> +};
> +
> #endif /* __HVMLOADER_E820_H__ */
>
> /*
> diff --git a/tools/firmware/hvmloader/hvmloader.c
> b/tools/firmware/hvmloader/hvmloader.c
> index 25b7f08..c9f170e 100644
> --- a/tools/firmware/hvmloader/hvmloader.c
> +++ b/tools/firmware/hvmloader/hvmloader.c
> @@ -107,6 +107,8 @@ asm (
> " .text \n"
> );
>
> +struct e820map memory_map;
> +
> unsigned long scratch_start = SCRATCH_PHYSICAL_ADDRESS;
>
> static void init_hypercalls(void)
> @@ -199,6 +201,39 @@ static void apic_setup(void)
> ioapic_write(0x11, SET_APIC_ID(LAPIC_ID(0)));
> }
>
> +void memory_map_setup(void)
> +{
> + unsigned int nr_entries = E820MAX, i;
> + int rc;
> + uint64_t alloc_addr = RESERVED_MEMORY_DYNAMIC_START - 1;
> + uint64_t alloc_size = RESERVED_MEMORY_DYNAMIC_END - alloc_addr;
> +
> + rc = get_mem_mapping_layout(memory_map.map, &nr_entries);
> +
> + if ( rc )
> + {
> + printf("Failed to get guest memory map.\n");
> + BUG();
> + }
> +
> + BUG_ON(!nr_entries);
> + memory_map.nr_map = nr_entries;
> +
> + for ( i = 0; i < nr_entries; i++ )
> + {
> + if ( memory_map.map[i].type == E820_RESERVED )
> + {
> + if ( check_overlap(alloc_addr, alloc_size,
> + memory_map.map[i].addr,
> + memory_map.map[i].size) )
> + {
> + printf("RDM conflicts Memory allocation.\n");
hvmloader has no concept of RDM here. It's just E820_RESERVED
type. Please make the error message clear, e.g. "Fail to setup
memory map due to conflict on dynamic reserved memory range."
Otherwise:
Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |