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:
Penny Zheng authored and Stefano Stabellini committed 2021-09-13 14:10:22 -07:00
1 parent 540a637c34
commit 4a9e73e6e5
4 files changed
+67

No files matched your search

+27
View File
@@ -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
+13
View File
@@ -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
+21
View File
@@ -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
+6
View File
@@ -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,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.