xref: /aosp_15_r20/trusty/kernel/lib/sm/ns_mem.c (revision 344aa361028b423587d4ef3fa52a23d194628137)
1*344aa361SAndroid Build Coastguard Worker /*
2*344aa361SAndroid Build Coastguard Worker  * Copyright (c) 2015 Google Inc. All rights reserved
3*344aa361SAndroid Build Coastguard Worker  *
4*344aa361SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining
5*344aa361SAndroid Build Coastguard Worker  * a copy of this software and associated documentation files
6*344aa361SAndroid Build Coastguard Worker  * (the "Software"), to deal in the Software without restriction,
7*344aa361SAndroid Build Coastguard Worker  * including without limitation the rights to use, copy, modify, merge,
8*344aa361SAndroid Build Coastguard Worker  * publish, distribute, sublicense, and/or sell copies of the Software,
9*344aa361SAndroid Build Coastguard Worker  * and to permit persons to whom the Software is furnished to do so,
10*344aa361SAndroid Build Coastguard Worker  * subject to the following conditions:
11*344aa361SAndroid Build Coastguard Worker  *
12*344aa361SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be
13*344aa361SAndroid Build Coastguard Worker  * included in all copies or substantial portions of the Software.
14*344aa361SAndroid Build Coastguard Worker  *
15*344aa361SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*344aa361SAndroid Build Coastguard Worker  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*344aa361SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18*344aa361SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19*344aa361SAndroid Build Coastguard Worker  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20*344aa361SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21*344aa361SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*344aa361SAndroid Build Coastguard Worker  */
23*344aa361SAndroid Build Coastguard Worker 
24*344aa361SAndroid Build Coastguard Worker #include <arch/mmu.h>
25*344aa361SAndroid Build Coastguard Worker #include <assert.h>
26*344aa361SAndroid Build Coastguard Worker #include <debug.h>
27*344aa361SAndroid Build Coastguard Worker #include <err.h>
28*344aa361SAndroid Build Coastguard Worker #include <inttypes.h>
29*344aa361SAndroid Build Coastguard Worker #include <lib/sm.h>
30*344aa361SAndroid Build Coastguard Worker #include <trace.h>
31*344aa361SAndroid Build Coastguard Worker 
32*344aa361SAndroid Build Coastguard Worker #define LOCAL_TRACE 0
33*344aa361SAndroid Build Coastguard Worker 
34*344aa361SAndroid Build Coastguard Worker /* 48-bit physical address 47:12 */
35*344aa361SAndroid Build Coastguard Worker #define NS_PTE_PHYSADDR_MASK (0xFFFFFFFFF000ULL)
36*344aa361SAndroid Build Coastguard Worker #define NS_PTE_PHYSADDR(pte) ((pte) & (NS_PTE_PHYSADDR_MASK))
37*344aa361SAndroid Build Coastguard Worker #define NS_PTE_ATTR(pte) ((pte) & ~(NS_PTE_PHYSADDR_MASK))
38*344aa361SAndroid Build Coastguard Worker 
39*344aa361SAndroid Build Coastguard Worker /* Access permissions AP[2:1]
40*344aa361SAndroid Build Coastguard Worker  *	EL0	EL1
41*344aa361SAndroid Build Coastguard Worker  * 00	None	RW
42*344aa361SAndroid Build Coastguard Worker  * 01	RW	RW
43*344aa361SAndroid Build Coastguard Worker  * 10	None	RO
44*344aa361SAndroid Build Coastguard Worker  * 11	RO	RO
45*344aa361SAndroid Build Coastguard Worker  */
46*344aa361SAndroid Build Coastguard Worker #define NS_PTE_AP(pte) (((pte) >> 6) & 0x3)
47*344aa361SAndroid Build Coastguard Worker #define NS_PTE_AP_U_RW(pte) (NS_PTE_AP(pte) == 0x1)
48*344aa361SAndroid Build Coastguard Worker #define NS_PTE_AP_U(pte) (NS_PTE_AP(pte) & 0x1)
49*344aa361SAndroid Build Coastguard Worker #define NS_PTE_AP_RO(pte) (NS_PTE_AP(pte) & 0x2)
50*344aa361SAndroid Build Coastguard Worker 
51*344aa361SAndroid Build Coastguard Worker /* Shareablility attrs */
52*344aa361SAndroid Build Coastguard Worker #define NS_PTE_ATTR_SHAREABLE(pte) (((pte) >> 8) & 0x3)
53*344aa361SAndroid Build Coastguard Worker 
54*344aa361SAndroid Build Coastguard Worker /* cache attrs encoded in the top bits 55:49 of the PTE*/
55*344aa361SAndroid Build Coastguard Worker #define NS_PTE_ATTR_MAIR(pte) (((pte) >> 48) & 0xFF)
56*344aa361SAndroid Build Coastguard Worker 
57*344aa361SAndroid Build Coastguard Worker /* Inner cache attrs MAIR_ATTR_N[3:0] */
58*344aa361SAndroid Build Coastguard Worker #define NS_PTE_ATTR_INNER(pte) ((NS_PTE_ATTR_MAIR(pte)) & 0xF)
59*344aa361SAndroid Build Coastguard Worker 
60*344aa361SAndroid Build Coastguard Worker /* Outer cache attrs MAIR_ATTR_N[7:4] */
61*344aa361SAndroid Build Coastguard Worker #define NS_PTE_ATTR_OUTER(pte) (((NS_PTE_ATTR_MAIR(pte)) & 0xF0) >> 4)
62*344aa361SAndroid Build Coastguard Worker 
63*344aa361SAndroid Build Coastguard Worker /* Normal memory */
64*344aa361SAndroid Build Coastguard Worker /* inner and outer write back read/write allocate */
65*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_NORMAL_CACHED_WB_RWA 0xFF
66*344aa361SAndroid Build Coastguard Worker /* inner and outer write back read/write allocate tagged */
67*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_NORMAL_CACHED_WB_RWA_TAGGED 0xF0
68*344aa361SAndroid Build Coastguard Worker /* inner and outer write through read allocate */
69*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_NORMAL_CACHED_WT_RA 0xAA
70*344aa361SAndroid Build Coastguard Worker /* inner and outer wriet back, read allocate */
71*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_NORMAL_CACHED_WB_RA 0xEE
72*344aa361SAndroid Build Coastguard Worker /* uncached */
73*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_NORMAL_UNCACHED 0x44
74*344aa361SAndroid Build Coastguard Worker 
75*344aa361SAndroid Build Coastguard Worker /* Device memory */
76*344aa361SAndroid Build Coastguard Worker /* nGnRnE (strongly ordered) */
77*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_DEVICE_STRONGLY_ORDERED 0x00
78*344aa361SAndroid Build Coastguard Worker /* nGnRE  (device) */
79*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_DEVICE 0x04
80*344aa361SAndroid Build Coastguard Worker /* GRE */
81*344aa361SAndroid Build Coastguard Worker #define NS_MAIR_DEVICE_GRE 0x0C
82*344aa361SAndroid Build Coastguard Worker 
83*344aa361SAndroid Build Coastguard Worker /* sharaeble attributes */
84*344aa361SAndroid Build Coastguard Worker #define NS_NON_SHAREABLE 0x0
85*344aa361SAndroid Build Coastguard Worker #define NS_OUTER_SHAREABLE 0x2
86*344aa361SAndroid Build Coastguard Worker #define NS_INNER_SHAREABLE 0x3
87*344aa361SAndroid Build Coastguard Worker 
88*344aa361SAndroid Build Coastguard Worker #define NS_PTE_ATTR_DEFAULT_CACHED \
89*344aa361SAndroid Build Coastguard Worker     ((uint64_t)NS_MAIR_NORMAL_CACHED_WB_RWA << 48 | NS_INNER_SHAREABLE << 8)
90*344aa361SAndroid Build Coastguard Worker 
91*344aa361SAndroid Build Coastguard Worker /* helper function to decode ns memory attrubutes  */
sm_decode_ns_memory_attr(struct ns_page_info * pinf,ns_addr_t * ppa,uint * pmmu)92*344aa361SAndroid Build Coastguard Worker status_t sm_decode_ns_memory_attr(struct ns_page_info* pinf,
93*344aa361SAndroid Build Coastguard Worker                                   ns_addr_t* ppa,
94*344aa361SAndroid Build Coastguard Worker                                   uint* pmmu) {
95*344aa361SAndroid Build Coastguard Worker     uint mmu_flags = 0;
96*344aa361SAndroid Build Coastguard Worker 
97*344aa361SAndroid Build Coastguard Worker     if (!pinf)
98*344aa361SAndroid Build Coastguard Worker         return ERR_INVALID_ARGS;
99*344aa361SAndroid Build Coastguard Worker 
100*344aa361SAndroid Build Coastguard Worker     LTRACEF("raw=0x%" PRIx64 ": pa=0x%llx: mair=0x%x, sharable=0x%x\n",
101*344aa361SAndroid Build Coastguard Worker             pinf->attr, NS_PTE_PHYSADDR(pinf->attr),
102*344aa361SAndroid Build Coastguard Worker             (uint)NS_PTE_ATTR_MAIR(pinf->attr),
103*344aa361SAndroid Build Coastguard Worker             (uint)NS_PTE_ATTR_SHAREABLE(pinf->attr));
104*344aa361SAndroid Build Coastguard Worker 
105*344aa361SAndroid Build Coastguard Worker     if (ppa)
106*344aa361SAndroid Build Coastguard Worker         *ppa = (ns_addr_t)NS_PTE_PHYSADDR(pinf->attr);
107*344aa361SAndroid Build Coastguard Worker 
108*344aa361SAndroid Build Coastguard Worker     if (pmmu) {
109*344aa361SAndroid Build Coastguard Worker         uint64_t attr = NS_PTE_ATTR(pinf->attr);
110*344aa361SAndroid Build Coastguard Worker         if (attr == 0) {
111*344aa361SAndroid Build Coastguard Worker             if (sm_get_api_version() >= TRUSTY_API_VERSION_PHYS_MEM_OBJ) {
112*344aa361SAndroid Build Coastguard Worker                 LTRACEF("Unsupported 0 memory attr\n");
113*344aa361SAndroid Build Coastguard Worker                 return ERR_NOT_SUPPORTED;
114*344aa361SAndroid Build Coastguard Worker             }
115*344aa361SAndroid Build Coastguard Worker             /*
116*344aa361SAndroid Build Coastguard Worker              * Some existing clients don't pass attibutes and assume cached
117*344aa361SAndroid Build Coastguard Worker              * write-able memory.
118*344aa361SAndroid Build Coastguard Worker              */
119*344aa361SAndroid Build Coastguard Worker             attr = NS_PTE_ATTR_DEFAULT_CACHED;
120*344aa361SAndroid Build Coastguard Worker         }
121*344aa361SAndroid Build Coastguard Worker 
122*344aa361SAndroid Build Coastguard Worker         /* match settings to mmu flags */
123*344aa361SAndroid Build Coastguard Worker         switch ((uint)NS_PTE_ATTR_MAIR(attr)) {
124*344aa361SAndroid Build Coastguard Worker         /*
125*344aa361SAndroid Build Coastguard Worker          * Normal tagged memory and normal untagged memory can be treated the
126*344aa361SAndroid Build Coastguard Worker          * same here, because we only ever map it as untagged in Trusty. This
127*344aa361SAndroid Build Coastguard Worker          * is enforced in vmm by only allowing pmm objecs to be tagged.
128*344aa361SAndroid Build Coastguard Worker          */
129*344aa361SAndroid Build Coastguard Worker         case NS_MAIR_NORMAL_CACHED_WB_RWA:
130*344aa361SAndroid Build Coastguard Worker         case NS_MAIR_NORMAL_CACHED_WB_RWA_TAGGED:
131*344aa361SAndroid Build Coastguard Worker             mmu_flags |= ARCH_MMU_FLAG_CACHED;
132*344aa361SAndroid Build Coastguard Worker             break;
133*344aa361SAndroid Build Coastguard Worker         case NS_MAIR_NORMAL_UNCACHED:
134*344aa361SAndroid Build Coastguard Worker             mmu_flags |= ARCH_MMU_FLAG_UNCACHED;
135*344aa361SAndroid Build Coastguard Worker             break;
136*344aa361SAndroid Build Coastguard Worker         default:
137*344aa361SAndroid Build Coastguard Worker             LTRACEF("Unsupported memory attr 0x%x\n",
138*344aa361SAndroid Build Coastguard Worker                     (uint)NS_PTE_ATTR_MAIR(attr));
139*344aa361SAndroid Build Coastguard Worker             return ERR_NOT_SUPPORTED;
140*344aa361SAndroid Build Coastguard Worker         }
141*344aa361SAndroid Build Coastguard Worker #if WITH_SMP | WITH_SHAREABLE_CACHE
142*344aa361SAndroid Build Coastguard Worker         if (mmu_flags == ARCH_MMU_FLAG_CACHED) {
143*344aa361SAndroid Build Coastguard Worker             if (NS_PTE_ATTR_SHAREABLE(attr) != NS_INNER_SHAREABLE) {
144*344aa361SAndroid Build Coastguard Worker                 LTRACEF("Unsupported sharable attr 0x%x\n",
145*344aa361SAndroid Build Coastguard Worker                         (uint)NS_PTE_ATTR_SHAREABLE(attr));
146*344aa361SAndroid Build Coastguard Worker                 return ERR_NOT_SUPPORTED;
147*344aa361SAndroid Build Coastguard Worker             }
148*344aa361SAndroid Build Coastguard Worker         }
149*344aa361SAndroid Build Coastguard Worker #endif
150*344aa361SAndroid Build Coastguard Worker         if (NS_PTE_AP_U(attr))
151*344aa361SAndroid Build Coastguard Worker             mmu_flags |= ARCH_MMU_FLAG_PERM_USER;
152*344aa361SAndroid Build Coastguard Worker 
153*344aa361SAndroid Build Coastguard Worker         if (NS_PTE_AP_RO(attr))
154*344aa361SAndroid Build Coastguard Worker             mmu_flags |= ARCH_MMU_FLAG_PERM_RO;
155*344aa361SAndroid Build Coastguard Worker 
156*344aa361SAndroid Build Coastguard Worker         *pmmu = mmu_flags | ARCH_MMU_FLAG_NS | ARCH_MMU_FLAG_PERM_NO_EXECUTE;
157*344aa361SAndroid Build Coastguard Worker     }
158*344aa361SAndroid Build Coastguard Worker 
159*344aa361SAndroid Build Coastguard Worker     return NO_ERROR;
160*344aa361SAndroid Build Coastguard Worker }
161