@@ -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+
300310static 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
352365static 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*
370384static 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