@@ -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+
280290static 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
332345static 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*
350364static 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