/* NOTE: offset is either 1 or 3 */ static inline unsigned int setMRs_lookup_failure(tcb_t *receiver, word_t* receiveIPCBuffer, lookup_fault_t luf, unsigned int offset) { word_t lufType = lookup_fault_get_lufType(luf); assert(n_msgRegisters == 2); if (offset < n_msgRegisters) { setRegister(receiver, msgRegisters[offset], lufType + 1); } if (!receiveIPCBuffer) { return n_msgRegisters; } if (offset >= n_msgRegisters) { receiveIPCBuffer[offset + 1] = lufType + 1; } switch (lufType) { case lookup_fault_invalid_root: return offset + 1; case lookup_fault_missing_capability: receiveIPCBuffer[offset + 2] = lookup_fault_missing_capability_get_bitsLeft(luf); return offset + 2; case lookup_fault_depth_mismatch: receiveIPCBuffer[offset + 2] = lookup_fault_depth_mismatch_get_bitsLeft(luf); receiveIPCBuffer[offset + 3] = lookup_fault_depth_mismatch_get_bitsFound(luf); return offset + 3; case lookup_fault_guard_mismatch: receiveIPCBuffer[offset + 2] = lookup_fault_guard_mismatch_get_bitsLeft(luf); receiveIPCBuffer[offset + 3] = lookup_fault_guard_mismatch_get_guardFound(luf); receiveIPCBuffer[offset + 4] = lookup_fault_guard_mismatch_get_bitsFound(luf); return offset + 4; default: fail("Invalid lookup failure"); } }
static inline unsigned int setMRs_lookup_failure(tcb_t *receiver, word_t *receiveIPCBuffer, lookup_fault_t luf, unsigned int offset) { word_t lufType = lookup_fault_get_lufType(luf); word_t i; i = setMR(receiver, receiveIPCBuffer, offset, lufType + 1); /* check constants match libsel4 */ if (offset == seL4_CapFault_LookupFailureType) { assert(offset + 1 == seL4_CapFault_BitsLeft); assert(offset + 2 == seL4_CapFault_DepthMismatch_BitsFound); assert(offset + 2 == seL4_CapFault_GuardMismatch_GuardFound); assert(offset + 3 == seL4_CapFault_GuardMismatch_BitsFound); } else { assert(offset == 1); } switch (lufType) { case lookup_fault_invalid_root: return i; case lookup_fault_missing_capability: return setMR(receiver, receiveIPCBuffer, offset + 1, lookup_fault_missing_capability_get_bitsLeft(luf)); case lookup_fault_depth_mismatch: setMR(receiver, receiveIPCBuffer, offset + 1, lookup_fault_depth_mismatch_get_bitsLeft(luf)); return setMR(receiver, receiveIPCBuffer, offset + 2, lookup_fault_depth_mismatch_get_bitsFound(luf)); case lookup_fault_guard_mismatch: setMR(receiver, receiveIPCBuffer, offset + 1, lookup_fault_guard_mismatch_get_bitsLeft(luf)); setMR(receiver, receiveIPCBuffer, offset + 2, lookup_fault_guard_mismatch_get_guardFound(luf)); return setMR(receiver, receiveIPCBuffer, offset + 3, lookup_fault_guard_mismatch_get_bitsFound(luf)); default: fail("Invalid lookup failure"); } }