1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
| // mm/core_mmu.c
// _start() -> core_init_mmu_map() -> init_mem_map() -> collect_mem_ranges()
// e.g.
// D/TC:0 add_phys_mem:677 VCORE_UNPG_RX_PA type TEE_RAM_RX 0xf1000000 size 0x00092000
// D/TC:0 add_phys_mem:677 VCORE_UNPG_RW_PA type TEE_RAM_RW 0xf1092000 size 0x0016e000
// D/TC:0 add_phys_mem:677 ta_base type TA_RAM 0xf1200000 size 0x00e00000
// D/TC:0 add_va_space:717 type RES_VASPACE size 0x00a00000
// D/TC:0 add_va_space:717 type SHM_VASPACE size 0x02000000
// D/TC:0 dump_mmap_table:849 type TEE_RAM_RX va 0xf1000000..0xf1091fff pa 0xf1000000..0xf1091fff size 0x00092000 (smallpg)
// D/TC:0 dump_mmap_table:849 type TEE_RAM_RW va 0xf1092000..0xf11fffff pa 0xf1092000..0xf11fffff size 0x0016e000 (smallpg)
// D/TC:0 dump_mmap_table:849 type RES_VASPACE va 0xf1200000..0xf1bfffff pa 0x00000000..0x009fffff size 0x00a00000 (pgdir)
// D/TC:0 dump_mmap_table:849 type SHM_VASPACE va 0xf1c00000..0xf3bfffff pa 0x00000000..0x01ffffff size 0x02000000 (pgdir)
// D/TC:0 dump_mmap_table:849 type TA_RAM va 0xf3c00000..0xf49fffff pa 0xf1200000..0xf1ffffff size 0x00e00000 (pgdir)
static size_t collect_mem_ranges(struct tee_mmap_region *memory_map,
size_t num_elems)
{
const struct core_mmu_phys_mem *mem = NULL;
vaddr_t ram_start = secure_only[0].paddr;
size_t last = 0;
#define ADD_PHYS_MEM(_type, _addr, _size) \
add_phys_mem(memory_map, num_elems, #_addr, (_type), \
(_addr), (_size), &last)
if (IS_ENABLED(CFG_CORE_RWDATA_NOEXEC)) {
ADD_PHYS_MEM(MEM_AREA_TEE_RAM_RO, ram_start,
VCORE_UNPG_RX_PA - ram_start);
ADD_PHYS_MEM(MEM_AREA_TEE_RAM_RX, VCORE_UNPG_RX_PA,
VCORE_UNPG_RX_SZ);
ADD_PHYS_MEM(MEM_AREA_TEE_RAM_RO, VCORE_UNPG_RO_PA,
VCORE_UNPG_RO_SZ);
if (IS_ENABLED(CFG_NS_VIRTUALIZATION)) {
ADD_PHYS_MEM(MEM_AREA_NEX_RAM_RO, VCORE_UNPG_RW_PA,
VCORE_UNPG_RW_SZ);
ADD_PHYS_MEM(MEM_AREA_NEX_RAM_RW, VCORE_NEX_RW_PA,
VCORE_NEX_RW_SZ);
} else {
ADD_PHYS_MEM(MEM_AREA_TEE_RAM_RW, VCORE_UNPG_RW_PA,
VCORE_UNPG_RW_SZ);
}
if (IS_ENABLED(CFG_WITH_PAGER)) {
ADD_PHYS_MEM(MEM_AREA_INIT_RAM_RX, VCORE_INIT_RX_PA,
VCORE_INIT_RX_SZ);
ADD_PHYS_MEM(MEM_AREA_INIT_RAM_RO, VCORE_INIT_RO_PA,
VCORE_INIT_RO_SZ);
}
} else {
ADD_PHYS_MEM(MEM_AREA_TEE_RAM, TEE_RAM_START, TEE_RAM_PH_SIZE);
}
if (IS_ENABLED(CFG_NS_VIRTUALIZATION)) {
ADD_PHYS_MEM(MEM_AREA_SEC_RAM_OVERALL, TRUSTED_DRAM_BASE,
TRUSTED_DRAM_SIZE);
} else {
/*
* Every guest will have own TA RAM if virtualization
* support is enabled.
*/
paddr_t ta_base = 0;
size_t ta_size = 0;
core_mmu_get_ta_range(&ta_base, &ta_size);
ADD_PHYS_MEM(MEM_AREA_TA_RAM, ta_base, ta_size);
}
if (IS_ENABLED(CFG_CORE_SANITIZE_KADDRESS) &&
IS_ENABLED(CFG_WITH_PAGER)) {
/*
* Asan ram is part of MEM_AREA_TEE_RAM_RW when pager is
* disabled.
*/
ADD_PHYS_MEM(MEM_AREA_TEE_ASAN, ASAN_MAP_PA, ASAN_MAP_SZ);
}
#undef ADD_PHYS_MEM
/* Collect device memory info from SP manifest */
if (IS_ENABLED(CFG_CORE_SEL2_SPMC))
collect_device_mem_ranges(memory_map, num_elems, &last);
for (mem = phys_mem_map_begin; mem < phys_mem_map_end; mem++) {
/* Only unmapped virtual range may have a null phys addr */
assert(mem->addr || !core_mmu_type_to_attr(mem->type));
add_phys_mem(memory_map, num_elems, mem->name, mem->type,
mem->addr, mem->size, &last);
}
if (IS_ENABLED(CFG_SECURE_DATA_PATH))
verify_special_mem_areas(memory_map, phys_sdp_mem_begin,
phys_sdp_mem_end, "SDP");
add_va_space(memory_map, num_elems, MEM_AREA_RES_VASPACE,
CFG_RESERVED_VASPACE_SIZE, &last);
add_va_space(memory_map, num_elems, MEM_AREA_SHM_VASPACE,
SHM_VASPACE_SIZE, &last);
memory_map[last].type = MEM_AREA_END;
return last;
}
|