}
}
+ // have cap to return to monitor but no allocated slot and no room in
+ // monitor channel; have user retry over monitor rpc interface
+ if (ram.bits > 0 &&
+ !ret_ram_cap &&
+ err_is_fail(lmp_can_deliver_payload(&monitor_ep, len)))
+ {
+ return SYS_ERR_RETRY_THROUGH_MONITOR;
+ }
+
+
err = cleanup_copy(cte);
if (err_is_fail(err)) {
return err;
memset(&ramcte, 0, sizeof(ramcte));
ramcte.cap.u.ram = ram;
ramcte.cap.type = ObjType_RAM;
- TRACE_CAP_MSG("reclaimed", ret_ram_cap);
+ TRACE_CAP_MSG("reclaimed", &ramcte);
#endif
// XXX: This looks pretty ugly. We need an interface.
err = lmp_deliver_payload(&monitor_ep, NULL,
* \param ep Endpoint capability to send to
* \param payload_len Length (in number of words) of payload
*/
-static errval_t lmp_can_deliver_payload(struct capability *ep,
- size_t payload_len)
+errval_t lmp_can_deliver_payload(struct capability *ep,
+ size_t payload_len)
{
assert(ep != NULL);
assert(ep->type == ObjType_EndPoint);
extern struct dcb *dcb_current, *fpu_dcb;
void dispatch(struct dcb *dcb) __attribute__ ((noreturn));
+errval_t lmp_can_deliver_payload(struct capability *ep,
+ size_t payload_len);
errval_t lmp_deliver_payload(struct capability *ep, struct dcb *send,
uintptr_t *payload, size_t payload_len,
bool captransfer);