static void shieldSync(Shield shield, Seg seg) { SHIELD_AVERT_CRITICAL(Seg, seg); if (!SegIsSynced(seg)) { shieldSetPM(shield, seg, SegSM(seg)); ProtSet(SegBase(seg), SegLimit(seg), SegPM(seg)); } }
static void shieldProtLower(Shield shield, Seg seg, AccessSet mode) { /* <design/trace/#fix.noaver> */ SHIELD_AVERT_CRITICAL(Seg, seg); AVERT_CRITICAL(AccessSet, mode); if (BS_INTER(SegPM(seg), mode) != AccessSetEMPTY) { shieldSetPM(shield, seg, BS_DIFF(SegPM(seg), mode)); ProtSet(SegBase(seg), SegLimit(seg), SegPM(seg)); } }
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)); } }
static void shieldFlushEntries(Shield shield) { Addr base = NULL, limit; AccessSet mode; Index i; if (shield->length == 0) { AVER(shield->queue == NULL); return; } QuickSort((void *)shield->queue, shield->limit, shieldQueueEntryCompare, UNUSED_POINTER, &shield->sortStruct); mode = AccessSetEMPTY; limit = NULL; for (i = 0; i < shield->limit; ++i) { Seg seg = shieldDequeue(shield, i); if (!SegIsSynced(seg)) { shieldSetPM(shield, seg, SegSM(seg)); if (SegSM(seg) != mode || SegBase(seg) != limit) { if (base != NULL) { AVER(base < limit); ProtSet(base, limit, mode); } base = SegBase(seg); mode = SegSM(seg); } limit = SegLimit(seg); } } if (base != NULL) { AVER(base < limit); ProtSet(base, limit, mode); } shieldQueueReset(shield); }