xen/arm: mm: Allow page-table allocation from the boot allocator

At the moment, page-table can only be allocated from domheap. This means
it is not possible to create mapping in the page-tables via
map_pages_to_xen() if page-table needs to be allocated.

In order to avoid open-coding page-tables update in early boot, we need
to be able to allocate page-tables much earlier. Thankfully, we have the
boot allocator for those cases.

create_xen_table() is updated to cater early boot allocation by using
alloc_boot_pages().

Note, this is not sufficient to bootstrap the page-tables (i.e mapping
before any memory is actually mapped). This will be addressed
separately.

Signed-off-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
Julien Grall authored and Julien Grall committed 2022-06-08 11:04:53 +01:00
1 parent 922936dc06
commit 77f00c2f02
1 file changed
+14 -6
+14 -6
View File
@@ -1030,19 +1030,27 @@ static void xen_unmap_table(const lpae_t *table)
static int create_xen_table(lpae_t *entry)
{
struct page_info *pg;
mfn_t mfn;
void *p;
lpae_t pte;
pg = alloc_domheap_page(NULL, 0);
if ( pg == NULL )
return -ENOMEM;
if ( system_state != SYS_STATE_early_boot )
{
struct page_info *pg = alloc_domheap_page(NULL, 0);
p = xen_map_table(page_to_mfn(pg));
if ( pg == NULL )
return -ENOMEM;
mfn = page_to_mfn(pg);
}
else
mfn = alloc_boot_pages(1, 1);
p = xen_map_table(mfn);
clear_page(p);
xen_unmap_table(p);
pte = mfn_to_xen_entry(page_to_mfn(pg), MT_NORMAL);
pte = mfn_to_xen_entry(mfn, MT_NORMAL);
pte.pt.table = 1;
write_pte(entry, pte);
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.