Skip to content

Commit 55b2ad2

Browse files
feat(mpu): Add logic to determine which sections are locked
Signed-off-by: Miguel Silva <[email protected]>
1 parent 606e2cd commit 55b2ad2

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

src/core/mpu/mem.c

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -277,17 +277,28 @@ static bool mem_broadcast(struct addr_space* as, struct mp_region* mpr, bool bro
277277
return broadcast;
278278
}
279279

280+
static bool mem_locked(struct mp_region* mpr, bool broadcast)
281+
{
282+
if (mpr->as_sec == SEC_HYP_PRIVATE || mpr->as_sec == SEC_HYP_VM ||
283+
mpr->as_sec == SEC_HYP_IMAGE) {
284+
return true;
285+
}
286+
287+
return broadcast;
288+
}
289+
280290
static bool mem_vmpu_insert_region(struct addr_space* as, mpid_t mpid, struct mp_region* mpr,
281291
bool broadcast, bool locked)
282292
{
293+
bool lock = mem_locked(mpr, locked);
283294
if (mpid == INVALID_MPID) {
284295
return false;
285296
}
286297

287-
if (mpu_map(as, mpr, locked)) {
288-
mem_vmpu_set_entry(as, mpid, mpr, locked);
298+
if (mpu_map(as, mpr, lock)) {
299+
mem_vmpu_set_entry(as, mpid, mpr, lock);
289300
if (mem_broadcast(as, mpr, broadcast)) {
290-
mem_region_broadcast(as, mpr, MEM_INSERT_REGION, locked);
301+
mem_region_broadcast(as, mpr, MEM_INSERT_REGION, lock);
291302
}
292303
return true;
293304
}
@@ -303,8 +314,9 @@ static bool mem_vmpu_update_region(struct addr_space* as, mpid_t mpid, struct mp
303314
if (mpu_update(as, &merge_reg)) {
304315
struct mpe* mpe = mem_vmpu_get_entry(as, mpid);
305316
mpe->region = merge_reg;
317+
bool lock = mem_locked(&mpe->region, locked);
306318
if (mem_broadcast(as, &mpe->region, broadcast)) {
307-
mem_region_broadcast(as, &mpe->region, MEM_UPDATE_REGION, locked);
319+
mem_region_broadcast(as, &mpe->region, MEM_UPDATE_REGION, lock);
308320
}
309321
merged = true;
310322
}
@@ -318,8 +330,9 @@ static bool mem_vmpu_remove_region(struct addr_space* as, mpid_t mpid, bool broa
318330
struct mpe* mpe = mem_vmpu_get_entry(as, mpid);
319331

320332
if ((mpe != NULL) && (mpe->state == MPE_S_VALID)) {
333+
bool lock = mem_locked(&mpe->region, mpe->lock);
321334
if (mem_broadcast(as, &mpe->region, broadcast)) {
322-
mem_region_broadcast(as, &mpe->region, MEM_REMOVE_REGION, mpe->lock);
335+
mem_region_broadcast(as, &mpe->region, MEM_REMOVE_REGION, lock);
323336
}
324337
mpu_unmap(as, &mpe->region);
325338
mem_vmpu_free_entry(as, mpid);
@@ -331,10 +344,11 @@ static bool mem_vmpu_remove_region(struct addr_space* as, mpid_t mpid, bool broa
331344

332345
static void mem_handle_broadcast_insert(struct addr_space* as, struct mp_region* mpr, bool locked)
333346
{
347+
bool lock = mem_locked(mpr, locked);
334348
if (as->type == AS_HYP) {
335-
mem_map(&cpu()->as, mpr, false, locked);
349+
mem_map(&cpu()->as, mpr, false, lock);
336350
} else {
337-
mpu_map(as, mpr, locked);
351+
mpu_map(as, mpr, lock);
338352
}
339353
}
340354

@@ -350,8 +364,9 @@ static void mem_handle_broadcast_remove(struct addr_space* as, struct mp_region*
350364
static void mem_handle_broadcast_update(struct addr_space* as, struct mp_region* mpr, bool locked)
351365
{
352366
// TODO:ARMV8M - check if this makes sense
367+
bool lock = mem_locked(mpr, locked);
353368
if (as->type == AS_HYP) {
354-
mem_update(&cpu()->as, mpr, false, locked);
369+
mem_update(&cpu()->as, mpr, false, lock);
355370
} else {
356371
mpu_update(as, mpr);
357372
}
@@ -428,9 +443,7 @@ void mem_vmpu_coalesce_contiguous(struct addr_space* as, bool broadcast, bool lo
428443
prev_reg = mem_vmpu_get_entry(as, prev->mpid);
429444

430445
bool contiguous = prev_reg->region.base + prev_reg->region.size == cur_reg->region.base;
431-
bool perms_compatible = true;
432-
//LINE COMMENTED TO COMPILE BEFORE ARMV8-R REWORK
433-
//mpu_perms_compatible(prev_reg->region.mem_flags.raw, cur_reg->region.mem_flags.raw);
446+
bool perms_compatible = mpu_perms_compatible(prev_reg->region.mem_flags.raw, cur_reg->region.mem_flags.raw);
434447
bool lock_compatible = prev_reg->lock == cur_reg->lock;
435448
if (contiguous && perms_compatible && lock_compatible) {
436449
cur_mpid = cur->mpid;
@@ -492,7 +505,7 @@ bool mem_map(struct addr_space* as, struct mp_region* mpr, bool broadcast, bool
492505
}
493506
}
494507

495-
if (mapped) {
508+
if (mapped && !locked) {
496509
mem_vmpu_coalesce_contiguous(as, broadcast, locked);
497510
}
498511

0 commit comments

Comments
 (0)