word_t* PURE lookupIPCBuffer(bool_t isReceiver, tcb_t *thread) { word_t w_bufferPtr; cap_t bufferCap; vm_rights_t vm_rights; w_bufferPtr = thread->tcbIPCBuffer; bufferCap = TCB_PTR_CTE_PTR(thread, tcbBuffer)->cap; if (cap_get_capType(bufferCap) != cap_frame_cap) { return NULL; } vm_rights = cap_frame_cap_get_capFVMRights(bufferCap); if (vm_rights == VMReadWrite || (!isReceiver && vm_rights == VMReadOnly)) { word_t basePtr; unsigned int pageBits; basePtr = cap_frame_cap_get_capFBasePtr(bufferCap); pageBits = pageBitsForSize(cap_frame_cap_get_capFSize(bufferCap)); return (word_t *)(basePtr + (w_bufferPtr & MASK(pageBits))); } else { return NULL; } }
cap_t CONST Arch_maskCapRights(seL4_CapRights_t cap_rights_mask, cap_t cap) { if (cap_get_capType(cap) == cap_frame_cap) { vm_rights_t vm_rights; vm_rights = vmRightsFromWord(cap_frame_cap_get_capFVMRights(cap)); vm_rights = maskVMRights(vm_rights, cap_rights_mask); return cap_frame_cap_set_capFVMRights(cap, wordFromVMRights(vm_rights)); } else { return cap; } }