aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-07-12 13:55:25 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-08-23 11:33:29 -0400
commit4fac153a7a260e40e10008a0d7a272719684e4cd (patch)
tree93f695f3f80882008edce45508eeb89dd97033ad /arch
parent3699aad047e16a5775b1d051425f422a9384270d (diff)
xen/mmu: Provide comments describing the _ka and _va aliasing issue
Which is that the level2_kernel_pgt (__ka virtual addresses) and level2_ident_pgt (__va virtual address) contain the same PMD entries. So if you modify a PTE in __ka, it will be reflected in __va (and vice-versa). Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/xen/mmu.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 4ac21a4c6da4..6ba610098dd9 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1734,19 +1734,36 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
1734 init_level4_pgt[0] = __pgd(0); 1734 init_level4_pgt[0] = __pgd(0);
1735 1735
1736 /* Pre-constructed entries are in pfn, so convert to mfn */ 1736 /* Pre-constructed entries are in pfn, so convert to mfn */
1737 /* L4[272] -> level3_ident_pgt
1738 * L4[511] -> level3_kernel_pgt */
1737 convert_pfn_mfn(init_level4_pgt); 1739 convert_pfn_mfn(init_level4_pgt);
1740
1741 /* L3_i[0] -> level2_ident_pgt */
1738 convert_pfn_mfn(level3_ident_pgt); 1742 convert_pfn_mfn(level3_ident_pgt);
1743 /* L3_k[510] -> level2_kernel_pgt
1744 * L3_i[511] -> level2_fixmap_pgt */
1739 convert_pfn_mfn(level3_kernel_pgt); 1745 convert_pfn_mfn(level3_kernel_pgt);
1740 1746
1747 /* We get [511][511] and have Xen's version of level2_kernel_pgt */
1741 l3 = m2v(pgd[pgd_index(__START_KERNEL_map)].pgd); 1748 l3 = m2v(pgd[pgd_index(__START_KERNEL_map)].pgd);
1742 l2 = m2v(l3[pud_index(__START_KERNEL_map)].pud); 1749 l2 = m2v(l3[pud_index(__START_KERNEL_map)].pud);
1743 1750
1751 /* Graft it onto L4[272][0]. Note that we creating an aliasing problem:
1752 * Both L4[272][0] and L4[511][511] have entries that point to the same
1753 * L2 (PMD) tables. Meaning that if you modify it in __va space
1754 * it will be also modified in the __ka space! (But if you just
1755 * modify the PMD table to point to other PTE's or none, then you
1756 * are OK - which is what cleanup_highmap does) */
1744 memcpy(level2_ident_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); 1757 memcpy(level2_ident_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD);
1758 /* Graft it onto L4[511][511] */
1745 memcpy(level2_kernel_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); 1759 memcpy(level2_kernel_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD);
1746 1760
1761 /* Get [511][510] and graft that in level2_fixmap_pgt */
1747 l3 = m2v(pgd[pgd_index(__START_KERNEL_map + PMD_SIZE)].pgd); 1762 l3 = m2v(pgd[pgd_index(__START_KERNEL_map + PMD_SIZE)].pgd);
1748 l2 = m2v(l3[pud_index(__START_KERNEL_map + PMD_SIZE)].pud); 1763 l2 = m2v(l3[pud_index(__START_KERNEL_map + PMD_SIZE)].pud);
1749 memcpy(level2_fixmap_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); 1764 memcpy(level2_fixmap_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD);
1765 /* Note that we don't do anything with level1_fixmap_pgt which
1766 * we don't need. */
1750 1767
1751 /* Set up identity map */ 1768 /* Set up identity map */
1752 xen_map_identity_early(level2_ident_pgt, max_pfn); 1769 xen_map_identity_early(level2_ident_pgt, max_pfn);