File Index
Files and directories
Sign in
FILE

page.h

File preview with syntax highlighting.

linux-6.19.14/arch/s390/include/asm/page.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 *  S390 version
  4 *    Copyright IBM Corp. 1999, 2000
  5 *    Author(s): Hartmut Penner (hp@de.ibm.com)
  6 */
  7
  8#ifndef _S390_PAGE_H
  9#define _S390_PAGE_H
 10
 11#include <linux/const.h>
 12#include <asm/types.h>
 13#include <asm/asm.h>
 14
 15#include <vdso/page.h>
 16
 17#define PAGE_DEFAULT_ACC	_AC(0, UL)
 18/* storage-protection override */
 19#define PAGE_SPO_ACC		9
 20#define PAGE_DEFAULT_KEY	(PAGE_DEFAULT_ACC << 4)
 21
 22#define HPAGE_SHIFT	20
 23#define HPAGE_SIZE	(1UL << HPAGE_SHIFT)
 24#define HPAGE_MASK	(~(HPAGE_SIZE - 1))
 25#define HUGETLB_PAGE_ORDER	(HPAGE_SHIFT - PAGE_SHIFT)
 26#define HUGE_MAX_HSTATE		2
 27
 28#define ARCH_HAS_SETCLEAR_HUGE_PTE
 29#define ARCH_HAS_HUGE_PTE_TYPE
 30#define ARCH_HAS_PREPARE_HUGEPAGE
 31#define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH
 32
 33#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
 34
 35#include <asm/setup.h>
 36#ifndef __ASSEMBLER__
 37
 38void __storage_key_init_range(unsigned long start, unsigned long end);
 39
 40static inline void storage_key_init_range(unsigned long start, unsigned long end)
 41{
 42	if (PAGE_DEFAULT_KEY != 0)
 43		__storage_key_init_range(start, end);
 44}
 45
 46#define clear_page(page)	memset((page), 0, PAGE_SIZE)
 47
 48/*
 49 * copy_page uses the mvcl instruction with 0xb0 padding byte in order to
 50 * bypass caches when copying a page. Especially when copying huge pages
 51 * this keeps L1 and L2 data caches alive.
 52 */
 53static inline void copy_page(void *to, void *from)
 54{
 55	union register_pair dst, src;
 56
 57	dst.even = (unsigned long) to;
 58	dst.odd  = 0x1000;
 59	src.even = (unsigned long) from;
 60	src.odd  = 0xb0001000;
 61
 62	asm volatile(
 63		"	mvcl	%[dst],%[src]"
 64		: [dst] "+&d" (dst.pair), [src] "+&d" (src.pair)
 65		: : "memory", "cc");
 66}
 67
 68#define clear_user_page(page, vaddr, pg)	clear_page(page)
 69#define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
 70
 71#define vma_alloc_zeroed_movable_folio(vma, vaddr) \
 72	vma_alloc_folio(GFP_HIGHUSER_MOVABLE | __GFP_ZERO, 0, vma, vaddr)
 73
 74#ifdef CONFIG_STRICT_MM_TYPECHECKS
 75#define STRICT_MM_TYPECHECKS
 76#endif
 77
 78#ifdef STRICT_MM_TYPECHECKS
 79
 80typedef struct { unsigned long pgprot; } pgprot_t;
 81typedef struct { unsigned long pgste; } pgste_t;
 82typedef struct { unsigned long pte; } pte_t;
 83typedef struct { unsigned long pmd; } pmd_t;
 84typedef struct { unsigned long pud; } pud_t;
 85typedef struct { unsigned long p4d; } p4d_t;
 86typedef struct { unsigned long pgd; } pgd_t;
 87
 88#define DEFINE_PGVAL_FUNC(name)						\
 89static __always_inline unsigned long name ## _val(name ## _t name)	\
 90{									\
 91	return name.name;						\
 92}
 93
 94#else /* STRICT_MM_TYPECHECKS */
 95
 96typedef unsigned long pgprot_t;
 97typedef unsigned long pgste_t;
 98typedef unsigned long pte_t;
 99typedef unsigned long pmd_t;
100typedef unsigned long pud_t;
101typedef unsigned long p4d_t;
102typedef unsigned long pgd_t;
103
104#define DEFINE_PGVAL_FUNC(name)						\
105static __always_inline unsigned long name ## _val(name ## _t name)	\
106{									\
107	return name;							\
108}
109
110#endif /* STRICT_MM_TYPECHECKS */
111
112DEFINE_PGVAL_FUNC(pgprot)
113DEFINE_PGVAL_FUNC(pgste)
114DEFINE_PGVAL_FUNC(pte)
115DEFINE_PGVAL_FUNC(pmd)
116DEFINE_PGVAL_FUNC(pud)
117DEFINE_PGVAL_FUNC(p4d)
118DEFINE_PGVAL_FUNC(pgd)
119
120typedef pte_t *pgtable_t;
121
122#define __pgprot(x)	((pgprot_t) { (x) } )
123#define __pgste(x)	((pgste_t) { (x) } )
124#define __pte(x)        ((pte_t) { (x) } )
125#define __pmd(x)        ((pmd_t) { (x) } )
126#define __pud(x)	((pud_t) { (x) } )
127#define __p4d(x)	((p4d_t) { (x) } )
128#define __pgd(x)        ((pgd_t) { (x) } )
129
130static inline void page_set_storage_key(unsigned long addr,
131					unsigned char skey, int mapped)
132{
133	if (!mapped) {
134		asm volatile(
135			"	.insn	rrf,0xb22b0000,%[skey],%[addr],8,0"
136			:
137			: [skey] "d" (skey), [addr] "a" (addr)
138			: "memory");
139	} else {
140		asm volatile(
141			"	sske	 %[skey],%[addr]"
142			:
143			: [skey] "d" (skey), [addr] "a" (addr)
144			: "memory");
145	}
146}
147
148static inline unsigned char page_get_storage_key(unsigned long addr)
149{
150	unsigned char skey;
151
152	asm volatile("iske %0,%1" : "=d" (skey) : "a" (addr));
153	return skey;
154}
155
156static inline int page_reset_referenced(unsigned long addr)
157{
158	int cc;
159
160	asm volatile(
161		"	rrbe	0,%[addr]\n"
162		CC_IPM(cc)
163		: CC_OUT(cc, cc)
164		: [addr] "a" (addr)
165		: CC_CLOBBER);
166	return CC_TRANSFORM(cc);
167}
168
169int split_pud_page(pud_t *pudp, unsigned long addr);
170
171/* Bits int the storage key */
172#define _PAGE_CHANGED		0x02	/* HW changed bit		*/
173#define _PAGE_REFERENCED	0x04	/* HW referenced bit		*/
174#define _PAGE_FP_BIT		0x08	/* HW fetch protection bit	*/
175#define _PAGE_ACC_BITS		0xf0	/* HW access control bits	*/
176
177struct page;
178struct folio;
179void arch_free_page(struct page *page, int order);
180void arch_alloc_page(struct page *page, int order);
181
182static inline int devmem_is_allowed(unsigned long pfn)
183{
184	return 0;
185}
186
187#define HAVE_ARCH_FREE_PAGE
188#define HAVE_ARCH_ALLOC_PAGE
189
190int arch_make_folio_accessible(struct folio *folio);
191#define HAVE_ARCH_MAKE_FOLIO_ACCESSIBLE
192
193struct vm_layout {
194	unsigned long kaslr_offset;
195	unsigned long kaslr_offset_phys;
196	unsigned long identity_base;
197	unsigned long identity_size;
198};
199
200extern struct vm_layout vm_layout;
201
202#define __kaslr_offset		vm_layout.kaslr_offset
203#define __kaslr_offset_phys	vm_layout.kaslr_offset_phys
204#ifdef CONFIG_RANDOMIZE_IDENTITY_BASE
205#define __identity_base		vm_layout.identity_base
206#else
207#define __identity_base		0UL
208#endif
209#define ident_map_size		vm_layout.identity_size
210
211static inline unsigned long kaslr_offset(void)
212{
213	return __kaslr_offset;
214}
215
216extern int __kaslr_enabled;
217static inline int kaslr_enabled(void)
218{
219	if (IS_ENABLED(CONFIG_RANDOMIZE_BASE))
220		return __kaslr_enabled;
221	return 0;
222}
223
224#define __PAGE_OFFSET		__identity_base
225#define PAGE_OFFSET		__PAGE_OFFSET
226
227#ifdef __DECOMPRESSOR
228
229#define __pa_nodebug(x)		((unsigned long)(x))
230#define __pa(x)			__pa_nodebug(x)
231#define __pa32(x)		__pa(x)
232#define __va(x)			((void *)(unsigned long)(x))
233
234#else /* __DECOMPRESSOR */
235
236static inline unsigned long __pa_nodebug(unsigned long x)
237{
238	if (x < __kaslr_offset)
239		return x - __identity_base;
240	return x - __kaslr_offset + __kaslr_offset_phys;
241}
242
243#ifdef CONFIG_DEBUG_VIRTUAL
244
245unsigned long __phys_addr(unsigned long x, bool is_31bit);
246
247#else /* CONFIG_DEBUG_VIRTUAL */
248
249static inline unsigned long __phys_addr(unsigned long x, bool is_31bit)
250{
251	return __pa_nodebug(x);
252}
253
254#endif /* CONFIG_DEBUG_VIRTUAL */
255
256#define __pa(x)			__phys_addr((unsigned long)(x), false)
257#define __pa32(x)		__phys_addr((unsigned long)(x), true)
258#define __va(x)			((void *)((unsigned long)(x) + __identity_base))
259
260#endif /* __DECOMPRESSOR */
261
262#define phys_to_pfn(phys)	((phys) >> PAGE_SHIFT)
263#define pfn_to_phys(pfn)	((pfn) << PAGE_SHIFT)
264
265#define phys_to_folio(phys)	page_folio(phys_to_page(phys))
266#define folio_to_phys(page)	pfn_to_phys(folio_pfn(folio))
267
268static inline void *pfn_to_virt(unsigned long pfn)
269{
270	return __va(pfn_to_phys(pfn));
271}
272
273static inline unsigned long virt_to_pfn(const void *kaddr)
274{
275	return phys_to_pfn(__pa(kaddr));
276}
277
278#define pfn_to_kaddr(pfn)	pfn_to_virt(pfn)
279
280#define virt_to_page(kaddr)	pfn_to_page(virt_to_pfn(kaddr))
281#define page_to_virt(page)	pfn_to_virt(page_to_pfn(page))
282
283#define virt_addr_valid(kaddr)	pfn_valid(phys_to_pfn(__pa_nodebug((unsigned long)(kaddr))))
284
285#define VM_DATA_DEFAULT_FLAGS	VM_DATA_FLAGS_NON_EXEC
286
287#endif /* !__ASSEMBLER__ */
288
289#include <asm-generic/memory_model.h>
290#include <asm-generic/getorder.h>
291
292#define AMODE31_SIZE		(3 * PAGE_SIZE)
293
294#define KERNEL_IMAGE_SIZE	(512 * 1024 * 1024)
295#define __NO_KASLR_START_KERNEL	CONFIG_KERNEL_IMAGE_BASE
296#define __NO_KASLR_END_KERNEL	(__NO_KASLR_START_KERNEL + KERNEL_IMAGE_SIZE)
297
298#define TEXT_OFFSET		0x100000
299
300#endif /* _S390_PAGE_H */
~/ Read-only file preview.