xref: /kvm-unit-tests/lib/s390x/mmu.h (revision cd87c813b0bd1e5e4270273964a436c6a63bd88d)
16c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
249a732c7SJanosch Frank /*
349a732c7SJanosch Frank  * s390x mmu functions
449a732c7SJanosch Frank  *
549a732c7SJanosch Frank  * Copyright (c) 2018 IBM Corp
649a732c7SJanosch Frank  *
749a732c7SJanosch Frank  * Authors:
849a732c7SJanosch Frank  *	Janosch Frank <frankja@de.ibm.com>
949a732c7SJanosch Frank  */
10eb5a1bbaSCornelia Huck #ifndef _S390X_MMU_H_
11eb5a1bbaSCornelia Huck #define _S390X_MMU_H_
1249a732c7SJanosch Frank 
13*cd87c813SClaudio Imbrenda enum pgt_level {
14*cd87c813SClaudio Imbrenda 	pgtable_level_pgd = 1,
15*cd87c813SClaudio Imbrenda 	pgtable_level_p4d,
16*cd87c813SClaudio Imbrenda 	pgtable_level_pud,
17*cd87c813SClaudio Imbrenda 	pgtable_level_pmd,
18*cd87c813SClaudio Imbrenda 	pgtable_level_pte,
19*cd87c813SClaudio Imbrenda };
20*cd87c813SClaudio Imbrenda 
21*cd87c813SClaudio Imbrenda /*
22*cd87c813SClaudio Imbrenda  * Splits the pagetables down to the given DAT tables level.
23*cd87c813SClaudio Imbrenda  * Returns a pointer to the DAT table entry of the given level.
24*cd87c813SClaudio Imbrenda  * @pgtable root of the page table tree
25*cd87c813SClaudio Imbrenda  * @vaddr address whose page tables are to split
26*cd87c813SClaudio Imbrenda  * @level 3 (for 2GB pud), 4 (for 1 MB pmd) or 5 (for 4KB pages)
27*cd87c813SClaudio Imbrenda  */
28*cd87c813SClaudio Imbrenda void *split_page(pgd_t *pgtable, void *vaddr, enum pgt_level level);
29*cd87c813SClaudio Imbrenda 
30*cd87c813SClaudio Imbrenda /*
31*cd87c813SClaudio Imbrenda  * Applies the given protection bits to the given DAT tables level,
32*cd87c813SClaudio Imbrenda  * splitting if necessary.
33*cd87c813SClaudio Imbrenda  * @pgtable root of the page table tree
34*cd87c813SClaudio Imbrenda  * @vaddr address whose protection bits are to be changed
35*cd87c813SClaudio Imbrenda  * @prot the protection bits to set
36*cd87c813SClaudio Imbrenda  * @level 3 (for 2GB pud), 4 (for 1MB pmd) or 5 (for 4KB pages)
37*cd87c813SClaudio Imbrenda  */
38*cd87c813SClaudio Imbrenda void protect_dat_entry(void *vaddr, unsigned long prot, enum pgt_level level);
39*cd87c813SClaudio Imbrenda 
40*cd87c813SClaudio Imbrenda /*
41*cd87c813SClaudio Imbrenda  * Clears the given protection bits from the given DAT tables level,
42*cd87c813SClaudio Imbrenda  * splitting if necessary.
43*cd87c813SClaudio Imbrenda  * @pgtable root of the page table tree
44*cd87c813SClaudio Imbrenda  * @vaddr address whose protection bits are to be changed
45*cd87c813SClaudio Imbrenda  * @prot the protection bits to clear
46*cd87c813SClaudio Imbrenda  * @level 3 (for 2GB pud), 4 (for 1MB pmd) or 5 (for 4kB pages)
47*cd87c813SClaudio Imbrenda  */
48*cd87c813SClaudio Imbrenda void unprotect_dat_entry(void *vaddr, unsigned long prot, enum pgt_level level);
49*cd87c813SClaudio Imbrenda 
50*cd87c813SClaudio Imbrenda /*
51*cd87c813SClaudio Imbrenda  * Applies the given protection bits to the given 4kB pages range,
52*cd87c813SClaudio Imbrenda  * splitting if necessary.
53*cd87c813SClaudio Imbrenda  * @start starting address whose protection bits are to be changed
54*cd87c813SClaudio Imbrenda  * @len size in bytes
55*cd87c813SClaudio Imbrenda  * @prot the protection bits to set
56*cd87c813SClaudio Imbrenda  */
5749a732c7SJanosch Frank void protect_range(void *start, unsigned long len, unsigned long prot);
58*cd87c813SClaudio Imbrenda 
59*cd87c813SClaudio Imbrenda /*
60*cd87c813SClaudio Imbrenda  * Clears the given protection bits from the given 4kB pages range,
61*cd87c813SClaudio Imbrenda  * splitting if necessary.
62*cd87c813SClaudio Imbrenda  * @start starting address whose protection bits are to be changed
63*cd87c813SClaudio Imbrenda  * @len size in bytes
64*cd87c813SClaudio Imbrenda  * @prot the protection bits to set
65*cd87c813SClaudio Imbrenda  */
6649a732c7SJanosch Frank void unprotect_range(void *start, unsigned long len, unsigned long prot);
6749a732c7SJanosch Frank 
68*cd87c813SClaudio Imbrenda /* Similar to install_page, maps the virtual address to the physical address
69*cd87c813SClaudio Imbrenda  * for the given page tables, using 1MB large pages.
70*cd87c813SClaudio Imbrenda  * Returns a pointer to the DAT table entry.
71*cd87c813SClaudio Imbrenda  * @pgtable root of the page table tree
72*cd87c813SClaudio Imbrenda  * @phys physical address to map, must be 1MB aligned!
73*cd87c813SClaudio Imbrenda  * @vaddr virtual address to map, must be 1MB aligned!
74*cd87c813SClaudio Imbrenda  */
75*cd87c813SClaudio Imbrenda pmdval_t *install_large_page(pgd_t *pgtable, phys_addr_t phys, void *vaddr);
76*cd87c813SClaudio Imbrenda 
77*cd87c813SClaudio Imbrenda /* Similar to install_page, maps the virtual address to the physical address
78*cd87c813SClaudio Imbrenda  * for the given page tables, using 2GB huge pages.
79*cd87c813SClaudio Imbrenda  * Returns a pointer to the DAT table entry.
80*cd87c813SClaudio Imbrenda  * @pgtable root of the page table tree
81*cd87c813SClaudio Imbrenda  * @phys physical address to map, must be 2GB aligned!
82*cd87c813SClaudio Imbrenda  * @vaddr virtual address to map, must be 2GB aligned!
83*cd87c813SClaudio Imbrenda  */
84*cd87c813SClaudio Imbrenda pudval_t *install_huge_page(pgd_t *pgtable, phys_addr_t phys, void *vaddr);
85*cd87c813SClaudio Imbrenda 
86*cd87c813SClaudio Imbrenda static inline void protect_page(void *vaddr, unsigned long prot)
87*cd87c813SClaudio Imbrenda {
88*cd87c813SClaudio Imbrenda 	protect_dat_entry(vaddr, prot, pgtable_level_pte);
89*cd87c813SClaudio Imbrenda }
90*cd87c813SClaudio Imbrenda 
91*cd87c813SClaudio Imbrenda static inline void unprotect_page(void *vaddr, unsigned long prot)
92*cd87c813SClaudio Imbrenda {
93*cd87c813SClaudio Imbrenda 	unprotect_dat_entry(vaddr, prot, pgtable_level_pte);
94*cd87c813SClaudio Imbrenda }
95*cd87c813SClaudio Imbrenda 
96*cd87c813SClaudio Imbrenda void *get_dat_entry(pgd_t *pgtable, void *vaddr, unsigned int level);
97*cd87c813SClaudio Imbrenda 
9849a732c7SJanosch Frank #endif /* _ASMS390X_MMU_H_ */
99