Skip to content

Commit

Permalink
tryRaisingTimeoutFault()
Browse files Browse the repository at this point in the history
Signed-off-by: Axel Heider <[email protected]>
  • Loading branch information
axel-h committed Jul 12, 2024
1 parent 036c8cf commit aa66fba
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 19 deletions.
7 changes: 1 addition & 6 deletions include/kernel/faulthandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,7 @@
bool_t isValidFaultHandler(cap_t cap, bool_t allow_null_cap);

#ifdef CONFIG_KERNEL_MCS
static inline bool_t validTimeoutHandler(tcb_t *tptr)
{
return cap_get_capType(TCB_PTR_CTE_PTR(tptr, tcbTimeoutHandler)->cap) == cap_endpoint_cap;
}

void handleTimeout(tcb_t *tptr);
bool_t tryRaisingTimeoutFault(tcb_t *tptr, word_t scBadge);
void handleNoFaultHandler(tcb_t *tptr);
#else
void handleDoubleFault(tcb_t *tptr, seL4_Fault_t ex1);
Expand Down
15 changes: 12 additions & 3 deletions src/kernel/faulthandler.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,19 @@ static bool_t sendFaultIPC(tcb_t *tptr, cap_t handlerCap, bool_t can_donate)
}
}

void handleTimeout(tcb_t *tptr)
bool_t tryRaisingTimeoutFault(tcb_t *tptr, word_t scBadge)
{
assert(validTimeoutHandler(tptr));
sendFaultIPC(tptr, TCB_PTR_CTE_PTR(tptr, tcbTimeoutHandler)->cap, false);
/* get the timeout handler */
cap_t handlerCap = TCB_PTR_CTE_PTR(tptr, tcbTimeoutHandler)->cap;
if (!isValidFaultHandler(handlerCap, false)) {
return false;
}

/* create the time fault and send the fault IPC */
tptr->tcbFault = seL4_Fault_Timeout_new(scBadge);
sendFaultIPC(tptr, handlerCap, false);

return true;
}

#else
Expand Down
17 changes: 7 additions & 10 deletions src/kernel/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <kernel/thread.h>
#include <kernel/vspace.h>
#ifdef CONFIG_KERNEL_MCS
#include <kernel/faulthandler.h>
#include <object/schedcontext.h>
#endif
#include <model/statedata.h>
Expand Down Expand Up @@ -183,13 +184,9 @@ void doReplyTransfer(tcb_t *sender, tcb_t *receiver, cte_t *slot, bool_t grant)
if (receiver->tcbSchedContext && isRunnable(receiver)) {
if (refill_ready(receiver->tcbSchedContext) && refill_sufficient(receiver->tcbSchedContext, 0)) {
possibleSwitchTo(receiver);
} else {
if (validTimeoutHandler(receiver) && fault_type != seL4_Fault_Timeout) {
current_fault = seL4_Fault_Timeout_new(receiver->tcbSchedContext->scBadge);
handleTimeout(receiver);
} else {
postpone(receiver->tcbSchedContext);
}
} else if ((fault_type == seL4_Fault_Timeout) ||
!tryRaisingTimeoutFault(receiver, receiver->tcbSchedContext->scBadge)) {
postpone(receiver->tcbSchedContext);
}
}
#endif
Expand Down Expand Up @@ -620,9 +617,9 @@ void chargeBudget(ticks_t consumed, bool_t canTimeoutFault)

void endTimeslice(bool_t can_timeout_fault)
{
if (can_timeout_fault && !isRoundRobin(NODE_STATE(ksCurSC)) && validTimeoutHandler(NODE_STATE(ksCurThread))) {
current_fault = seL4_Fault_Timeout_new(NODE_STATE(ksCurSC)->scBadge);
handleTimeout(NODE_STATE(ksCurThread));
if (can_timeout_fault && !isRoundRobin(NODE_STATE(ksCurSC)) &&
tryRaisingTimeoutFault(NODE_STATE(ksCurThread), NODE_STATE(ksCurSC)->scBadge)) {
/* done */
} else if (refill_ready(NODE_STATE(ksCurSC)) && refill_sufficient(NODE_STATE(ksCurSC), 0)) {
/* apply round robin */
assert(!thread_state_get_tcbQueued(NODE_STATE(ksCurThread)->tcbState));
Expand Down

0 comments on commit aa66fba

Please sign in to comment.