mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: static memory initialization
This patch introduces static memory initialization, during system boot-up. The new function init_staticmem_pages is responsible for static memory initialization. Helper free_staticmem_pages is the equivalent of free_heap_pages, to free nr_mfns pages of static memory. This commit also introduces a new CONFIG_STATIC_MEMORY option to wrap all static-allocation-related code. Put asynchronously scrubbing pages of static memory in TODO list. Signed-off-by: Penny Zheng <penny.zheng@arm.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
540a637c34
commit
4a9e73e6e5
4 files changed
+67
No files matched your search
@@ -609,6 +609,29 @@ static void __init init_pdx(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Static memory initialization */
|
||||||
|
static void __init init_staticmem_pages(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_STATIC_MEMORY
|
||||||
|
unsigned int bank;
|
||||||
|
|
||||||
|
for ( bank = 0 ; bank < bootinfo.reserved_mem.nr_banks; bank++ )
|
||||||
|
{
|
||||||
|
if ( bootinfo.reserved_mem.bank[bank].xen_domain )
|
||||||
|
{
|
||||||
|
mfn_t bank_start = _mfn(PFN_UP(bootinfo.reserved_mem.bank[bank].start));
|
||||||
|
unsigned long bank_pages = PFN_DOWN(bootinfo.reserved_mem.bank[bank].size);
|
||||||
|
mfn_t bank_end = mfn_add(bank_start, bank_pages);
|
||||||
|
|
||||||
|
if ( mfn_x(bank_end) <= mfn_x(bank_start) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
free_staticmem_pages(mfn_to_page(bank_start), bank_pages, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARM_32
|
#ifdef CONFIG_ARM_32
|
||||||
static void __init setup_mm(void)
|
static void __init setup_mm(void)
|
||||||
{
|
{
|
||||||
@@ -736,6 +759,8 @@ static void __init setup_mm(void)
|
|||||||
/* Add xenheap memory that was not already added to the boot allocator. */
|
/* Add xenheap memory that was not already added to the boot allocator. */
|
||||||
init_xenheap_pages(mfn_to_maddr(xenheap_mfn_start),
|
init_xenheap_pages(mfn_to_maddr(xenheap_mfn_start),
|
||||||
mfn_to_maddr(xenheap_mfn_end));
|
mfn_to_maddr(xenheap_mfn_end));
|
||||||
|
|
||||||
|
init_staticmem_pages();
|
||||||
}
|
}
|
||||||
#else /* CONFIG_ARM_64 */
|
#else /* CONFIG_ARM_64 */
|
||||||
static void __init setup_mm(void)
|
static void __init setup_mm(void)
|
||||||
@@ -789,6 +814,8 @@ static void __init setup_mm(void)
|
|||||||
|
|
||||||
setup_frametable_mappings(ram_start, ram_end);
|
setup_frametable_mappings(ram_start, ram_end);
|
||||||
max_page = PFN_DOWN(ram_end);
|
max_page = PFN_DOWN(ram_end);
|
||||||
|
|
||||||
|
init_staticmem_pages();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,19 @@ config MEM_ACCESS
|
|||||||
config NEEDS_LIBELF
|
config NEEDS_LIBELF
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config STATIC_MEMORY
|
||||||
|
bool "Static Allocation Support (UNSUPPORTED)" if UNSUPPORTED
|
||||||
|
depends on ARM
|
||||||
|
help
|
||||||
|
Static Allocation refers to system or sub-system(domains) for
|
||||||
|
which memory areas are pre-defined by configuration using physical
|
||||||
|
address ranges.
|
||||||
|
|
||||||
|
When enabled, memory can be statically allocated to a domain using
|
||||||
|
the property "xen,static-mem" defined in the domain configuration.
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
||||||
menu "Speculative hardening"
|
menu "Speculative hardening"
|
||||||
|
|
||||||
config SPECULATIVE_HARDEN_ARRAY
|
config SPECULATIVE_HARDEN_ARRAY
|
||||||
|
|||||||
@@ -2604,6 +2604,27 @@ struct domain *get_pg_owner(domid_t domid)
|
|||||||
return pg_owner;
|
return pg_owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_STATIC_MEMORY
|
||||||
|
/* Equivalent of free_heap_pages to free nr_mfns pages of static memory. */
|
||||||
|
void __init free_staticmem_pages(struct page_info *pg, unsigned long nr_mfns,
|
||||||
|
bool need_scrub)
|
||||||
|
{
|
||||||
|
mfn_t mfn = page_to_mfn(pg);
|
||||||
|
unsigned long i;
|
||||||
|
|
||||||
|
for ( i = 0; i < nr_mfns; i++ )
|
||||||
|
{
|
||||||
|
mark_page_free(&pg[i], mfn_add(mfn, i));
|
||||||
|
|
||||||
|
if ( need_scrub )
|
||||||
|
{
|
||||||
|
/* TODO: asynchronous scrubbing for pages of static memory. */
|
||||||
|
scrub_one_page(pg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
* mode: C
|
* mode: C
|
||||||
|
|||||||
@@ -85,6 +85,12 @@ bool scrub_free_pages(void);
|
|||||||
} while ( false )
|
} while ( false )
|
||||||
#define FREE_XENHEAP_PAGE(p) FREE_XENHEAP_PAGES(p, 0)
|
#define FREE_XENHEAP_PAGE(p) FREE_XENHEAP_PAGES(p, 0)
|
||||||
|
|
||||||
|
#ifdef CONFIG_STATIC_MEMORY
|
||||||
|
/* These functions are for static memory */
|
||||||
|
void free_staticmem_pages(struct page_info *pg, unsigned long nr_mfns,
|
||||||
|
bool need_scrub);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Map machine page range in Xen virtual address space. */
|
/* Map machine page range in Xen virtual address space. */
|
||||||
int map_pages_to_xen(
|
int map_pages_to_xen(
|
||||||
unsigned long virt,
|
unsigned long virt,
|
||||||
|
|||||||