int /*? me.interface.name ?*/__run(void) { seL4_Word fault_type; seL4_Word length; seL4_MessageInfo_t info; seL4_Word args[4]; seL4_Word reply_cap = /*? reply_cap_slot ?*/; while (1) { /* Wait for fault */ info = seL4_Recv(/*? ep ?*/, &gdb_state.current_thread_tcb); /* Get the relevant registers */ fault_type = seL4_MessageInfo_get_label(info); length = seL4_MessageInfo_get_length(info); for (int i = 0; i < length; i++) { args[i] = seL4_GetMR(i); } gdb_state.current_pc = args[0]; ZF_LOGD("------------------------------"); ZF_LOGD("Received fault for tcb %zu", gdb_state.current_thread_tcb); ZF_LOGD("Stopped at %zx", gdb_state.current_pc); ZF_LOGD("Length: %zu", length); // Save the reply cap seL4_CNode_SaveCaller(/*? cnode ?*/, reply_cap, 32); gdb_state.stop_reason = find_stop_reason(fault_type, args); gdb_state.current_thread_step_mode = false; /* Send fault message to gdb client */ gdb_handle_fault(&gdb_state); /* Wait for gdb client to deal with fault */ int UNUSED error = b_wait(); /* Reply to the fault ep to restart the thread. We look inside the gdb_state struct to interpret how to restart the thread. */ if (gdb_state.stop_reason == stop_step && gdb_state.current_thread_step_mode==false) { /* If this was a Debug Exception, then we respond with a bp_num and the number of instruction to step Since we're going to continue, we set MR0 to 0 */ info = seL4_MessageInfo_new(0, 0, 0, 1); seL4_SetMR(0, 0); seL4_Send(reply_cap, info); } else if (gdb_state.stop_reason == stop_none) { /* If this was a fault, set the instruction pointer to what we expect it to be */ info = seL4_MessageInfo_new(0, 0, 0, 1); seL4_SetMR(0, gdb_state.current_pc); seL4_Send(reply_cap, info); } else { ZF_LOGD("Responding to some other debug exception %d", gdb_state.stop_reason); seL4_Signal(reply_cap); } } UNREACHABLE(); }
static inline void fault_handler_done(seL4_CPtr ep, seL4_Word ip, seL4_CPtr done_ep, seL4_CPtr reply) { /* handle last fault */ ip += UD_INSTRUCTION_SIZE; seL4_ReplyWith1MR(ip, reply); /* tell benchmark we are done */ seL4_Signal(done_ep); /* block */ seL4_Wait(ep, NULL); }
/* Pair for measuring fault -> fault handler path */ static void measure_fault_fn(int argc, char **argv) { assert(argc == N_FAULTER_ARGS); volatile ccnt_t * start = (volatile ccnt_t *) atol(argv[0]); seL4_CPtr done_ep = atol(argv[2]); for (int i = 0; i < N_RUNS + 1; i++) { /* record time */ SEL4BENCH_READ_CCNT(*start); fault(); } seL4_Signal(done_ep); }
/* round_trip fault handling pair */ static void measure_fault_roundtrip_fn(int argc, char **argv) { assert(argc == N_FAULTER_ARGS); fault_results_t *results = (fault_results_t *) atol(argv[1]); seL4_CPtr done_ep = atol(argv[2]); for (int i = 0; i < N_RUNS + 1; i++) { ccnt_t start, end; SEL4BENCH_READ_CCNT(start); fault(); SEL4BENCH_READ_CCNT(end); results->round_trip[i] = end - start; } seL4_Signal(done_ep); }
/* Pair for measuring fault handler -> faultee path */ static void measure_fault_reply_fn(int argc, char **argv) { assert(argc == N_FAULTER_ARGS); volatile ccnt_t *start = (volatile ccnt_t *) atol(argv[0]); fault_results_t *results = (fault_results_t *) atol(argv[1]); seL4_CPtr done_ep = atol(argv[2]); /* handle 1 fault first to make sure start is set */ fault(); for (int i = 0; i < N_RUNS + 1; i++) { fault(); ccnt_t end; SEL4BENCH_READ_CCNT(end); results->fault_reply[i] = end - *start; } seL4_Signal(done_ep); }
void ticker_fn(ccnt_t *results, volatile ccnt_t *current_time) { seL4_Word start, end_low; ccnt_t end; seL4_Word badge; for (int i = 0; i < N_RUNS; i++) { /* wait for irq */ seL4_Wait(timer_signal, &badge); /* record result */ SEL4BENCH_READ_CCNT(end); sel4platsupport_handle_timer_irq(timer, badge); end_low = (seL4_Word) end; start = (seL4_Word) *current_time; results[i] = end_low - start; } seL4_Signal(done_ep); }
/*- set badge = int(configuration[c.from_instance.name].get("%s_attributes" % c.from_interface.name).strip('"')) -*/ void /*? me.to_interface.name ?*/_emit_/*? badge ?*/(void) { seL4_Signal(/*? notification ?*/); }
void /*? me.from_interface.name ?*/_emit_underlying(void) { seL4_Signal(/*? notification ?*/); }