pgtable.h 3.6 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3 4
#ifndef _ASM_POWERPC_PGTABLE_H
#define _ASM_POWERPC_PGTABLE_H

5
#ifndef __ASSEMBLY__
6
#include <linux/mmdebug.h>
S
Scott Wood 已提交
7
#include <linux/mmzone.h>
8 9 10
#include <asm/processor.h>		/* For TASK_SIZE */
#include <asm/mmu.h>
#include <asm/page.h>
11
#include <asm/tlbflush.h>
12

13
struct mm_struct;
14

15 16
#endif /* !__ASSEMBLY__ */

17 18 19
#ifdef CONFIG_PPC_BOOK3S
#include <asm/book3s/pgtable.h>
#else
20
#include <asm/nohash/pgtable.h>
21
#endif /* !CONFIG_PPC_BOOK3S */
L
Linus Torvalds 已提交
22

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
/* Note due to the way vm flags are laid out, the bits are XWR */
#define __P000	PAGE_NONE
#define __P001	PAGE_READONLY
#define __P010	PAGE_COPY
#define __P011	PAGE_COPY
#define __P100	PAGE_READONLY_X
#define __P101	PAGE_READONLY_X
#define __P110	PAGE_COPY_X
#define __P111	PAGE_COPY_X

#define __S000	PAGE_NONE
#define __S001	PAGE_READONLY
#define __S010	PAGE_SHARED
#define __S011	PAGE_SHARED
#define __S100	PAGE_READONLY_X
#define __S101	PAGE_READONLY_X
#define __S110	PAGE_SHARED_X
#define __S111	PAGE_SHARED_X

L
Linus Torvalds 已提交
42
#ifndef __ASSEMBLY__
43

44 45
#include <asm/tlbflush.h>

46 47 48
/* Keep these as a macros to avoid include dependency mess */
#define pte_page(x)		pfn_to_page(pte_pfn(x))
#define mk_pte(page, pgprot)	pfn_pte(page_to_pfn(page), (pgprot))
49 50 51 52 53 54 55 56 57 58
/*
 * Select all bits except the pfn
 */
static inline pgprot_t pte_pgprot(pte_t pte)
{
	unsigned long pte_flags;

	pte_flags = pte_val(pte) & ~PTE_RPN_MASK;
	return __pgprot(pte_flags);
}
59

60 61 62 63 64 65 66 67 68
/*
 * ZERO_PAGE is a global shared page that is always zero: used
 * for zero-mapped memory areas etc..
 */
extern unsigned long empty_zero_page[];
#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))

extern pgd_t swapper_pg_dir[];

S
Scott Wood 已提交
69 70
void limit_zone_pfn(enum zone_type zone, unsigned long max_pfn);
int dma_pfn_limit_to_zone(u64 pfn_limit);
71 72 73 74 75 76 77 78 79
extern void paging_init(void);

/*
 * kern_addr_valid is intended to indicate whether an address is a valid
 * kernel address.  Most 32-bit archs define it as always true (like this)
 * but most 64-bit archs actually perform a test.  What should we do here?
 */
#define kern_addr_valid(addr)	(1)

L
Linus Torvalds 已提交
80
#include <asm-generic/pgtable.h>
81 82 83 84 85 86 87 88 89 90 91


/*
 * This gets called at the end of handling a page fault, when
 * the kernel has put a new PTE into the page table for the process.
 * We use it to ensure coherency between the i-cache and d-cache
 * for the page which has just been mapped in.
 * On machines which use an MMU hash table, we use this to put a
 * corresponding HPTE into the hash table ahead of time, instead of
 * waiting for the inevitable extra hash-table miss exception.
 */
92
extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t *);
93

94
extern int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr,
95 96
		       unsigned long end, int write,
		       struct page **pages, int *nr);
97 98 99
#ifndef CONFIG_TRANSPARENT_HUGEPAGE
#define pmd_large(pmd)		0
#endif
100

101
/* can we use this in kvm */
102 103
unsigned long vmalloc_to_phys(void *vmalloc_addr);

104 105
void pgtable_cache_add(unsigned shift, void (*ctor)(void *));
void pgtable_cache_init(void);
106

107
#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_PPC32)
108 109 110 111 112
void mark_initmem_nx(void);
#else
static inline void mark_initmem_nx(void) { }
#endif

113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
/*
 * When used, PTE_FRAG_NR is defined in subarch pgtable.h
 * so we are sure it is included when arriving here.
 */
#ifdef PTE_FRAG_NR
static inline void *pte_frag_get(mm_context_t *ctx)
{
	return ctx->pte_frag;
}

static inline void pte_frag_set(mm_context_t *ctx, void *p)
{
	ctx->pte_frag = p;
}
#else
static inline void *pte_frag_get(mm_context_t *ctx)
{
	return NULL;
}

static inline void pte_frag_set(mm_context_t *ctx, void *p)
{
}
#endif

L
Linus Torvalds 已提交
138 139
#endif /* __ASSEMBLY__ */

140
#endif /* _ASM_POWERPC_PGTABLE_H */