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:
		
							parent
							
								
									33a847502b
								
							
						
					
					
						commit
						cfd8951e08
					
				| @ -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) | ||||
| { | ||||
| 	unsigned long mfn; | ||||
| 
 | ||||
| 	if (xen_feature(XENFEAT_auto_translated_physmap)) | ||||
| 		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) | ||||
|  | ||||
| @ -745,7 +745,20 @@ static pteval_t pte_pfn_to_mfn(pteval_t val) | ||||
| 	if (val & _PAGE_PRESENT) { | ||||
| 		unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; | ||||
| 		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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user