diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2012-12-07 13:35:41 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2013-06-07 09:03:31 -0400 |
commit | 363116073a26dbc2903d8417047597eebcc05273 (patch) | |
tree | df8be503ab9aa08786206b9a5b930ef7a54bf7a4 /arch/arm64/include/asm | |
parent | d683b96b072dc4680fc74964eca77e6a23d1fa6e (diff) |
arm64: KVM: define HYP and Stage-2 translation page flags
Add HYP and S2 page flags, for both normal and device memory.
Reviewed-by: Christopher Covington <cov@codeaurora.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'arch/arm64/include/asm')
-rw-r--r-- | arch/arm64/include/asm/memory.h | 6 | ||||
-rw-r--r-- | arch/arm64/include/asm/pgtable-hwdef.h | 19 | ||||
-rw-r--r-- | arch/arm64/include/asm/pgtable.h | 12 |
3 files changed, 37 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index 381f556b664e..20925bcf4e2a 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h | |||
@@ -90,6 +90,12 @@ | |||
90 | #define MT_NORMAL_NC 3 | 90 | #define MT_NORMAL_NC 3 |
91 | #define MT_NORMAL 4 | 91 | #define MT_NORMAL 4 |
92 | 92 | ||
93 | /* | ||
94 | * Memory types for Stage-2 translation | ||
95 | */ | ||
96 | #define MT_S2_NORMAL 0xf | ||
97 | #define MT_S2_DEVICE_nGnRE 0x1 | ||
98 | |||
93 | #ifndef __ASSEMBLY__ | 99 | #ifndef __ASSEMBLY__ |
94 | 100 | ||
95 | extern phys_addr_t memstart_addr; | 101 | extern phys_addr_t memstart_addr; |
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index 75fd13d289b9..66367c6c6527 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h | |||
@@ -35,6 +35,7 @@ | |||
35 | /* | 35 | /* |
36 | * Section | 36 | * Section |
37 | */ | 37 | */ |
38 | #define PMD_SECT_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ | ||
38 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) | 39 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) |
39 | #define PMD_SECT_AF (_AT(pmdval_t, 1) << 10) | 40 | #define PMD_SECT_AF (_AT(pmdval_t, 1) << 10) |
40 | #define PMD_SECT_NG (_AT(pmdval_t, 1) << 11) | 41 | #define PMD_SECT_NG (_AT(pmdval_t, 1) << 11) |
@@ -68,6 +69,24 @@ | |||
68 | #define PTE_ATTRINDX_MASK (_AT(pteval_t, 7) << 2) | 69 | #define PTE_ATTRINDX_MASK (_AT(pteval_t, 7) << 2) |
69 | 70 | ||
70 | /* | 71 | /* |
72 | * 2nd stage PTE definitions | ||
73 | */ | ||
74 | #define PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[2:1] */ | ||
75 | #define PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ | ||
76 | |||
77 | /* | ||
78 | * Memory Attribute override for Stage-2 (MemAttr[3:0]) | ||
79 | */ | ||
80 | #define PTE_S2_MEMATTR(t) (_AT(pteval_t, (t)) << 2) | ||
81 | #define PTE_S2_MEMATTR_MASK (_AT(pteval_t, 0xf) << 2) | ||
82 | |||
83 | /* | ||
84 | * EL2/HYP PTE/PMD definitions | ||
85 | */ | ||
86 | #define PMD_HYP PMD_SECT_USER | ||
87 | #define PTE_HYP PTE_USER | ||
88 | |||
89 | /* | ||
71 | * 40-bit physical address supported. | 90 | * 40-bit physical address supported. |
72 | */ | 91 | */ |
73 | #define PHYS_MASK_SHIFT (40) | 92 | #define PHYS_MASK_SHIFT (40) |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index e333a243bfcc..fc2915a35c52 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
@@ -76,6 +76,12 @@ extern pgprot_t pgprot_default; | |||
76 | #define PAGE_KERNEL _MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY) | 76 | #define PAGE_KERNEL _MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY) |
77 | #define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY) | 77 | #define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY) |
78 | 78 | ||
79 | #define PAGE_HYP _MOD_PROT(pgprot_default, PTE_HYP) | ||
80 | #define PAGE_HYP_DEVICE __pgprot(PROT_DEVICE_nGnRE | PTE_HYP) | ||
81 | |||
82 | #define PAGE_S2 __pgprot_modify(pgprot_default, PTE_S2_MEMATTR_MASK, PTE_S2_MEMATTR(MT_S2_NORMAL) | PTE_S2_RDONLY) | ||
83 | #define PAGE_S2_DEVICE __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_DEVICE_nGnRE) | PTE_S2_RDWR | PTE_UXN) | ||
84 | |||
79 | #define __PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE) | 85 | #define __PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE) |
80 | #define __PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) | 86 | #define __PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) |
81 | #define __PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) | 87 | #define __PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) |
@@ -197,6 +203,12 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | |||
197 | 203 | ||
198 | #define pmd_bad(pmd) (!(pmd_val(pmd) & 2)) | 204 | #define pmd_bad(pmd) (!(pmd_val(pmd) & 2)) |
199 | 205 | ||
206 | #define pmd_table(pmd) ((pmd_val(pmd) & PMD_TYPE_MASK) == \ | ||
207 | PMD_TYPE_TABLE) | ||
208 | #define pmd_sect(pmd) ((pmd_val(pmd) & PMD_TYPE_MASK) == \ | ||
209 | PMD_TYPE_SECT) | ||
210 | |||
211 | |||
200 | static inline void set_pmd(pmd_t *pmdp, pmd_t pmd) | 212 | static inline void set_pmd(pmd_t *pmdp, pmd_t pmd) |
201 | { | 213 | { |
202 | *pmdp = pmd; | 214 | *pmdp = pmd; |