static void shieldSetPM(Shield shield, Seg seg, AccessSet mode) { if (SegPM(seg) != mode) { if (SegIsSynced(seg)) { SegSetPM(seg, mode); ++shield->unsynced; } else { SegSetPM(seg, mode); if (SegIsSynced(seg)) { AVER(shield->unsynced > 0); --shield->unsynced; } } } }
static void shieldSync(Arena arena, Seg seg) { AVERT(Arena, arena); AVERT(Seg, seg); if (SegPM(seg) != SegSM(seg)) { ProtSet(SegBase(seg), SegLimit(seg), SegSM(seg)); SegSetPM(seg, SegSM(seg)); /* inv.prot.shield */ } }
/* This ensures actual prot mode does not include mode */ static void protLower(Arena arena, Seg seg, AccessSet mode) { /* <design/trace/#fix.noaver> */ AVERT_CRITICAL(Arena, arena); UNUSED(arena); AVERT_CRITICAL(Seg, seg); if (SegPM(seg) & mode) { SegSetPM(seg, SegPM(seg) & ~mode); ProtSet(SegBase(seg), SegLimit(seg), SegPM(seg)); } }