xen: don't map missing memory
When setting up a pte for a missing pfn (no matching mfn), just create an empty pte rather than a junk mapping. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
This commit is contained in:
@@ -41,10 +41,17 @@ extern bool set_phys_to_machine(unsigned long pfn, unsigned long mfn);
|
|||||||
|
|
||||||
static inline unsigned long pfn_to_mfn(unsigned long pfn)
|
static inline unsigned long pfn_to_mfn(unsigned long pfn)
|
||||||
{
|
{
|
||||||
|
unsigned long mfn;
|
||||||
|
|
||||||
if (xen_feature(XENFEAT_auto_translated_physmap))
|
if (xen_feature(XENFEAT_auto_translated_physmap))
|
||||||
return pfn;
|
return pfn;
|
||||||
|
|
||||||
return get_phys_to_machine(pfn) & ~FOREIGN_FRAME_BIT;
|
mfn = get_phys_to_machine(pfn);
|
||||||
|
|
||||||
|
if (mfn != INVALID_P2M_ENTRY)
|
||||||
|
mfn &= ~FOREIGN_FRAME_BIT;
|
||||||
|
|
||||||
|
return mfn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int phys_to_machine_mapping_valid(unsigned long pfn)
|
static inline int phys_to_machine_mapping_valid(unsigned long pfn)
|
||||||
|
@@ -745,7 +745,20 @@ static pteval_t pte_pfn_to_mfn(pteval_t val)
|
|||||||
if (val & _PAGE_PRESENT) {
|
if (val & _PAGE_PRESENT) {
|
||||||
unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
|
unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
|
||||||
pteval_t flags = val & PTE_FLAGS_MASK;
|
pteval_t flags = val & PTE_FLAGS_MASK;
|
||||||
val = ((pteval_t)pfn_to_mfn(pfn) << PAGE_SHIFT) | flags;
|
unsigned long mfn = pfn_to_mfn(pfn);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there's no mfn for the pfn, then just create an
|
||||||
|
* empty non-present pte. Unfortunately this loses
|
||||||
|
* information about the original pfn, so
|
||||||
|
* pte_mfn_to_pfn is asymmetric.
|
||||||
|
*/
|
||||||
|
if (unlikely(mfn == INVALID_P2M_ENTRY)) {
|
||||||
|
mfn = 0;
|
||||||
|
flags = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = ((pteval_t)mfn << PAGE_SHIFT) | flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
Reference in New Issue
Block a user