@@ -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+
279289static 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
331344static 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*
349363static 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