mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
[LINUX] Fix clear_fixmap().
On i386-PAE, clear_fixmap() results in ill use of set_pte(). In all
contexts, p2m translations shouldn't occur here. Note that this is not
really an issue on native linux, as there is
(a) no pfn-to-mfn translation and
(b) __set_fixmap() takes an unsigned long physical address rather than
a paddr_t, which makes it so that bits 32 and up of the physical
address are always zero, permitting either order store when
clearing the entry.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
This commit is contained in:
1 parent
a4dcd35f9d
commit
8f3784dc2b
2 files changed
+14
-5
No files matched your search
@@ -102,8 +102,11 @@ static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
|
||||
return;
|
||||
}
|
||||
pte = pte_offset_kernel(pmd, vaddr);
|
||||
/* <pfn,flags> stored as-is, to permit clearing entries */
|
||||
set_pte(pte, pfn_pte(pfn, flags));
|
||||
if (pgprot_val(flags))
|
||||
/* <pfn,flags> stored as-is, to permit clearing entries */
|
||||
set_pte(pte, pfn_pte(pfn, flags));
|
||||
else
|
||||
pte_clear(&init_mm, vaddr, pte);
|
||||
|
||||
/*
|
||||
* It's enough to flush this one mapping.
|
||||
@@ -140,8 +143,11 @@ static void set_pte_pfn_ma(unsigned long vaddr, unsigned long pfn,
|
||||
return;
|
||||
}
|
||||
pte = pte_offset_kernel(pmd, vaddr);
|
||||
/* <pfn,flags> stored as-is, to permit clearing entries */
|
||||
set_pte(pte, pfn_pte_ma(pfn, flags));
|
||||
if (pgprot_val(flags))
|
||||
/* <pfn,flags> stored as-is, to permit clearing entries */
|
||||
set_pte(pte, pfn_pte_ma(pfn, flags));
|
||||
else
|
||||
pte_clear(&init_mm, vaddr, pte);
|
||||
|
||||
/*
|
||||
* It's enough to flush this one mapping.
|
||||
|
||||
@@ -260,7 +260,10 @@ static void set_pte_phys(unsigned long vaddr,
|
||||
return;
|
||||
}
|
||||
}
|
||||
new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
|
||||
if (pgprot_val(prot))
|
||||
new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
|
||||
else
|
||||
new_pte = __pte(0);
|
||||
|
||||
pte = pte_offset_kernel(pmd, vaddr);
|
||||
if (!pte_none(*pte) &&
|
||||
|
||||