Skip to content

Commit cfe1677

Browse files
danielRepjosecm
authored andcommitted
ref(mem): change mem init to cope with non-unified plats
Signed-off-by: Daniel Oliveira <[email protected]>
1 parent 1c29211 commit cfe1677

File tree

3 files changed

+102
-15
lines changed

3 files changed

+102
-15
lines changed

src/arch/armv8/armv8-r/inc/arch/mem.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ struct addr_space_arch {
4646
.prlar = (_prlar), \
4747
})
4848

49-
#define PTE_INVALID PTE_FLAGS(0, 0)
50-
#define PTE_HYP_FLAGS PTE_FLAGS(PRBAR_AP_RW_EL2 | PRBAR_SH_OS, PRLAR_ATTR(1) | PRLAR_EN)
49+
#define PTE_INVALID PTE_FLAGS(0, 0)
50+
#define PTE_HYP_FLAGS PTE_FLAGS(PRBAR_AP_RW_EL2 | PRBAR_SH_OS, PRLAR_ATTR(1) | PRLAR_EN)
51+
#define PTE_HYP_FLAGS_CODE PTE_FLAGS(PRBAR_AP_RO_EL2 | PRBAR_SH_IS, PRLAR_ATTR(1) | PRLAR_EN)
5152
#define PTE_HYP_DEV_FLAGS \
5253
PTE_FLAGS(PRBAR_XN | PRBAR_AP_RW_EL2 | PRBAR_SH_IS, PRLAR_ATTR(2) | PRLAR_EN)
5354
#define PTE_VM_FLAGS PTE_FLAGS(PRBAR_AP_RW_EL1_EL2 | PRBAR_SH_NS, PRLAR_ATTR(1) | PRLAR_EN)

src/core/mem.c

Lines changed: 85 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
#include <fences.h>
1515
#include <config.h>
1616

17-
extern uint8_t _image_start, _image_load_end, _image_end, _vm_image_start, _vm_image_end;
17+
extern uint8_t _image_start, _image_load_end, _image_end, _vm_image_start, _vm_image_end,
18+
_data_vma_start;
1819

1920
struct list page_pool_list;
2021

@@ -45,6 +46,15 @@ static bool pp_bitmap_alloc(size_t pool_num_pages, bitmap_t** bitmap)
4546
return allocated;
4647
}
4748

49+
static size_t calc_root_mem_size(void)
50+
{
51+
if (DEFINED(MEM_NON_UNIFIED)) {
52+
return (size_t)(&_image_end - &_data_vma_start);
53+
} else {
54+
return (size_t)(&_image_end - &_image_start);
55+
}
56+
}
57+
4858
bool pp_alloc(struct page_pool* pool, size_t num_pages, bool aligned, struct ppages* ppages)
4959
{
5060
ppages->colors = 0;
@@ -176,27 +186,75 @@ static bool root_pool_set_up_bitmap(struct page_pool* root_pool)
176186
}
177187

178188
static bool pp_root_reserve_hyp_image_load(struct page_pool* root_pool)
189+
{
190+
size_t image_load_size = (size_t)(&_image_load_end - &_image_start);
191+
192+
struct ppages images_load_ppages = mem_ppages_get(img_addr, NUM_PAGES(image_load_size));
193+
194+
return mem_reserve_ppool_ppages(root_pool, &images_load_ppages);
195+
}
196+
197+
static bool pp_root_reserve_hyp_image_noload(struct page_pool* root_pool)
179198
{
180199
size_t image_load_size = (size_t)(&_image_load_end - &_image_start);
181200
size_t image_noload_size = (size_t)(&_image_end - &_image_load_end);
182201
size_t vm_image_size = (size_t)(&_vm_image_end - &_vm_image_start);
183-
size_t cpu_size = platform.cpu_num * mem_cpu_boot_alloc_size();
184-
paddr_t image_noload_addr = load_addr + image_load_size + vm_image_size;
185-
paddr_t cpu_base_addr = image_noload_addr + image_noload_size;
202+
paddr_t image_noload_addr = img_addr + image_load_size + vm_image_size;
186203

187-
struct ppages images_load_ppages = mem_ppages_get(load_addr, NUM_PAGES(image_load_size));
188204
struct ppages images_noload_ppages =
189205
mem_ppages_get(image_noload_addr, NUM_PAGES(image_noload_size));
206+
207+
return mem_reserve_ppool_ppages(root_pool, &images_noload_ppages);
208+
}
209+
210+
static bool pp_root_reserve_cpus(struct page_pool* root_pool)
211+
{
212+
size_t cpu_size = platform.cpu_num * mem_cpu_boot_alloc_size();
213+
paddr_t cpu_base_addr;
214+
215+
if (DEFINED(MEM_NON_UNIFIED)) {
216+
size_t data_size = (size_t)(&_image_end - &_data_vma_start);
217+
cpu_base_addr = (paddr_t)&_data_vma_start + data_size;
218+
} else {
219+
size_t image_load_size = (size_t)(&_image_load_end - &_image_start);
220+
size_t image_noload_size = (size_t)(&_image_end - &_image_load_end);
221+
size_t vm_image_size = (size_t)(&_vm_image_end - &_vm_image_start);
222+
223+
paddr_t image_noload_addr = img_addr + image_load_size + vm_image_size;
224+
cpu_base_addr = image_noload_addr + image_noload_size;
225+
}
226+
190227
struct ppages cpu_ppages = mem_ppages_get(cpu_base_addr, NUM_PAGES(cpu_size));
191228

192-
bool image_load_reserved = mem_reserve_ppool_ppages(root_pool, &images_load_ppages);
193-
bool image_noload_reserved = mem_reserve_ppool_ppages(root_pool, &images_noload_ppages);
194-
bool cpu_reserved = mem_reserve_ppool_ppages(root_pool, &cpu_ppages);
229+
return mem_reserve_ppool_ppages(root_pool, &cpu_ppages);
230+
}
231+
232+
static bool pp_root_reserve_hyp_data(struct page_pool* root_pool)
233+
{
234+
size_t data_size = (size_t)(&_image_end - &_data_vma_start);
235+
paddr_t data_base_addr = (paddr_t)&_data_vma_start;
236+
237+
struct ppages data_ppages = mem_ppages_get(data_base_addr, NUM_PAGES(data_size));
195238

196-
return image_load_reserved && image_noload_reserved && cpu_reserved;
239+
return mem_reserve_ppool_ppages(root_pool, &data_ppages);
197240
}
198241

199242
static bool pp_root_reserve_hyp_mem(struct page_pool* root_pool)
243+
{
244+
if (DEFINED(MEM_NON_UNIFIED)) {
245+
bool hyp_data_mem = pp_root_reserve_hyp_data(root_pool);
246+
bool cpus_mem = pp_root_reserve_cpus(root_pool);
247+
return hyp_data_mem && cpus_mem;
248+
249+
} else {
250+
bool hyp_image_load_mem = pp_root_reserve_hyp_image_load(root_pool);
251+
bool hyp_image_noload_mem = pp_root_reserve_hyp_image_noload(root_pool);
252+
bool cpus_mem = pp_root_reserve_cpus(root_pool);
253+
return hyp_image_load_mem && hyp_image_noload_mem && cpus_mem;
254+
}
255+
}
256+
257+
static bool pp_root_init(struct mem_region* root_region)
200258
{
201259
struct page_pool* root_pool = &root_region->page_pool;
202260
root_pool->base = ALIGN(root_region->base, PAGE_SIZE);
@@ -262,6 +320,12 @@ static bool mem_reserve_physical_memory(struct page_pool* pool)
262320
return false;
263321
}
264322

323+
if (DEFINED(MEM_NON_UNIFIED)) {
324+
if (!pp_root_reserve_hyp_image_load(pool)) {
325+
return false;
326+
}
327+
}
328+
265329
for (size_t i = 0; i < config.vmlist_size; i++) {
266330
struct vm_config* vm_cfg = &config.vmlist[i];
267331
size_t n_pg = NUM_PAGES(vm_cfg->image.size);
@@ -335,13 +399,21 @@ static bool mem_create_ppools(struct mem_region* root_mem_region)
335399

336400
static struct mem_region* mem_find_root_region(void)
337401
{
338-
size_t image_size = (size_t)(&_image_end - &_image_start);
402+
size_t root_mem_size = calc_root_mem_size();
339403

340-
/* Find the root memory region in which the hypervisor was loaded. */
404+
/* Find the root memory region */
341405
struct mem_region* root_mem_region = NULL;
342406
for (size_t i = 0; i < platform.region_num; i++) {
343407
struct mem_region* region = &(platform.regions[i]);
344-
bool is_in_rgn = range_in_range(load_addr, image_size, region->base, region->size);
408+
bool is_in_rgn;
409+
vaddr_t root_base_addr;
410+
if (DEFINED(MEM_NON_UNIFIED)) {
411+
root_base_addr = data_addr;
412+
} else {
413+
root_base_addr = img_addr;
414+
}
415+
is_in_rgn = range_in_range(root_base_addr, root_mem_size, region->base, region->size);
416+
345417
if (is_in_rgn) {
346418
root_mem_region = region;
347419
break;
@@ -353,7 +425,7 @@ static struct mem_region* mem_find_root_region(void)
353425

354426
static bool mem_setup_root_pool(struct mem_region** root_mem_region)
355427
{
356-
*root_mem_region = mem_find_root_region(load_addr);
428+
*root_mem_region = mem_find_root_region();
357429
if (*root_mem_region == NULL) {
358430
return false;
359431
}

src/core/mpu/mem.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ static void mem_init_boot_regions(void)
154154
vaddr_t image_noload_start = (vaddr_t)&_image_noload_start;
155155
vaddr_t image_end = (vaddr_t)&_image_end;
156156

157+
#ifdef MEM_NON_UNIFIED
158+
extern uint8_t _data_vma_start;
159+
vaddr_t data_vma_start = (vaddr_t)&_data_vma_start;
160+
#endif
161+
157162
struct mp_region mpr;
158163

159164
bool separate_noload_region = image_load_end != image_noload_start;
@@ -162,15 +167,24 @@ static void mem_init_boot_regions(void)
162167
mpr = (struct mp_region){
163168
.base = image_start,
164169
.size = (size_t)(first_region_end - image_start),
170+
#ifdef MEM_NON_UNIFIED
171+
.mem_flags = PTE_HYP_FLAGS_CODE,
172+
#else
165173
.mem_flags = PTE_HYP_FLAGS,
174+
#endif
166175
.as_sec = SEC_HYP_IMAGE,
167176
};
168177
mem_map(&cpu()->as, &mpr, false, true);
169178

170179
if (separate_noload_region) {
171180
mpr = (struct mp_region){
181+
#ifdef MEM_NON_UNIFIED
182+
.base = data_vma_start,
183+
.size = (size_t)(image_end - data_vma_start),
184+
#else
172185
.base = image_noload_start,
173186
.size = (size_t)image_end - image_noload_start,
187+
#endif
174188
.mem_flags = PTE_HYP_FLAGS,
175189
.as_sec = SEC_HYP_IMAGE,
176190
};

0 commit comments

Comments
 (0)