Path: blob/master/arch/powerpc/include/asm/book3s/64/pgtable.h
26519 views
/* SPDX-License-Identifier: GPL-2.0 */1#ifndef _ASM_POWERPC_BOOK3S_64_PGTABLE_H_2#define _ASM_POWERPC_BOOK3S_64_PGTABLE_H_34#include <asm-generic/pgtable-nop4d.h>56#ifndef __ASSEMBLY__7#include <linux/mmdebug.h>8#include <linux/bug.h>9#include <linux/sizes.h>10#endif1112/*13* Common bits between hash and Radix page table14*/1516#define _PAGE_EXEC 0x00001 /* execute permission */17#define _PAGE_WRITE 0x00002 /* write access allowed */18#define _PAGE_READ 0x00004 /* read access allowed */19#define _PAGE_PRIVILEGED 0x00008 /* kernel access only */20#define _PAGE_SAO 0x00010 /* Strong access order */21#define _PAGE_NON_IDEMPOTENT 0x00020 /* non idempotent memory */22#define _PAGE_TOLERANT 0x00030 /* tolerant memory, cache inhibited */23#define _PAGE_DIRTY 0x00080 /* C: page changed */24#define _PAGE_ACCESSED 0x00100 /* R: page referenced */25/*26* Software bits27*/28#define _RPAGE_SW0 0x2000000000000000UL29#define _RPAGE_SW1 0x0080030#define _RPAGE_SW2 0x0040031#define _RPAGE_SW3 0x0020032#define _RPAGE_RSV1 0x00040UL3334#define _RPAGE_PKEY_BIT4 0x1000000000000000UL35#define _RPAGE_PKEY_BIT3 0x0800000000000000UL36#define _RPAGE_PKEY_BIT2 0x0400000000000000UL37#define _RPAGE_PKEY_BIT1 0x0200000000000000UL38#define _RPAGE_PKEY_BIT0 0x0100000000000000UL3940#define _PAGE_PTE 0x4000000000000000UL /* distinguishes PTEs from pointers */41#define _PAGE_PRESENT 0x8000000000000000UL /* pte contains a translation */42/*43* We need to mark a pmd pte invalid while splitting. We can do that by clearing44* the _PAGE_PRESENT bit. But then that will be taken as a swap pte. In order to45* differentiate between two use a SW field when invalidating.46*47* We do that temporary invalidate for regular pte entry in ptep_set_access_flags48*49* This is used only when _PAGE_PRESENT is cleared.50*/51#define _PAGE_INVALID _RPAGE_SW05253/*54* Top and bottom bits of RPN which can be used by hash55* translation mode, because we expect them to be zero56* otherwise.57*/58#define _RPAGE_RPN0 0x0100059#define _RPAGE_RPN1 0x0200060#define _RPAGE_RPN43 0x0080000000000000UL61#define _RPAGE_RPN42 0x0040000000000000UL62#define _RPAGE_RPN41 0x0020000000000000UL6364/* Max physical address bit as per radix table */65#define _RPAGE_PA_MAX 566667/*68* Max physical address bit we will use for now.69*70* This is mostly a hardware limitation and for now Power9 has71* a 51 bit limit.72*73* This is different from the number of physical bit required to address74* the last byte of memory. That is defined by MAX_PHYSMEM_BITS.75* MAX_PHYSMEM_BITS is a linux limitation imposed by the maximum76* number of sections we can support (SECTIONS_SHIFT).77*78* This is different from Radix page table limitation above and79* should always be less than that. The limit is done such that80* we can overload the bits between _RPAGE_PA_MAX and _PAGE_PA_MAX81* for hash linux page table specific bits.82*83* In order to be compatible with future hardware generations we keep84* some offsets and limit this for now to 5385*/86#define _PAGE_PA_MAX 538788#define _PAGE_SOFT_DIRTY _RPAGE_SW3 /* software: software dirty tracking */89#define _PAGE_SPECIAL _RPAGE_SW2 /* software: special page */9091/*92* Drivers request for cache inhibited pte mapping using _PAGE_NO_CACHE93* Instead of fixing all of them, add an alternate define which94* maps CI pte mapping.95*/96#define _PAGE_NO_CACHE _PAGE_TOLERANT97/*98* We support _RPAGE_PA_MAX bit real address in pte. On the linux side99* we are limited by _PAGE_PA_MAX. Clear everything above _PAGE_PA_MAX100* and every thing below PAGE_SHIFT;101*/102#define PTE_RPN_MASK (((1UL << _PAGE_PA_MAX) - 1) & (PAGE_MASK))103#define PTE_RPN_SHIFT PAGE_SHIFT104/*105* set of bits not changed in pmd_modify. Even though we have hash specific bits106* in here, on radix we expect them to be zero.107*/108#define _HPAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \109_PAGE_ACCESSED | H_PAGE_THP_HUGE | _PAGE_PTE | \110_PAGE_SOFT_DIRTY)111/*112* user access blocked by key113*/114#define _PAGE_KERNEL_RW (_PAGE_PRIVILEGED | _PAGE_RW | _PAGE_DIRTY)115#define _PAGE_KERNEL_RO (_PAGE_PRIVILEGED | _PAGE_READ)116#define _PAGE_KERNEL_ROX (_PAGE_PRIVILEGED | _PAGE_READ | _PAGE_EXEC)117#define _PAGE_KERNEL_RWX (_PAGE_PRIVILEGED | _PAGE_DIRTY | _PAGE_RW | _PAGE_EXEC)118/*119* _PAGE_CHG_MASK masks of bits that are to be preserved across120* pgprot changes121*/122#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \123_PAGE_ACCESSED | _PAGE_SPECIAL | _PAGE_PTE | \124_PAGE_SOFT_DIRTY)125126/*127* We define 2 sets of base prot bits, one for basic pages (ie,128* cacheable kernel and user pages) and one for non cacheable129* pages. We always set _PAGE_COHERENT when SMP is enabled or130* the processor might need it for DMA coherency.131*/132#define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED)133#define _PAGE_BASE (_PAGE_BASE_NC)134135#include <asm/pgtable-masks.h>136137/* Permission masks used for kernel mappings */138#define PAGE_KERNEL __pgprot(_PAGE_BASE | _PAGE_KERNEL_RW)139#define PAGE_KERNEL_NC __pgprot(_PAGE_BASE_NC | _PAGE_KERNEL_RW | _PAGE_TOLERANT)140#define PAGE_KERNEL_NCG __pgprot(_PAGE_BASE_NC | _PAGE_KERNEL_RW | _PAGE_NON_IDEMPOTENT)141#define PAGE_KERNEL_X __pgprot(_PAGE_BASE | _PAGE_KERNEL_RWX)142#define PAGE_KERNEL_RO __pgprot(_PAGE_BASE | _PAGE_KERNEL_RO)143#define PAGE_KERNEL_ROX __pgprot(_PAGE_BASE | _PAGE_KERNEL_ROX)144145#ifndef __ASSEMBLY__146/*147* page table defines148*/149extern unsigned long __pte_index_size;150extern unsigned long __pmd_index_size;151extern unsigned long __pud_index_size;152extern unsigned long __pgd_index_size;153extern unsigned long __pud_cache_index;154#define PTE_INDEX_SIZE __pte_index_size155#define PMD_INDEX_SIZE __pmd_index_size156#define PUD_INDEX_SIZE __pud_index_size157#define PGD_INDEX_SIZE __pgd_index_size158/* pmd table use page table fragments */159#define PMD_CACHE_INDEX 0160#define PUD_CACHE_INDEX __pud_cache_index161/*162* Because of use of pte fragments and THP, size of page table163* are not always derived out of index size above.164*/165extern unsigned long __pte_table_size;166extern unsigned long __pmd_table_size;167extern unsigned long __pud_table_size;168extern unsigned long __pgd_table_size;169#define PTE_TABLE_SIZE __pte_table_size170#define PMD_TABLE_SIZE __pmd_table_size171#define PUD_TABLE_SIZE __pud_table_size172#define PGD_TABLE_SIZE __pgd_table_size173174extern unsigned long __pmd_val_bits;175extern unsigned long __pud_val_bits;176extern unsigned long __pgd_val_bits;177#define PMD_VAL_BITS __pmd_val_bits178#define PUD_VAL_BITS __pud_val_bits179#define PGD_VAL_BITS __pgd_val_bits180181extern unsigned long __pte_frag_nr;182#define PTE_FRAG_NR __pte_frag_nr183extern unsigned long __pte_frag_size_shift;184#define PTE_FRAG_SIZE_SHIFT __pte_frag_size_shift185#define PTE_FRAG_SIZE (1UL << PTE_FRAG_SIZE_SHIFT)186187extern unsigned long __pmd_frag_nr;188#define PMD_FRAG_NR __pmd_frag_nr189extern unsigned long __pmd_frag_size_shift;190#define PMD_FRAG_SIZE_SHIFT __pmd_frag_size_shift191#define PMD_FRAG_SIZE (1UL << PMD_FRAG_SIZE_SHIFT)192193#define PTRS_PER_PTE (1 << PTE_INDEX_SIZE)194#define PTRS_PER_PMD (1 << PMD_INDEX_SIZE)195#define PTRS_PER_PUD (1 << PUD_INDEX_SIZE)196#define PTRS_PER_PGD (1 << PGD_INDEX_SIZE)197198#define MAX_PTRS_PER_PTE ((H_PTRS_PER_PTE > R_PTRS_PER_PTE) ? H_PTRS_PER_PTE : R_PTRS_PER_PTE)199#define MAX_PTRS_PER_PMD ((H_PTRS_PER_PMD > R_PTRS_PER_PMD) ? H_PTRS_PER_PMD : R_PTRS_PER_PMD)200#define MAX_PTRS_PER_PUD ((H_PTRS_PER_PUD > R_PTRS_PER_PUD) ? H_PTRS_PER_PUD : R_PTRS_PER_PUD)201#define MAX_PTRS_PER_PGD (1 << (H_PGD_INDEX_SIZE > RADIX_PGD_INDEX_SIZE ? \202H_PGD_INDEX_SIZE : RADIX_PGD_INDEX_SIZE))203204/* PMD_SHIFT determines what a second-level page table entry can map */205#define PMD_SHIFT (PAGE_SHIFT + PTE_INDEX_SIZE)206#define PMD_SIZE (1UL << PMD_SHIFT)207#define PMD_MASK (~(PMD_SIZE-1))208209/* PUD_SHIFT determines what a third-level page table entry can map */210#define PUD_SHIFT (PMD_SHIFT + PMD_INDEX_SIZE)211#define PUD_SIZE (1UL << PUD_SHIFT)212#define PUD_MASK (~(PUD_SIZE-1))213214/* PGDIR_SHIFT determines what a fourth-level page table entry can map */215#define PGDIR_SHIFT (PUD_SHIFT + PUD_INDEX_SIZE)216#define PGDIR_SIZE (1UL << PGDIR_SHIFT)217#define PGDIR_MASK (~(PGDIR_SIZE-1))218219/* Bits to mask out from a PMD to get to the PTE page */220#define PMD_MASKED_BITS 0xc0000000000000ffUL221/* Bits to mask out from a PUD to get to the PMD page */222#define PUD_MASKED_BITS 0xc0000000000000ffUL223/* Bits to mask out from a PGD to get to the PUD page */224#define P4D_MASKED_BITS 0xc0000000000000ffUL225226/*227* Used as an indicator for rcu callback functions228*/229enum pgtable_index {230PTE_INDEX = 0,231PMD_INDEX,232PUD_INDEX,233PGD_INDEX,234/*235* Below are used with 4k page size and hugetlb236*/237HTLB_16M_INDEX,238HTLB_16G_INDEX,239};240241extern unsigned long __vmalloc_start;242extern unsigned long __vmalloc_end;243#define VMALLOC_START __vmalloc_start244#define VMALLOC_END __vmalloc_end245246static inline unsigned int ioremap_max_order(void)247{248if (radix_enabled())249return PUD_SHIFT;250return 7 + PAGE_SHIFT; /* default from linux/vmalloc.h */251}252#define IOREMAP_MAX_ORDER ioremap_max_order()253254extern unsigned long __kernel_virt_start;255extern unsigned long __kernel_io_start;256extern unsigned long __kernel_io_end;257#define KERN_VIRT_START __kernel_virt_start258#define KERN_IO_START __kernel_io_start259#define KERN_IO_END __kernel_io_end260261extern struct page *vmemmap;262extern unsigned long pci_io_base;263264#define pmd_leaf pmd_leaf265static inline bool pmd_leaf(pmd_t pmd)266{267return !!(pmd_raw(pmd) & cpu_to_be64(_PAGE_PTE));268}269270#define pud_leaf pud_leaf271static inline bool pud_leaf(pud_t pud)272{273return !!(pud_raw(pud) & cpu_to_be64(_PAGE_PTE));274}275276#define pmd_leaf_size pmd_leaf_size277static inline unsigned long pmd_leaf_size(pmd_t pmd)278{279if (IS_ENABLED(CONFIG_PPC_4K_PAGES) && !radix_enabled())280return SZ_16M;281else282return PMD_SIZE;283}284285#define pud_leaf_size pud_leaf_size286static inline unsigned long pud_leaf_size(pud_t pud)287{288if (IS_ENABLED(CONFIG_PPC_4K_PAGES) && !radix_enabled())289return SZ_16G;290else291return PUD_SIZE;292}293#endif /* __ASSEMBLY__ */294295#include <asm/book3s/64/hash.h>296#include <asm/book3s/64/radix.h>297298#if H_MAX_PHYSMEM_BITS > R_MAX_PHYSMEM_BITS299#define MAX_PHYSMEM_BITS H_MAX_PHYSMEM_BITS300#else301#define MAX_PHYSMEM_BITS R_MAX_PHYSMEM_BITS302#endif303304/* hash 4k can't share hugetlb and also doesn't support THP */305#ifdef CONFIG_PPC_64K_PAGES306#include <asm/book3s/64/pgtable-64k.h>307#endif308309#include <asm/barrier.h>310/*311* IO space itself carved into the PIO region (ISA and PHB IO space) and312* the ioremap space313*314* ISA_IO_BASE = KERN_IO_START, 64K reserved area315* PHB_IO_BASE = ISA_IO_BASE + 64K to ISA_IO_BASE + 2G, PHB IO spaces316* IOREMAP_BASE = ISA_IO_BASE + 2G to VMALLOC_START + PGTABLE_RANGE317*/318#define FULL_IO_SIZE 0x80000000ul319#define ISA_IO_BASE (KERN_IO_START)320#define ISA_IO_END (KERN_IO_START + 0x10000ul)321#define PHB_IO_BASE (ISA_IO_END)322#define PHB_IO_END (KERN_IO_START + FULL_IO_SIZE)323#define IOREMAP_BASE (PHB_IO_END)324#define IOREMAP_START (ioremap_bot)325#define IOREMAP_END (KERN_IO_END - FIXADDR_SIZE)326#define FIXADDR_SIZE SZ_32M327#define FIXADDR_TOP (IOREMAP_END + FIXADDR_SIZE)328329#ifndef __ASSEMBLY__330331static inline unsigned long pte_update(struct mm_struct *mm, unsigned long addr,332pte_t *ptep, unsigned long clr,333unsigned long set, int huge)334{335if (radix_enabled())336return radix__pte_update(mm, addr, ptep, clr, set, huge);337return hash__pte_update(mm, addr, ptep, clr, set, huge);338}339/*340* For hash even if we have _PAGE_ACCESSED = 0, we do a pte_update.341* We currently remove entries from the hashtable regardless of whether342* the entry was young or dirty.343*344* We should be more intelligent about this but for the moment we override345* these functions and force a tlb flush unconditionally346* For radix: H_PAGE_HASHPTE should be zero. Hence we can use the same347* function for both hash and radix.348*/349static inline int __ptep_test_and_clear_young(struct mm_struct *mm,350unsigned long addr, pte_t *ptep)351{352unsigned long old;353354if ((pte_raw(*ptep) & cpu_to_be64(_PAGE_ACCESSED | H_PAGE_HASHPTE)) == 0)355return 0;356old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0);357return (old & _PAGE_ACCESSED) != 0;358}359360#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG361#define ptep_test_and_clear_young(__vma, __addr, __ptep) \362({ \363__ptep_test_and_clear_young((__vma)->vm_mm, __addr, __ptep); \364})365366/*367* On Book3S CPUs, clearing the accessed bit without a TLB flush368* doesn't cause data corruption. [ It could cause incorrect369* page aging and the (mistaken) reclaim of hot pages, but the370* chance of that should be relatively low. ]371*372* So as a performance optimization don't flush the TLB when373* clearing the accessed bit, it will eventually be flushed by374* a context switch or a VM operation anyway. [ In the rare375* event of it not getting flushed for a long time the delay376* shouldn't really matter because there's no real memory377* pressure for swapout to react to. ]378*379* Note: this optimisation also exists in pte_needs_flush() and380* huge_pmd_needs_flush().381*/382#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH383#define ptep_clear_flush_young ptep_test_and_clear_young384385#define __HAVE_ARCH_PMDP_CLEAR_YOUNG_FLUSH386#define pmdp_clear_flush_young pmdp_test_and_clear_young387388static inline int pte_write(pte_t pte)389{390return !!(pte_raw(pte) & cpu_to_be64(_PAGE_WRITE));391}392393static inline int pte_read(pte_t pte)394{395return !!(pte_raw(pte) & cpu_to_be64(_PAGE_READ));396}397398#define __HAVE_ARCH_PTEP_SET_WRPROTECT399static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,400pte_t *ptep)401{402if (pte_write(*ptep))403pte_update(mm, addr, ptep, _PAGE_WRITE, 0, 0);404}405406#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT407static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,408unsigned long addr, pte_t *ptep)409{410if (pte_write(*ptep))411pte_update(mm, addr, ptep, _PAGE_WRITE, 0, 1);412}413414#define __HAVE_ARCH_PTEP_GET_AND_CLEAR415static inline pte_t ptep_get_and_clear(struct mm_struct *mm,416unsigned long addr, pte_t *ptep)417{418unsigned long old = pte_update(mm, addr, ptep, ~0UL, 0, 0);419return __pte(old);420}421422#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL423static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,424unsigned long addr,425pte_t *ptep, int full)426{427if (full && radix_enabled()) {428/*429* We know that this is a full mm pte clear and430* hence can be sure there is no parallel set_pte.431*/432return radix__ptep_get_and_clear_full(mm, addr, ptep, full);433}434return ptep_get_and_clear(mm, addr, ptep);435}436437438static inline void pte_clear(struct mm_struct *mm, unsigned long addr,439pte_t * ptep)440{441pte_update(mm, addr, ptep, ~0UL, 0, 0);442}443444static inline int pte_dirty(pte_t pte)445{446return !!(pte_raw(pte) & cpu_to_be64(_PAGE_DIRTY));447}448449static inline int pte_young(pte_t pte)450{451return !!(pte_raw(pte) & cpu_to_be64(_PAGE_ACCESSED));452}453454static inline int pte_special(pte_t pte)455{456return !!(pte_raw(pte) & cpu_to_be64(_PAGE_SPECIAL));457}458459static inline bool pte_exec(pte_t pte)460{461return !!(pte_raw(pte) & cpu_to_be64(_PAGE_EXEC));462}463464465#ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY466static inline bool pte_soft_dirty(pte_t pte)467{468return !!(pte_raw(pte) & cpu_to_be64(_PAGE_SOFT_DIRTY));469}470471static inline pte_t pte_mksoft_dirty(pte_t pte)472{473return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SOFT_DIRTY));474}475476static inline pte_t pte_clear_soft_dirty(pte_t pte)477{478return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_SOFT_DIRTY));479}480#endif /* CONFIG_HAVE_ARCH_SOFT_DIRTY */481482#ifdef CONFIG_NUMA_BALANCING483static inline int pte_protnone(pte_t pte)484{485return (pte_raw(pte) & cpu_to_be64(_PAGE_PRESENT | _PAGE_PTE | _PAGE_RWX)) ==486cpu_to_be64(_PAGE_PRESENT | _PAGE_PTE);487}488#endif /* CONFIG_NUMA_BALANCING */489490static inline bool pte_hw_valid(pte_t pte)491{492return (pte_raw(pte) & cpu_to_be64(_PAGE_PRESENT | _PAGE_PTE)) ==493cpu_to_be64(_PAGE_PRESENT | _PAGE_PTE);494}495496static inline int pte_present(pte_t pte)497{498/*499* A pte is considerent present if _PAGE_PRESENT is set.500* We also need to consider the pte present which is marked501* invalid during ptep_set_access_flags. Hence we look for _PAGE_INVALID502* if we find _PAGE_PRESENT cleared.503*/504505if (pte_hw_valid(pte))506return true;507return (pte_raw(pte) & cpu_to_be64(_PAGE_INVALID | _PAGE_PTE)) ==508cpu_to_be64(_PAGE_INVALID | _PAGE_PTE);509}510511#ifdef CONFIG_PPC_MEM_KEYS512extern bool arch_pte_access_permitted(u64 pte, bool write, bool execute);513#else514static inline bool arch_pte_access_permitted(u64 pte, bool write, bool execute)515{516return true;517}518#endif /* CONFIG_PPC_MEM_KEYS */519520static inline bool pte_user(pte_t pte)521{522return !(pte_raw(pte) & cpu_to_be64(_PAGE_PRIVILEGED));523}524525#define pte_access_permitted pte_access_permitted526static inline bool pte_access_permitted(pte_t pte, bool write)527{528/*529* _PAGE_READ is needed for any access and will be cleared for530* PROT_NONE. Execute-only mapping via PROT_EXEC also returns false.531*/532if (!pte_present(pte) || !pte_user(pte) || !pte_read(pte))533return false;534535if (write && !pte_write(pte))536return false;537538return arch_pte_access_permitted(pte_val(pte), write, 0);539}540541/*542* Conversion functions: convert a page and protection to a page entry,543* and a page entry and page directory to the page they refer to.544*545* Even if PTEs can be unsigned long long, a PFN is always an unsigned546* long for now.547*/548static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot)549{550VM_BUG_ON(pfn >> (64 - PAGE_SHIFT));551VM_BUG_ON((pfn << PAGE_SHIFT) & ~PTE_RPN_MASK);552553return __pte(((pte_basic_t)pfn << PAGE_SHIFT) | pgprot_val(pgprot) | _PAGE_PTE);554}555556/* Generic modifiers for PTE bits */557static inline pte_t pte_wrprotect(pte_t pte)558{559return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_WRITE));560}561562static inline pte_t pte_exprotect(pte_t pte)563{564return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_EXEC));565}566567static inline pte_t pte_mkclean(pte_t pte)568{569return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_DIRTY));570}571572static inline pte_t pte_mkold(pte_t pte)573{574return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_ACCESSED));575}576577static inline pte_t pte_mkexec(pte_t pte)578{579return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_EXEC));580}581582static inline pte_t pte_mkwrite_novma(pte_t pte)583{584/*585* write implies read, hence set both586*/587return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_RW));588}589590static inline pte_t pte_mkdirty(pte_t pte)591{592return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_DIRTY | _PAGE_SOFT_DIRTY));593}594595static inline pte_t pte_mkyoung(pte_t pte)596{597return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_ACCESSED));598}599600static inline pte_t pte_mkspecial(pte_t pte)601{602return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SPECIAL));603}604605static inline pte_t pte_mkhuge(pte_t pte)606{607return pte;608}609610static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)611{612/* FIXME!! check whether this need to be a conditional */613return __pte_raw((pte_raw(pte) & cpu_to_be64(_PAGE_CHG_MASK)) |614cpu_to_be64(pgprot_val(newprot)));615}616617/* Encode and de-code a swap entry */618#define MAX_SWAPFILES_CHECK() do { \619BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS); \620/* \621* Don't have overlapping bits with _PAGE_HPTEFLAGS \622* We filter HPTEFLAGS on set_pte. \623*/ \624BUILD_BUG_ON(_PAGE_HPTEFLAGS & SWP_TYPE_MASK); \625BUILD_BUG_ON(_PAGE_HPTEFLAGS & _PAGE_SWP_SOFT_DIRTY); \626BUILD_BUG_ON(_PAGE_HPTEFLAGS & _PAGE_SWP_EXCLUSIVE); \627} while (0)628629#define SWP_TYPE_BITS 5630#define SWP_TYPE_MASK ((1UL << SWP_TYPE_BITS) - 1)631#define __swp_type(x) ((x).val & SWP_TYPE_MASK)632#define __swp_offset(x) (((x).val & PTE_RPN_MASK) >> PAGE_SHIFT)633#define __swp_entry(type, offset) ((swp_entry_t) { \634(type) | (((offset) << PAGE_SHIFT) & PTE_RPN_MASK)})635/*636* swp_entry_t must be independent of pte bits. We build a swp_entry_t from637* swap type and offset we get from swap and convert that to pte to find a638* matching pte in linux page table.639* Clear bits not found in swap entries here.640*/641#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) & ~_PAGE_PTE })642#define __swp_entry_to_pte(x) __pte((x).val | _PAGE_PTE)643#define __pmd_to_swp_entry(pmd) (__pte_to_swp_entry(pmd_pte(pmd)))644#define __swp_entry_to_pmd(x) (pte_pmd(__swp_entry_to_pte(x)))645646#ifdef CONFIG_MEM_SOFT_DIRTY647#define _PAGE_SWP_SOFT_DIRTY _PAGE_SOFT_DIRTY648#else649#define _PAGE_SWP_SOFT_DIRTY 0UL650#endif /* CONFIG_MEM_SOFT_DIRTY */651652#define _PAGE_SWP_EXCLUSIVE _PAGE_NON_IDEMPOTENT653654#ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY655static inline pte_t pte_swp_mksoft_dirty(pte_t pte)656{657return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SWP_SOFT_DIRTY));658}659660static inline bool pte_swp_soft_dirty(pte_t pte)661{662return !!(pte_raw(pte) & cpu_to_be64(_PAGE_SWP_SOFT_DIRTY));663}664665static inline pte_t pte_swp_clear_soft_dirty(pte_t pte)666{667return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_SWP_SOFT_DIRTY));668}669#endif /* CONFIG_HAVE_ARCH_SOFT_DIRTY */670671static inline pte_t pte_swp_mkexclusive(pte_t pte)672{673return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_SWP_EXCLUSIVE));674}675676static inline bool pte_swp_exclusive(pte_t pte)677{678return !!(pte_raw(pte) & cpu_to_be64(_PAGE_SWP_EXCLUSIVE));679}680681static inline pte_t pte_swp_clear_exclusive(pte_t pte)682{683return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_SWP_EXCLUSIVE));684}685686static inline bool check_pte_access(unsigned long access, unsigned long ptev)687{688/*689* This check for _PAGE_RWX and _PAGE_PRESENT bits690*/691if (access & ~ptev)692return false;693/*694* This check for access to privilege space695*/696if ((access & _PAGE_PRIVILEGED) != (ptev & _PAGE_PRIVILEGED))697return false;698699return true;700}701/*702* Generic functions with hash/radix callbacks703*/704705static inline void __ptep_set_access_flags(struct vm_area_struct *vma,706pte_t *ptep, pte_t entry,707unsigned long address,708int psize)709{710if (radix_enabled())711return radix__ptep_set_access_flags(vma, ptep, entry,712address, psize);713return hash__ptep_set_access_flags(ptep, entry);714}715716#define __HAVE_ARCH_PTE_SAME717static inline int pte_same(pte_t pte_a, pte_t pte_b)718{719if (radix_enabled())720return radix__pte_same(pte_a, pte_b);721return hash__pte_same(pte_a, pte_b);722}723724static inline int pte_none(pte_t pte)725{726if (radix_enabled())727return radix__pte_none(pte);728return hash__pte_none(pte);729}730731static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,732pte_t *ptep, pte_t pte, int percpu)733{734735VM_WARN_ON(!(pte_raw(pte) & cpu_to_be64(_PAGE_PTE)));736/*737* Keep the _PAGE_PTE added till we are sure we handle _PAGE_PTE738* in all the callers.739*/740pte = __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_PTE));741742if (radix_enabled())743return radix__set_pte_at(mm, addr, ptep, pte, percpu);744return hash__set_pte_at(mm, addr, ptep, pte, percpu);745}746747#define _PAGE_CACHE_CTL (_PAGE_SAO | _PAGE_NON_IDEMPOTENT | _PAGE_TOLERANT)748749#define pgprot_noncached pgprot_noncached750static inline pgprot_t pgprot_noncached(pgprot_t prot)751{752return __pgprot((pgprot_val(prot) & ~_PAGE_CACHE_CTL) |753_PAGE_NON_IDEMPOTENT);754}755756#define pgprot_noncached_wc pgprot_noncached_wc757static inline pgprot_t pgprot_noncached_wc(pgprot_t prot)758{759return __pgprot((pgprot_val(prot) & ~_PAGE_CACHE_CTL) |760_PAGE_TOLERANT);761}762763#define pgprot_cached pgprot_cached764static inline pgprot_t pgprot_cached(pgprot_t prot)765{766return __pgprot((pgprot_val(prot) & ~_PAGE_CACHE_CTL));767}768769#define pgprot_writecombine pgprot_writecombine770static inline pgprot_t pgprot_writecombine(pgprot_t prot)771{772return pgprot_noncached_wc(prot);773}774/*775* check a pte mapping have cache inhibited property776*/777static inline bool pte_ci(pte_t pte)778{779__be64 pte_v = pte_raw(pte);780781if (((pte_v & cpu_to_be64(_PAGE_CACHE_CTL)) == cpu_to_be64(_PAGE_TOLERANT)) ||782((pte_v & cpu_to_be64(_PAGE_CACHE_CTL)) == cpu_to_be64(_PAGE_NON_IDEMPOTENT)))783return true;784return false;785}786787static inline void pmd_clear(pmd_t *pmdp)788{789if (IS_ENABLED(CONFIG_DEBUG_VM) && !radix_enabled()) {790/*791* Don't use this if we can possibly have a hash page table792* entry mapping this.793*/794WARN_ON((pmd_val(*pmdp) & (H_PAGE_HASHPTE | _PAGE_PTE)) == (H_PAGE_HASHPTE | _PAGE_PTE));795}796*pmdp = __pmd(0);797}798799static inline int pmd_none(pmd_t pmd)800{801return !pmd_raw(pmd);802}803804static inline int pmd_present(pmd_t pmd)805{806/*807* A pmd is considerent present if _PAGE_PRESENT is set.808* We also need to consider the pmd present which is marked809* invalid during a split. Hence we look for _PAGE_INVALID810* if we find _PAGE_PRESENT cleared.811*/812if (pmd_raw(pmd) & cpu_to_be64(_PAGE_PRESENT | _PAGE_INVALID))813return true;814815return false;816}817818static inline int pmd_is_serializing(pmd_t pmd)819{820/*821* If the pmd is undergoing a split, the _PAGE_PRESENT bit is clear822* and _PAGE_INVALID is set (see pmd_present, pmdp_invalidate).823*824* This condition may also occur when flushing a pmd while flushing825* it (see ptep_modify_prot_start), so callers must ensure this826* case is fine as well.827*/828if ((pmd_raw(pmd) & cpu_to_be64(_PAGE_PRESENT | _PAGE_INVALID)) ==829cpu_to_be64(_PAGE_INVALID))830return true;831832return false;833}834835static inline int pmd_bad(pmd_t pmd)836{837if (radix_enabled())838return radix__pmd_bad(pmd);839return hash__pmd_bad(pmd);840}841842static inline void pud_clear(pud_t *pudp)843{844if (IS_ENABLED(CONFIG_DEBUG_VM) && !radix_enabled()) {845/*846* Don't use this if we can possibly have a hash page table847* entry mapping this.848*/849WARN_ON((pud_val(*pudp) & (H_PAGE_HASHPTE | _PAGE_PTE)) == (H_PAGE_HASHPTE | _PAGE_PTE));850}851*pudp = __pud(0);852}853854static inline int pud_none(pud_t pud)855{856return !pud_raw(pud);857}858859static inline int pud_present(pud_t pud)860{861return !!(pud_raw(pud) & cpu_to_be64(_PAGE_PRESENT));862}863864extern struct page *pud_page(pud_t pud);865extern struct page *pmd_page(pmd_t pmd);866static inline pte_t pud_pte(pud_t pud)867{868return __pte_raw(pud_raw(pud));869}870871static inline pud_t pte_pud(pte_t pte)872{873return __pud_raw(pte_raw(pte));874}875876static inline pte_t *pudp_ptep(pud_t *pud)877{878return (pte_t *)pud;879}880881#define pud_pfn(pud) pte_pfn(pud_pte(pud))882#define pud_dirty(pud) pte_dirty(pud_pte(pud))883#define pud_young(pud) pte_young(pud_pte(pud))884#define pud_mkold(pud) pte_pud(pte_mkold(pud_pte(pud)))885#define pud_wrprotect(pud) pte_pud(pte_wrprotect(pud_pte(pud)))886#define pud_mkdirty(pud) pte_pud(pte_mkdirty(pud_pte(pud)))887#define pud_mkclean(pud) pte_pud(pte_mkclean(pud_pte(pud)))888#define pud_mkyoung(pud) pte_pud(pte_mkyoung(pud_pte(pud)))889#define pud_mkwrite(pud) pte_pud(pte_mkwrite_novma(pud_pte(pud)))890#define pud_write(pud) pte_write(pud_pte(pud))891892#ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY893#define pud_soft_dirty(pmd) pte_soft_dirty(pud_pte(pud))894#define pud_mksoft_dirty(pmd) pte_pud(pte_mksoft_dirty(pud_pte(pud)))895#define pud_clear_soft_dirty(pmd) pte_pud(pte_clear_soft_dirty(pud_pte(pud)))896#endif /* CONFIG_HAVE_ARCH_SOFT_DIRTY */897898static inline int pud_bad(pud_t pud)899{900if (radix_enabled())901return radix__pud_bad(pud);902return hash__pud_bad(pud);903}904905#define pud_access_permitted pud_access_permitted906static inline bool pud_access_permitted(pud_t pud, bool write)907{908return pte_access_permitted(pud_pte(pud), write);909}910911#define __p4d_raw(x) ((p4d_t) { __pgd_raw(x) })912static inline __be64 p4d_raw(p4d_t x)913{914return pgd_raw(x.pgd);915}916917#define p4d_write(p4d) pte_write(p4d_pte(p4d))918919static inline void p4d_clear(p4d_t *p4dp)920{921*p4dp = __p4d(0);922}923924static inline int p4d_none(p4d_t p4d)925{926return !p4d_raw(p4d);927}928929static inline int p4d_present(p4d_t p4d)930{931return !!(p4d_raw(p4d) & cpu_to_be64(_PAGE_PRESENT));932}933934static inline pte_t p4d_pte(p4d_t p4d)935{936return __pte_raw(p4d_raw(p4d));937}938939static inline p4d_t pte_p4d(pte_t pte)940{941return __p4d_raw(pte_raw(pte));942}943944static inline int p4d_bad(p4d_t p4d)945{946if (radix_enabled())947return radix__p4d_bad(p4d);948return hash__p4d_bad(p4d);949}950951#define p4d_access_permitted p4d_access_permitted952static inline bool p4d_access_permitted(p4d_t p4d, bool write)953{954return pte_access_permitted(p4d_pte(p4d), write);955}956957extern struct page *p4d_page(p4d_t p4d);958959/* Pointers in the page table tree are physical addresses */960#define __pgtable_ptr_val(ptr) __pa(ptr)961962static inline pud_t *p4d_pgtable(p4d_t p4d)963{964return (pud_t *)__va(p4d_val(p4d) & ~P4D_MASKED_BITS);965}966967static inline pmd_t *pud_pgtable(pud_t pud)968{969return (pmd_t *)__va(pud_val(pud) & ~PUD_MASKED_BITS);970}971972#define pmd_ERROR(e) \973pr_err("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))974#define pud_ERROR(e) \975pr_err("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pud_val(e))976#define pgd_ERROR(e) \977pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))978979static inline int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot)980{981if (radix_enabled()) {982#if defined(CONFIG_PPC_RADIX_MMU) && defined(DEBUG_VM)983unsigned long page_size = 1 << mmu_psize_defs[mmu_io_psize].shift;984WARN((page_size != PAGE_SIZE), "I/O page size != PAGE_SIZE");985#endif986return radix__map_kernel_page(ea, pa, prot, PAGE_SIZE);987}988return hash__map_kernel_page(ea, pa, prot);989}990991void unmap_kernel_page(unsigned long va);992993static inline int __meminit vmemmap_create_mapping(unsigned long start,994unsigned long page_size,995unsigned long phys)996{997if (radix_enabled())998return radix__vmemmap_create_mapping(start, page_size, phys);999return hash__vmemmap_create_mapping(start, page_size, phys);1000}10011002#ifdef CONFIG_MEMORY_HOTPLUG1003static inline void vmemmap_remove_mapping(unsigned long start,1004unsigned long page_size)1005{1006if (radix_enabled())1007return radix__vmemmap_remove_mapping(start, page_size);1008return hash__vmemmap_remove_mapping(start, page_size);1009}1010#endif10111012static inline pte_t pmd_pte(pmd_t pmd)1013{1014return __pte_raw(pmd_raw(pmd));1015}10161017static inline pmd_t pte_pmd(pte_t pte)1018{1019return __pmd_raw(pte_raw(pte));1020}10211022static inline pte_t *pmdp_ptep(pmd_t *pmd)1023{1024return (pte_t *)pmd;1025}1026#define pmd_pfn(pmd) pte_pfn(pmd_pte(pmd))1027#define pmd_dirty(pmd) pte_dirty(pmd_pte(pmd))1028#define pmd_young(pmd) pte_young(pmd_pte(pmd))1029#define pmd_mkold(pmd) pte_pmd(pte_mkold(pmd_pte(pmd)))1030#define pmd_wrprotect(pmd) pte_pmd(pte_wrprotect(pmd_pte(pmd)))1031#define pmd_mkdirty(pmd) pte_pmd(pte_mkdirty(pmd_pte(pmd)))1032#define pmd_mkclean(pmd) pte_pmd(pte_mkclean(pmd_pte(pmd)))1033#define pmd_mkyoung(pmd) pte_pmd(pte_mkyoung(pmd_pte(pmd)))1034#define pmd_mkwrite_novma(pmd) pte_pmd(pte_mkwrite_novma(pmd_pte(pmd)))10351036#ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY1037#define pmd_soft_dirty(pmd) pte_soft_dirty(pmd_pte(pmd))1038#define pmd_mksoft_dirty(pmd) pte_pmd(pte_mksoft_dirty(pmd_pte(pmd)))1039#define pmd_clear_soft_dirty(pmd) pte_pmd(pte_clear_soft_dirty(pmd_pte(pmd)))10401041#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION1042#define pmd_swp_mksoft_dirty(pmd) pte_pmd(pte_swp_mksoft_dirty(pmd_pte(pmd)))1043#define pmd_swp_soft_dirty(pmd) pte_swp_soft_dirty(pmd_pte(pmd))1044#define pmd_swp_clear_soft_dirty(pmd) pte_pmd(pte_swp_clear_soft_dirty(pmd_pte(pmd)))1045#endif1046#endif /* CONFIG_HAVE_ARCH_SOFT_DIRTY */10471048#ifdef CONFIG_NUMA_BALANCING1049static inline int pmd_protnone(pmd_t pmd)1050{1051return pte_protnone(pmd_pte(pmd));1052}1053#endif /* CONFIG_NUMA_BALANCING */10541055#define pmd_write(pmd) pte_write(pmd_pte(pmd))10561057#define pmd_access_permitted pmd_access_permitted1058static inline bool pmd_access_permitted(pmd_t pmd, bool write)1059{1060/*1061* pmdp_invalidate sets this combination (which is not caught by1062* !pte_present() check in pte_access_permitted), to prevent1063* lock-free lookups, as part of the serialize_against_pte_lookup()1064* synchronisation.1065*1066* This also catches the case where the PTE's hardware PRESENT bit is1067* cleared while TLB is flushed, which is suboptimal but should not1068* be frequent.1069*/1070if (pmd_is_serializing(pmd))1071return false;10721073return pte_access_permitted(pmd_pte(pmd), write);1074}10751076#ifdef CONFIG_TRANSPARENT_HUGEPAGE1077extern pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot);1078extern pud_t pfn_pud(unsigned long pfn, pgprot_t pgprot);1079extern pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot);1080extern pud_t pud_modify(pud_t pud, pgprot_t newprot);1081extern void set_pmd_at(struct mm_struct *mm, unsigned long addr,1082pmd_t *pmdp, pmd_t pmd);1083extern void set_pud_at(struct mm_struct *mm, unsigned long addr,1084pud_t *pudp, pud_t pud);10851086static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,1087unsigned long addr, pmd_t *pmd)1088{1089}10901091static inline void update_mmu_cache_pud(struct vm_area_struct *vma,1092unsigned long addr, pud_t *pud)1093{1094}10951096extern int hash__has_transparent_hugepage(void);1097static inline int has_transparent_hugepage(void)1098{1099if (radix_enabled())1100return radix__has_transparent_hugepage();1101return hash__has_transparent_hugepage();1102}1103#define has_transparent_hugepage has_transparent_hugepage11041105static inline int has_transparent_pud_hugepage(void)1106{1107if (radix_enabled())1108return radix__has_transparent_pud_hugepage();1109return 0;1110}1111#define has_transparent_pud_hugepage has_transparent_pud_hugepage11121113static inline unsigned long1114pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, pmd_t *pmdp,1115unsigned long clr, unsigned long set)1116{1117if (radix_enabled())1118return radix__pmd_hugepage_update(mm, addr, pmdp, clr, set);1119return hash__pmd_hugepage_update(mm, addr, pmdp, clr, set);1120}11211122static inline unsigned long1123pud_hugepage_update(struct mm_struct *mm, unsigned long addr, pud_t *pudp,1124unsigned long clr, unsigned long set)1125{1126if (radix_enabled())1127return radix__pud_hugepage_update(mm, addr, pudp, clr, set);1128BUG();1129return pud_val(*pudp);1130}11311132/*1133* For radix we should always find H_PAGE_HASHPTE zero. Hence1134* the below will work for radix too1135*/1136static inline int __pmdp_test_and_clear_young(struct mm_struct *mm,1137unsigned long addr, pmd_t *pmdp)1138{1139unsigned long old;11401141if ((pmd_raw(*pmdp) & cpu_to_be64(_PAGE_ACCESSED | H_PAGE_HASHPTE)) == 0)1142return 0;1143old = pmd_hugepage_update(mm, addr, pmdp, _PAGE_ACCESSED, 0);1144return ((old & _PAGE_ACCESSED) != 0);1145}11461147static inline int __pudp_test_and_clear_young(struct mm_struct *mm,1148unsigned long addr, pud_t *pudp)1149{1150unsigned long old;11511152if ((pud_raw(*pudp) & cpu_to_be64(_PAGE_ACCESSED | H_PAGE_HASHPTE)) == 0)1153return 0;1154old = pud_hugepage_update(mm, addr, pudp, _PAGE_ACCESSED, 0);1155return ((old & _PAGE_ACCESSED) != 0);1156}11571158#define __HAVE_ARCH_PMDP_SET_WRPROTECT1159static inline void pmdp_set_wrprotect(struct mm_struct *mm, unsigned long addr,1160pmd_t *pmdp)1161{1162if (pmd_write(*pmdp))1163pmd_hugepage_update(mm, addr, pmdp, _PAGE_WRITE, 0);1164}11651166#define __HAVE_ARCH_PUDP_SET_WRPROTECT1167static inline void pudp_set_wrprotect(struct mm_struct *mm, unsigned long addr,1168pud_t *pudp)1169{1170if (pud_write(*pudp))1171pud_hugepage_update(mm, addr, pudp, _PAGE_WRITE, 0);1172}11731174/*1175* Only returns true for a THP. False for pmd migration entry.1176* We also need to return true when we come across a pte that1177* in between a thp split. While splitting THP, we mark the pmd1178* invalid (pmdp_invalidate()) before we set it with pte page1179* address. A pmd_trans_huge() check against a pmd entry during that time1180* should return true.1181* We should not call this on a hugetlb entry. We should check for HugeTLB1182* entry using vma->vm_flags1183* The page table walk rule is explained in Documentation/mm/transhuge.rst1184*/1185static inline int pmd_trans_huge(pmd_t pmd)1186{1187if (!pmd_present(pmd))1188return false;11891190if (radix_enabled())1191return radix__pmd_trans_huge(pmd);1192return hash__pmd_trans_huge(pmd);1193}11941195static inline int pud_trans_huge(pud_t pud)1196{1197if (!pud_present(pud))1198return false;11991200if (radix_enabled())1201return radix__pud_trans_huge(pud);1202return 0;1203}120412051206#define __HAVE_ARCH_PMD_SAME1207static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)1208{1209if (radix_enabled())1210return radix__pmd_same(pmd_a, pmd_b);1211return hash__pmd_same(pmd_a, pmd_b);1212}12131214#define pud_same pud_same1215static inline int pud_same(pud_t pud_a, pud_t pud_b)1216{1217if (radix_enabled())1218return radix__pud_same(pud_a, pud_b);1219return hash__pud_same(pud_a, pud_b);1220}122112221223static inline pmd_t __pmd_mkhuge(pmd_t pmd)1224{1225if (radix_enabled())1226return radix__pmd_mkhuge(pmd);1227return hash__pmd_mkhuge(pmd);1228}12291230static inline pud_t __pud_mkhuge(pud_t pud)1231{1232if (radix_enabled())1233return radix__pud_mkhuge(pud);1234BUG();1235return pud;1236}12371238/*1239* pfn_pmd return a pmd_t that can be used as pmd pte entry.1240*/1241static inline pmd_t pmd_mkhuge(pmd_t pmd)1242{1243#ifdef CONFIG_DEBUG_VM1244if (radix_enabled())1245WARN_ON((pmd_raw(pmd) & cpu_to_be64(_PAGE_PTE)) == 0);1246else1247WARN_ON((pmd_raw(pmd) & cpu_to_be64(_PAGE_PTE | H_PAGE_THP_HUGE)) !=1248cpu_to_be64(_PAGE_PTE | H_PAGE_THP_HUGE));1249#endif1250return pmd;1251}12521253static inline pud_t pud_mkhuge(pud_t pud)1254{1255#ifdef CONFIG_DEBUG_VM1256if (radix_enabled())1257WARN_ON((pud_raw(pud) & cpu_to_be64(_PAGE_PTE)) == 0);1258else1259WARN_ON(1);1260#endif1261return pud;1262}126312641265#define __HAVE_ARCH_PMDP_SET_ACCESS_FLAGS1266extern int pmdp_set_access_flags(struct vm_area_struct *vma,1267unsigned long address, pmd_t *pmdp,1268pmd_t entry, int dirty);1269#define __HAVE_ARCH_PUDP_SET_ACCESS_FLAGS1270extern int pudp_set_access_flags(struct vm_area_struct *vma,1271unsigned long address, pud_t *pudp,1272pud_t entry, int dirty);12731274#define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG1275extern int pmdp_test_and_clear_young(struct vm_area_struct *vma,1276unsigned long address, pmd_t *pmdp);1277#define __HAVE_ARCH_PUDP_TEST_AND_CLEAR_YOUNG1278extern int pudp_test_and_clear_young(struct vm_area_struct *vma,1279unsigned long address, pud_t *pudp);128012811282#define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR1283static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm,1284unsigned long addr, pmd_t *pmdp)1285{1286if (radix_enabled())1287return radix__pmdp_huge_get_and_clear(mm, addr, pmdp);1288return hash__pmdp_huge_get_and_clear(mm, addr, pmdp);1289}12901291#define __HAVE_ARCH_PUDP_HUGE_GET_AND_CLEAR1292static inline pud_t pudp_huge_get_and_clear(struct mm_struct *mm,1293unsigned long addr, pud_t *pudp)1294{1295if (radix_enabled())1296return radix__pudp_huge_get_and_clear(mm, addr, pudp);1297BUG();1298return *pudp;1299}13001301static inline pmd_t pmdp_collapse_flush(struct vm_area_struct *vma,1302unsigned long address, pmd_t *pmdp)1303{1304if (radix_enabled())1305return radix__pmdp_collapse_flush(vma, address, pmdp);1306return hash__pmdp_collapse_flush(vma, address, pmdp);1307}1308#define pmdp_collapse_flush pmdp_collapse_flush13091310#define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR_FULL1311pmd_t pmdp_huge_get_and_clear_full(struct vm_area_struct *vma,1312unsigned long addr,1313pmd_t *pmdp, int full);13141315#define __HAVE_ARCH_PUDP_HUGE_GET_AND_CLEAR_FULL1316pud_t pudp_huge_get_and_clear_full(struct vm_area_struct *vma,1317unsigned long addr,1318pud_t *pudp, int full);13191320#define __HAVE_ARCH_PGTABLE_DEPOSIT1321static inline void pgtable_trans_huge_deposit(struct mm_struct *mm,1322pmd_t *pmdp, pgtable_t pgtable)1323{1324if (radix_enabled())1325return radix__pgtable_trans_huge_deposit(mm, pmdp, pgtable);1326return hash__pgtable_trans_huge_deposit(mm, pmdp, pgtable);1327}13281329#define __HAVE_ARCH_PGTABLE_WITHDRAW1330static inline pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm,1331pmd_t *pmdp)1332{1333if (radix_enabled())1334return radix__pgtable_trans_huge_withdraw(mm, pmdp);1335return hash__pgtable_trans_huge_withdraw(mm, pmdp);1336}13371338#define __HAVE_ARCH_PMDP_INVALIDATE1339extern pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,1340pmd_t *pmdp);1341extern pud_t pudp_invalidate(struct vm_area_struct *vma, unsigned long address,1342pud_t *pudp);13431344#define pmd_move_must_withdraw pmd_move_must_withdraw1345struct spinlock;1346extern int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,1347struct spinlock *old_pmd_ptl,1348struct vm_area_struct *vma);1349/*1350* Hash translation mode use the deposited table to store hash pte1351* slot information.1352*/1353#define arch_needs_pgtable_deposit arch_needs_pgtable_deposit1354static inline bool arch_needs_pgtable_deposit(void)1355{1356if (radix_enabled())1357return false;1358return true;1359}1360extern void serialize_against_pte_lookup(struct mm_struct *mm);13611362#endif /* CONFIG_TRANSPARENT_HUGEPAGE */13631364#define __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION1365pte_t ptep_modify_prot_start(struct vm_area_struct *, unsigned long, pte_t *);1366void ptep_modify_prot_commit(struct vm_area_struct *, unsigned long,1367pte_t *, pte_t, pte_t);13681369/*1370* Returns true for a R -> RW upgrade of pte1371*/1372static inline bool is_pte_rw_upgrade(unsigned long old_val, unsigned long new_val)1373{1374if (!(old_val & _PAGE_READ))1375return false;13761377if ((!(old_val & _PAGE_WRITE)) && (new_val & _PAGE_WRITE))1378return true;13791380return false;1381}13821383#endif /* __ASSEMBLY__ */1384#endif /* _ASM_POWERPC_BOOK3S_64_PGTABLE_H_ */138513861387