diff options
-rw-r--r-- | arch/x86/include/asm/pgtable_types.h | 1 | ||||
-rw-r--r-- | arch/x86/mm/pageattr.c | 20 |
2 files changed, 21 insertions, 0 deletions
diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index 07789647bf33..d83f5e7ddbdf 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h | |||
@@ -396,6 +396,7 @@ static inline void update_page_count(int level, unsigned long pages) { } | |||
396 | extern pte_t *lookup_address(unsigned long address, unsigned int *level); | 396 | extern pte_t *lookup_address(unsigned long address, unsigned int *level); |
397 | extern pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address, | 397 | extern pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address, |
398 | unsigned int *level); | 398 | unsigned int *level); |
399 | extern pmd_t *lookup_pmd_address(unsigned long address); | ||
399 | extern phys_addr_t slow_virt_to_phys(void *__address); | 400 | extern phys_addr_t slow_virt_to_phys(void *__address); |
400 | extern int kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address, | 401 | extern int kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address, |
401 | unsigned numpages, unsigned long page_flags); | 402 | unsigned numpages, unsigned long page_flags); |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 36de293caf25..129810887e83 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -384,6 +384,26 @@ static pte_t *_lookup_address_cpa(struct cpa_data *cpa, unsigned long address, | |||
384 | } | 384 | } |
385 | 385 | ||
386 | /* | 386 | /* |
387 | * Lookup the PMD entry for a virtual address. Return a pointer to the entry | ||
388 | * or NULL if not present. | ||
389 | */ | ||
390 | pmd_t *lookup_pmd_address(unsigned long address) | ||
391 | { | ||
392 | pgd_t *pgd; | ||
393 | pud_t *pud; | ||
394 | |||
395 | pgd = pgd_offset_k(address); | ||
396 | if (pgd_none(*pgd)) | ||
397 | return NULL; | ||
398 | |||
399 | pud = pud_offset(pgd, address); | ||
400 | if (pud_none(*pud) || pud_large(*pud) || !pud_present(*pud)) | ||
401 | return NULL; | ||
402 | |||
403 | return pmd_offset(pud, address); | ||
404 | } | ||
405 | |||
406 | /* | ||
387 | * This is necessary because __pa() does not work on some | 407 | * This is necessary because __pa() does not work on some |
388 | * kinds of memory, like vmalloc() or the alloc_remap() | 408 | * kinds of memory, like vmalloc() or the alloc_remap() |
389 | * areas on 32-bit NUMA systems. The percpu areas can | 409 | * areas on 32-bit NUMA systems. The percpu areas can |