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
|
||||
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. */
|
||||
init_xenheap_pages(mfn_to_maddr(xenheap_mfn_start),
|
||||
mfn_to_maddr(xenheap_mfn_end));
|
||||
|
||||
init_staticmem_pages();
|
||||
}
|
||||
#else /* CONFIG_ARM_64 */
|
||||
static void __init setup_mm(void)
|
||||
@@ -789,6 +814,8 @@ static void __init setup_mm(void)
|
||||
|
||||
setup_frametable_mappings(ram_start, ram_end);
|
||||
max_page = PFN_DOWN(ram_end);
|
||||
|
||||
init_staticmem_pages();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -70,6 +70,19 @@ config MEM_ACCESS
|
||||
config NEEDS_LIBELF
|
||||
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"
|
||||
|
||||
config SPECULATIVE_HARDEN_ARRAY
|
||||
|
||||
@@ -2604,6 +2604,27 @@ struct domain *get_pg_owner(domid_t domid)
|
||||
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:
|
||||
* mode: C
|
||||
|
||||
@@ -85,6 +85,12 @@ bool scrub_free_pages(void);
|
||||
} while ( false )
|
||||
#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. */
|
||||
int map_pages_to_xen(
|
||||
unsigned long virt,
|
||||
|
||||