13eca86e7SMark Rutland /*
23eca86e7SMark Rutland  * Copyright (C) 2016 ARM Ltd.
33eca86e7SMark Rutland  *
43eca86e7SMark Rutland  * This program is free software; you can redistribute it and/or modify
53eca86e7SMark Rutland  * it under the terms of the GNU General Public License version 2 as
63eca86e7SMark Rutland  * published by the Free Software Foundation.
73eca86e7SMark Rutland  *
83eca86e7SMark Rutland  * This program is distributed in the hope that it will be useful,
93eca86e7SMark Rutland  * but WITHOUT ANY WARRANTY; without even the implied warranty of
103eca86e7SMark Rutland  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
113eca86e7SMark Rutland  * GNU General Public License for more details.
123eca86e7SMark Rutland  *
133eca86e7SMark Rutland  * You should have received a copy of the GNU General Public License
143eca86e7SMark Rutland  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
153eca86e7SMark Rutland  */
163eca86e7SMark Rutland #ifndef __ASM_PGTABLE_PROT_H
173eca86e7SMark Rutland #define __ASM_PGTABLE_PROT_H
183eca86e7SMark Rutland 
193eca86e7SMark Rutland #include <asm/memory.h>
203eca86e7SMark Rutland #include <asm/pgtable-hwdef.h>
213eca86e7SMark Rutland 
223eca86e7SMark Rutland #include <linux/const.h>
233eca86e7SMark Rutland 
243eca86e7SMark Rutland /*
253eca86e7SMark Rutland  * Software defined PTE bits definition.
263eca86e7SMark Rutland  */
273eca86e7SMark Rutland #define PTE_VALID		(_AT(pteval_t, 1) << 0)
283eca86e7SMark Rutland #define PTE_WRITE		(PTE_DBM)		 /* same as DBM (51) */
293eca86e7SMark Rutland #define PTE_DIRTY		(_AT(pteval_t, 1) << 55)
303eca86e7SMark Rutland #define PTE_SPECIAL		(_AT(pteval_t, 1) << 56)
313eca86e7SMark Rutland #define PTE_PROT_NONE		(_AT(pteval_t, 1) << 58) /* only when !PTE_VALID */
323eca86e7SMark Rutland 
333eca86e7SMark Rutland #ifndef __ASSEMBLY__
343eca86e7SMark Rutland 
353eca86e7SMark Rutland #include <asm/pgtable-types.h>
363eca86e7SMark Rutland 
37e046eb0cSWill Deacon #define _PROT_DEFAULT		(PTE_TYPE_PAGE | PTE_AF | PTE_SHARED)
38e046eb0cSWill Deacon #define _PROT_SECT_DEFAULT	(PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S)
39e046eb0cSWill Deacon 
4041acec62SWill Deacon #define PTE_MAYBE_NG		(arm64_kernel_unmapped_at_el0() ? PTE_NG : 0)
4141acec62SWill Deacon #define PMD_MAYBE_NG		(arm64_kernel_unmapped_at_el0() ? PMD_SECT_NG : 0)
4241acec62SWill Deacon 
4341acec62SWill Deacon #define PROT_DEFAULT		(_PROT_DEFAULT | PTE_MAYBE_NG)
4441acec62SWill Deacon #define PROT_SECT_DEFAULT	(_PROT_SECT_DEFAULT | PMD_MAYBE_NG)
453eca86e7SMark Rutland 
463eca86e7SMark Rutland #define PROT_DEVICE_nGnRnE	(PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRnE))
473eca86e7SMark Rutland #define PROT_DEVICE_nGnRE	(PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_DEVICE_nGnRE))
483eca86e7SMark Rutland #define PROT_NORMAL_NC		(PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_NC))
493eca86e7SMark Rutland #define PROT_NORMAL_WT		(PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL_WT))
503eca86e7SMark Rutland #define PROT_NORMAL		(PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE | PTE_ATTRINDX(MT_NORMAL))
513eca86e7SMark Rutland 
523eca86e7SMark Rutland #define PROT_SECT_DEVICE_nGnRE	(PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE))
533eca86e7SMark Rutland #define PROT_SECT_NORMAL	(PROT_SECT_DEFAULT | PMD_SECT_PXN | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
543eca86e7SMark Rutland #define PROT_SECT_NORMAL_EXEC	(PROT_SECT_DEFAULT | PMD_SECT_UXN | PMD_ATTRINDX(MT_NORMAL))
553eca86e7SMark Rutland 
5641acec62SWill Deacon #define _PAGE_DEFAULT		(_PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL))
5741acec62SWill Deacon #define _HYP_PAGE_DEFAULT	_PAGE_DEFAULT
583eca86e7SMark Rutland 
5941acec62SWill Deacon #define PAGE_KERNEL		__pgprot(PROT_NORMAL)
6041acec62SWill Deacon #define PAGE_KERNEL_RO		__pgprot((PROT_NORMAL & ~PTE_WRITE) | PTE_RDONLY)
6141acec62SWill Deacon #define PAGE_KERNEL_ROX		__pgprot((PROT_NORMAL & ~(PTE_WRITE | PTE_PXN)) | PTE_RDONLY)
6241acec62SWill Deacon #define PAGE_KERNEL_EXEC	__pgprot(PROT_NORMAL & ~PTE_PXN)
6341acec62SWill Deacon #define PAGE_KERNEL_EXEC_CONT	__pgprot((PROT_NORMAL & ~PTE_PXN) | PTE_CONT)
643eca86e7SMark Rutland 
65e046eb0cSWill Deacon #define PAGE_HYP		__pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_HYP_XN)
66e046eb0cSWill Deacon #define PAGE_HYP_EXEC		__pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY)
67e046eb0cSWill Deacon #define PAGE_HYP_RO		__pgprot(_HYP_PAGE_DEFAULT | PTE_HYP | PTE_RDONLY | PTE_HYP_XN)
683eca86e7SMark Rutland #define PAGE_HYP_DEVICE		__pgprot(PROT_DEVICE_nGnRE | PTE_HYP)
693eca86e7SMark Rutland 
7041acec62SWill Deacon #define PAGE_S2			__pgprot(_PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_NORMAL) | PTE_S2_RDONLY)
7141acec62SWill Deacon #define PAGE_S2_DEVICE		__pgprot(_PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_DEVICE_nGnRE) | PTE_S2_RDONLY | PTE_UXN)
723eca86e7SMark Rutland 
73e046eb0cSWill Deacon #define PAGE_NONE		__pgprot(((_PAGE_DEFAULT) & ~PTE_VALID) | PTE_PROT_NONE | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
743eca86e7SMark Rutland #define PAGE_SHARED		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE)
753eca86e7SMark Rutland #define PAGE_SHARED_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE)
7673e86cb0SCatalin Marinas #define PAGE_READONLY		__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
7773e86cb0SCatalin Marinas #define PAGE_READONLY_EXEC	__pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN)
7873e86cb0SCatalin Marinas #define PAGE_EXECONLY		__pgprot(_PAGE_DEFAULT | PTE_RDONLY | PTE_NG | PTE_PXN)
793eca86e7SMark Rutland 
803eca86e7SMark Rutland #define __P000  PAGE_NONE
813eca86e7SMark Rutland #define __P001  PAGE_READONLY
8273e86cb0SCatalin Marinas #define __P010  PAGE_READONLY
8373e86cb0SCatalin Marinas #define __P011  PAGE_READONLY
84cab15ce6SCatalin Marinas #define __P100  PAGE_EXECONLY
853eca86e7SMark Rutland #define __P101  PAGE_READONLY_EXEC
8673e86cb0SCatalin Marinas #define __P110  PAGE_READONLY_EXEC
8773e86cb0SCatalin Marinas #define __P111  PAGE_READONLY_EXEC
883eca86e7SMark Rutland 
893eca86e7SMark Rutland #define __S000  PAGE_NONE
903eca86e7SMark Rutland #define __S001  PAGE_READONLY
913eca86e7SMark Rutland #define __S010  PAGE_SHARED
923eca86e7SMark Rutland #define __S011  PAGE_SHARED
93cab15ce6SCatalin Marinas #define __S100  PAGE_EXECONLY
943eca86e7SMark Rutland #define __S101  PAGE_READONLY_EXEC
953eca86e7SMark Rutland #define __S110  PAGE_SHARED_EXEC
963eca86e7SMark Rutland #define __S111  PAGE_SHARED_EXEC
973eca86e7SMark Rutland 
983eca86e7SMark Rutland #endif /* __ASSEMBLY__ */
993eca86e7SMark Rutland 
1003eca86e7SMark Rutland #endif /* __ASM_PGTABLE_PROT_H */
101