mirror of https://gitee.com/openkylin/linux.git
xen: mask_rw_pte: do not apply the early_ioremap checks on x86_32
The two "is_early_ioremap_ptep" checks in mask_rw_pte are only used on x86_64, in fact early_ioremap is not used at all to setup the initial pagetable on x86_32. Moreover on x86_32 the two checks are wrong because the range pgt_buf_start..pgt_buf_end initially should be mapped RW because the pages in the range are not pagetable pages yet and haven't been cleared yet. Afterwards considering the pgt_buf_start..pgt_buf_end is part of the initial mapping, xen_alloc_pte is capable of turning the ptes RO when they become pagetable pages. Fix the issue and improve the readability of the code providing two different implementation of mask_rw_pte for x86_32 and x86_64. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
24bdb0b62c
commit
ee176455e2
|
@ -1473,16 +1473,20 @@ static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte)
|
static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte)
|
||||||
{
|
{
|
||||||
unsigned long pfn = pte_pfn(pte);
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
/* If there's an existing pte, then don't allow _PAGE_RW to be set */
|
/* If there's an existing pte, then don't allow _PAGE_RW to be set */
|
||||||
if (pte_val_ma(*ptep) & _PAGE_PRESENT)
|
if (pte_val_ma(*ptep) & _PAGE_PRESENT)
|
||||||
pte = __pte_ma(((pte_val_ma(*ptep) & _PAGE_RW) | ~_PAGE_RW) &
|
pte = __pte_ma(((pte_val_ma(*ptep) & _PAGE_RW) | ~_PAGE_RW) &
|
||||||
pte_val_ma(pte));
|
pte_val_ma(pte));
|
||||||
#endif
|
|
||||||
|
return pte;
|
||||||
|
}
|
||||||
|
#else /* CONFIG_X86_64 */
|
||||||
|
static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte)
|
||||||
|
{
|
||||||
|
unsigned long pfn = pte_pfn(pte);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the new pfn is within the range of the newly allocated
|
* If the new pfn is within the range of the newly allocated
|
||||||
|
@ -1497,6 +1501,7 @@ static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte)
|
||||||
|
|
||||||
return pte;
|
return pte;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_X86_64 */
|
||||||
|
|
||||||
/* Init-time set_pte while constructing initial pagetables, which
|
/* Init-time set_pte while constructing initial pagetables, which
|
||||||
doesn't allow RO pagetable pages to be remapped RW */
|
doesn't allow RO pagetable pages to be remapped RW */
|
||||||
|
|
Loading…
Reference in New Issue