mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86: Fix paging_init() to not overwrite existing page-directory entry
for fixmap area. Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
b7d20cfb9d
commit
8356257742
2 files changed
+13
-10
No files matched your search
@@ -68,7 +68,6 @@ l2_pgentry_t *virt_to_xen_l2e(unsigned long v)
|
||||
|
||||
void __init paging_init(void)
|
||||
{
|
||||
void *ioremap_pt;
|
||||
unsigned long v;
|
||||
struct page_info *pg;
|
||||
int i;
|
||||
@@ -115,13 +114,17 @@ void __init paging_init(void)
|
||||
for ( i = 0; i < (mpt_size / BYTES_PER_LONG); i++)
|
||||
set_gpfn_from_mfn(i, 0x55555555);
|
||||
|
||||
/* Create page tables for ioremap(). */
|
||||
/* Create page tables for ioremap()/map_domain_page_global(). */
|
||||
for ( i = 0; i < (IOREMAP_MBYTES >> (L2_PAGETABLE_SHIFT - 20)); i++ )
|
||||
{
|
||||
ioremap_pt = alloc_xenheap_page();
|
||||
clear_page(ioremap_pt);
|
||||
l2e_write(&idle_pg_table_l2[l2_linear_offset(IOREMAP_VIRT_START) + i],
|
||||
l2e_from_page(virt_to_page(ioremap_pt), __PAGE_HYPERVISOR));
|
||||
void *p;
|
||||
l2_pgentry_t *pl2e;
|
||||
pl2e = &idle_pg_table_l2[l2_linear_offset(IOREMAP_VIRT_START) + i];
|
||||
if ( l2e_get_flags(*pl2e) & _PAGE_PRESENT )
|
||||
continue;
|
||||
p = alloc_xenheap_page();
|
||||
clear_page(p);
|
||||
l2e_write(pl2e, l2e_from_page(virt_to_page(p), __PAGE_HYPERVISOR));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -100,15 +100,15 @@ void __init paging_init(void)
|
||||
unsigned long i, mpt_size, va;
|
||||
l3_pgentry_t *l3_ro_mpt;
|
||||
l2_pgentry_t *l2_ro_mpt = NULL;
|
||||
struct page_info *l1_pg, *l2_pg;
|
||||
struct page_info *l1_pg, *l2_pg, *l3_pg;
|
||||
|
||||
/* Create user-accessible L2 directory to map the MPT for guests. */
|
||||
if ( (l2_pg = alloc_domheap_page(NULL)) == NULL )
|
||||
if ( (l3_pg = alloc_domheap_page(NULL)) == NULL )
|
||||
goto nomem;
|
||||
l3_ro_mpt = page_to_virt(l2_pg);
|
||||
l3_ro_mpt = page_to_virt(l3_pg);
|
||||
clear_page(l3_ro_mpt);
|
||||
l4e_write(&idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)],
|
||||
l4e_from_page(l2_pg, __PAGE_HYPERVISOR | _PAGE_USER));
|
||||
l4e_from_page(l3_pg, __PAGE_HYPERVISOR | _PAGE_USER));
|
||||
|
||||
/*
|
||||
* Allocate and map the machine-to-phys table.
|
||||
|
||||