Skip to content

Commit 4b7d8d0

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

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
@@ -276,17 +276,28 @@ static bool mem_broadcast(struct addr_space* as, struct mp_region* mpr, bool bro
276276
return broadcast;
277277
}
278278

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

286-
if (mpu_map(as, mpr, locked)) {
287-
mem_vmpu_set_entry(as, mpid, mpr, locked);
297+
if (mpu_map(as, mpr, lock)) {
298+
mem_vmpu_set_entry(as, mpid, mpr, lock);
288299
if (mem_broadcast(as, mpr, broadcast)) {
289-
mem_region_broadcast(as, mpr, MEM_INSERT_REGION, locked);
300+
mem_region_broadcast(as, mpr, MEM_INSERT_REGION, lock);
290301
}
291302
return true;
292303
}
@@ -302,8 +313,9 @@ static bool mem_vmpu_update_region(struct addr_space* as, mpid_t mpid, struct mp
302313
if (mpu_update(as, &merge_reg)) {
303314
struct mpe* mpe = mem_vmpu_get_entry(as, mpid);
304315
mpe->region = merge_reg;
316+
bool lock = mem_locked(&mpe->region, locked);
305317
if (mem_broadcast(as, &mpe->region, broadcast)) {
306-
mem_region_broadcast(as, &mpe->region, MEM_UPDATE_REGION, locked);
318+
mem_region_broadcast(as, &mpe->region, MEM_UPDATE_REGION, lock);
307319
}
308320
merged = true;
309321
}
@@ -317,8 +329,9 @@ static bool mem_vmpu_remove_region(struct addr_space* as, mpid_t mpid, bool broa
317329
struct mpe* mpe = mem_vmpu_get_entry(as, mpid);
318330

319331
if ((mpe != NULL) && (mpe->state == MPE_S_VALID)) {
332+
bool lock = mem_locked(&mpe->region, mpe->lock);
320333
if (mem_broadcast(as, &mpe->region, broadcast)) {
321-
mem_region_broadcast(as, &mpe->region, MEM_REMOVE_REGION, mpe->lock);
334+
mem_region_broadcast(as, &mpe->region, MEM_REMOVE_REGION, lock);
322335
}
323336
mpu_unmap(as, &mpe->region);
324337
mem_vmpu_free_entry(as, mpid);
@@ -330,10 +343,11 @@ static bool mem_vmpu_remove_region(struct addr_space* as, mpid_t mpid, bool broa
330343

331344
static void mem_handle_broadcast_insert(struct addr_space* as, struct mp_region* mpr, bool locked)
332345
{
346+
bool lock = mem_locked(mpr, locked);
333347
if (as->type == AS_HYP) {
334-
mem_map(&cpu()->as, mpr, false, locked);
348+
mem_map(&cpu()->as, mpr, false, lock);
335349
} else {
336-
mpu_map(as, mpr, locked);
350+
mpu_map(as, mpr, lock);
337351
}
338352
}
339353

@@ -349,8 +363,9 @@ static void mem_handle_broadcast_remove(struct addr_space* as, struct mp_region*
349363
static void mem_handle_broadcast_update(struct addr_space* as, struct mp_region* mpr, bool locked)
350364
{
351365
// TODO:ARMV8M - check if this makes sense
366+
bool lock = mem_locked(mpr, locked);
352367
if (as->type == AS_HYP) {
353-
mem_update(&cpu()->as, mpr, false, locked);
368+
mem_update(&cpu()->as, mpr, false, lock);
354369
} else {
355370
mpu_update(as, mpr);
356371
}
@@ -427,9 +442,7 @@ void mem_vmpu_coalesce_contiguous(struct addr_space* as, bool broadcast, bool lo
427442
prev_reg = mem_vmpu_get_entry(as, prev->mpid);
428443

429444
bool contiguous = prev_reg->region.base + prev_reg->region.size == cur_reg->region.base;
430-
bool perms_compatible = true;
431-
//LINE COMMENTED TO COMPILE BEFORE ARMV8-R REWORK
432-
//mpu_perms_compatible(prev_reg->region.mem_flags.raw, cur_reg->region.mem_flags.raw);
445+
bool perms_compatible = mpu_perms_compatible(prev_reg->region.mem_flags.raw, cur_reg->region.mem_flags.raw);
433446
bool lock_compatible = prev_reg->lock == cur_reg->lock;
434447
if (contiguous && perms_compatible && lock_compatible) {
435448
cur_mpid = cur->mpid;
@@ -491,7 +504,7 @@ bool mem_map(struct addr_space* as, struct mp_region* mpr, bool broadcast, bool
491504
}
492505
}
493506

494-
if (mapped) {
507+
if (mapped && !locked) {
495508
mem_vmpu_coalesce_contiguous(as, broadcast, locked);
496509
}
497510

0 commit comments

Comments
 (0)