Skip to content

Commit 9b4c948

Browse files
feat(mpu): Add logic to determine which sections are locked
1 parent 92907a4 commit 9b4c948

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
@@ -297,17 +297,28 @@ static bool mem_broadcast(struct addr_space* as, struct mp_region* mpr, bool bro
297297
return broadcast;
298298
}
299299

300+
static bool mem_locked(struct mp_region* mpr, bool broadcast)
301+
{
302+
if (mpr->as_sec == SEC_HYP_PRIVATE || mpr->as_sec == SEC_HYP_VM ||
303+
mpr->as_sec == SEC_HYP_IMAGE) {
304+
return true;
305+
}
306+
307+
return broadcast;
308+
}
309+
300310
static bool mem_vmpu_insert_region(struct addr_space* as, mpid_t mpid, struct mp_region* mpr,
301311
bool broadcast, bool locked)
302312
{
313+
bool lock = mem_locked(mpr, locked);
303314
if (mpid == INVALID_MPID) {
304315
return false;
305316
}
306317

307-
if (mpu_map(as, mpr, locked)) {
308-
mem_vmpu_set_entry(as, mpid, mpr, locked);
318+
if (mpu_map(as, mpr, lock)) {
319+
mem_vmpu_set_entry(as, mpid, mpr, lock);
309320
if (mem_broadcast(as, mpr, broadcast)) {
310-
mem_region_broadcast(as, mpr, MEM_INSERT_REGION, locked);
321+
mem_region_broadcast(as, mpr, MEM_INSERT_REGION, lock);
311322
}
312323
return true;
313324
}
@@ -323,8 +334,9 @@ static bool mem_vmpu_update_region(struct addr_space* as, mpid_t mpid, struct mp
323334
if (mpu_update(as, &merge_reg)) {
324335
struct mpe* mpe = mem_vmpu_get_entry(as, mpid);
325336
mpe->region = merge_reg;
337+
bool lock = mem_locked(&mpe->region, locked);
326338
if (mem_broadcast(as, &mpe->region, broadcast)) {
327-
mem_region_broadcast(as, &mpe->region, MEM_UPDATE_REGION, locked);
339+
mem_region_broadcast(as, &mpe->region, MEM_UPDATE_REGION, lock);
328340
}
329341
merged = true;
330342
}
@@ -338,8 +350,9 @@ static bool mem_vmpu_remove_region(struct addr_space* as, mpid_t mpid, bool broa
338350
struct mpe* mpe = mem_vmpu_get_entry(as, mpid);
339351

340352
if ((mpe != NULL) && (mpe->state == MPE_S_VALID)) {
353+
bool lock = mem_locked(&mpe->region, mpe->lock);
341354
if (mem_broadcast(as, &mpe->region, broadcast)) {
342-
mem_region_broadcast(as, &mpe->region, MEM_REMOVE_REGION, mpe->lock);
355+
mem_region_broadcast(as, &mpe->region, MEM_REMOVE_REGION, lock);
343356
}
344357
mpu_unmap(as, &mpe->region);
345358
mem_vmpu_free_entry(as, mpid);
@@ -351,10 +364,11 @@ static bool mem_vmpu_remove_region(struct addr_space* as, mpid_t mpid, bool broa
351364

352365
static void mem_handle_broadcast_insert(struct addr_space* as, struct mp_region* mpr, bool locked)
353366
{
367+
bool lock = mem_locked(mpr, locked);
354368
if (as->type == AS_HYP) {
355-
mem_map(&cpu()->as, mpr, false, locked);
369+
mem_map(&cpu()->as, mpr, false, lock);
356370
} else {
357-
mpu_map(as, mpr, locked);
371+
mpu_map(as, mpr, lock);
358372
}
359373
}
360374

@@ -370,8 +384,9 @@ static void mem_handle_broadcast_remove(struct addr_space* as, struct mp_region*
370384
static void mem_handle_broadcast_update(struct addr_space* as, struct mp_region* mpr, bool locked)
371385
{
372386
// TODO:ARMV8M - check if this makes sense
387+
bool lock = mem_locked(mpr, locked);
373388
if (as->type == AS_HYP) {
374-
mem_update(&cpu()->as, mpr, false, locked);
389+
mem_update(&cpu()->as, mpr, false, lock);
375390
} else {
376391
mpu_update(as, mpr);
377392
}
@@ -448,9 +463,7 @@ void mem_vmpu_coalesce_contiguous(struct addr_space* as, bool broadcast, bool lo
448463
prev_reg = mem_vmpu_get_entry(as, prev->mpid);
449464

450465
bool contiguous = prev_reg->region.base + prev_reg->region.size == cur_reg->region.base;
451-
bool perms_compatible = true;
452-
//LINE COMMENTED TO COMPILE BEFORE ARMV8-R REWORK
453-
//mpu_perms_compatible(prev_reg->region.mem_flags.raw, cur_reg->region.mem_flags.raw);
466+
bool perms_compatible = mpu_perms_compatible(prev_reg->region.mem_flags.raw, cur_reg->region.mem_flags.raw);
454467
bool lock_compatible = prev_reg->lock == cur_reg->lock;
455468
if (contiguous && perms_compatible && lock_compatible) {
456469
cur_mpid = cur->mpid;
@@ -512,7 +525,7 @@ bool mem_map(struct addr_space* as, struct mp_region* mpr, bool broadcast, bool
512525
}
513526
}
514527

515-
if (mapped) {
528+
if (mapped && !locked) {
516529
mem_vmpu_coalesce_contiguous(as, broadcast, locked);
517530
}
518531

0 commit comments

Comments
 (0)