Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4 */
5#ifndef _ASM_PGTABLE_BITS_H
6#define _ASM_PGTABLE_BITS_H
7
8/* Page table bits */
9
10#ifdef CONFIG_32BIT
11#define _PAGE_VALID_SHIFT 0
12#define _PAGE_ACCESSED_SHIFT 0 /* Reuse Valid for Accessed */
13#define _PAGE_DIRTY_SHIFT 1
14#define _PAGE_PLV_SHIFT 2 /* 2~3, two bits */
15#define _CACHE_SHIFT 4 /* 4~5, two bits */
16#define _PAGE_GLOBAL_SHIFT 6
17#define _PAGE_HUGE_SHIFT 6 /* HUGE is a PMD bit */
18#define _PAGE_PRESENT_SHIFT 7
19#define _PAGE_PFN_SHIFT 8
20#define _PAGE_HGLOBAL_SHIFT 12 /* HGlobal is a PMD bit */
21#define _PAGE_SWP_EXCLUSIVE_SHIFT 13
22#define _PAGE_PFN_END_SHIFT 28
23#define _PAGE_WRITE_SHIFT 29
24#define _PAGE_MODIFIED_SHIFT 30
25#define _PAGE_PRESENT_INVALID_SHIFT 31
26#endif
27
28#ifdef CONFIG_64BIT
29#define _PAGE_VALID_SHIFT 0
30#define _PAGE_ACCESSED_SHIFT 0 /* Reuse Valid for Accessed */
31#define _PAGE_DIRTY_SHIFT 1
32#define _PAGE_PLV_SHIFT 2 /* 2~3, two bits */
33#define _CACHE_SHIFT 4 /* 4~5, two bits */
34#define _PAGE_GLOBAL_SHIFT 6
35#define _PAGE_HUGE_SHIFT 6 /* HUGE is a PMD bit */
36#define _PAGE_PRESENT_SHIFT 7
37#define _PAGE_WRITE_SHIFT 8
38#define _PAGE_MODIFIED_SHIFT 9
39#define _PAGE_PROTNONE_SHIFT 10
40#define _PAGE_SPECIAL_SHIFT 11
41#define _PAGE_PFN_SHIFT 12
42#define _PAGE_HGLOBAL_SHIFT 12 /* HGlobal is a PMD bit */
43#define _PAGE_SWP_EXCLUSIVE_SHIFT 23
44#define _PAGE_PFN_END_SHIFT 48
45#define _PAGE_PRESENT_INVALID_SHIFT 60
46#define _PAGE_NO_READ_SHIFT 61
47#define _PAGE_NO_EXEC_SHIFT 62
48#define _PAGE_RPLV_SHIFT 63
49#endif
50
51/* Used by software */
52#define _PAGE_PRESENT (_ULCAST_(1) << _PAGE_PRESENT_SHIFT)
53#define _PAGE_PRESENT_INVALID (_ULCAST_(1) << _PAGE_PRESENT_INVALID_SHIFT)
54#define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT)
55#define _PAGE_ACCESSED (_ULCAST_(1) << _PAGE_ACCESSED_SHIFT)
56#define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT)
57#ifdef CONFIG_32BIT
58#define _PAGE_PROTNONE 0
59#define _PAGE_SPECIAL 0
60#else
61#define _PAGE_PROTNONE (_ULCAST_(1) << _PAGE_PROTNONE_SHIFT)
62#define _PAGE_SPECIAL (_ULCAST_(1) << _PAGE_SPECIAL_SHIFT)
63#endif
64
65/* We borrow bit 13/23 to store the exclusive marker in swap PTEs. */
66#define _PAGE_SWP_EXCLUSIVE (_ULCAST_(1) << _PAGE_SWP_EXCLUSIVE_SHIFT)
67
68/* Used by TLB hardware (placed in EntryLo*) */
69#define _PAGE_VALID (_ULCAST_(1) << _PAGE_VALID_SHIFT)
70#define _PAGE_DIRTY (_ULCAST_(1) << _PAGE_DIRTY_SHIFT)
71#define _PAGE_PLV (_ULCAST_(3) << _PAGE_PLV_SHIFT)
72#define _PAGE_GLOBAL (_ULCAST_(1) << _PAGE_GLOBAL_SHIFT)
73#define _PAGE_HUGE (_ULCAST_(1) << _PAGE_HUGE_SHIFT)
74#define _PAGE_HGLOBAL (_ULCAST_(1) << _PAGE_HGLOBAL_SHIFT)
75#ifdef CONFIG_32BIT
76#define _PAGE_NO_READ 0
77#define _PAGE_NO_EXEC 0
78#define _PAGE_RPLV 0
79#else
80#define _PAGE_NO_READ (_ULCAST_(1) << _PAGE_NO_READ_SHIFT)
81#define _PAGE_NO_EXEC (_ULCAST_(1) << _PAGE_NO_EXEC_SHIFT)
82#define _PAGE_RPLV (_ULCAST_(1) << _PAGE_RPLV_SHIFT)
83#endif
84#define _CACHE_MASK (_ULCAST_(3) << _CACHE_SHIFT)
85#define PFN_PTE_SHIFT (PAGE_SHIFT - 12 + _PAGE_PFN_SHIFT)
86
87#define _PAGE_USER (PLV_USER << _PAGE_PLV_SHIFT)
88#define _PAGE_KERN (PLV_KERN << _PAGE_PLV_SHIFT)
89
90#define _PFN_MASK (~((_ULCAST_(1) << (PFN_PTE_SHIFT)) - 1) & \
91 ((_ULCAST_(1) << (_PAGE_PFN_END_SHIFT)) - 1))
92
93/*
94 * Cache attributes
95 */
96#ifndef _CACHE_SUC
97#define _CACHE_SUC (0<<_CACHE_SHIFT) /* Strong-ordered UnCached */
98#endif
99#ifndef _CACHE_CC
100#define _CACHE_CC (1<<_CACHE_SHIFT) /* Coherent Cached */
101#endif
102#ifndef _CACHE_WUC
103#define _CACHE_WUC (2<<_CACHE_SHIFT) /* Weak-ordered UnCached */
104#endif
105
106#define __READABLE (_PAGE_VALID)
107#define __WRITEABLE (_PAGE_DIRTY | _PAGE_WRITE)
108
109#define _PAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV)
110#define _HPAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV | _PAGE_HUGE)
111
112#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_NO_READ | \
113 _PAGE_USER | _CACHE_CC)
114#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
115 _PAGE_USER | _CACHE_CC)
116#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _CACHE_CC)
117
118#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
119 _PAGE_GLOBAL | _PAGE_KERN | _CACHE_CC)
120#define PAGE_KERNEL_SUC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
121 _PAGE_GLOBAL | _PAGE_KERN | _CACHE_SUC)
122#define PAGE_KERNEL_WUC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
123 _PAGE_GLOBAL | _PAGE_KERN | _CACHE_WUC)
124
125#ifndef __ASSEMBLER__
126
127#define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL_SUC)
128
129#define pgprot_nx pgprot_nx
130
131static inline pgprot_t pgprot_nx(pgprot_t _prot)
132{
133 return __pgprot(pgprot_val(_prot) | _PAGE_NO_EXEC);
134}
135
136#define pgprot_noncached pgprot_noncached
137
138static inline pgprot_t pgprot_noncached(pgprot_t _prot)
139{
140 unsigned long prot = pgprot_val(_prot);
141
142 prot = (prot & ~_CACHE_MASK) | _CACHE_SUC;
143
144 return __pgprot(prot);
145}
146
147extern bool wc_enabled;
148
149#define pgprot_writecombine pgprot_writecombine
150
151static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
152{
153 unsigned long prot = pgprot_val(_prot);
154
155 prot = (prot & ~_CACHE_MASK) | (wc_enabled ? _CACHE_WUC : _CACHE_SUC);
156
157 return __pgprot(prot);
158}
159
160#endif /* !__ASSEMBLER__ */
161
162#endif /* _ASM_PGTABLE_BITS_H */