void fficlear_tls_reply_cap_in_tcb(unsigned char *c, long clen, unsigned char *a, long alen) { camkes_tls_t *tls = camkes_get_tls(); if (tls->reply_cap_in_tcb) { tls->reply_cap_in_tcb = false; a[1] = 1; } else { camkes_unprotect_reply_cap(); a[1] = 0; } a[0] = FFI_SUCCESS; }
static size_t *get_/*? name ?*/_sz(void) { switch(camkes_get_tls()->thread_index) { /*- for index in threads -*/ case /*? index ?*/: return & /*? name ?*/_sz_/*? index ?*/; /*- endfor -*/ default: assert(!"invalid thread index"); abort(); } }
static void sel4_abort(void) { /* Suspend ourselves. This will cap fault if a setup routine has not saved * our TCB cap in the TLS region. */ seL4_TCB_Suspend(camkes_get_tls()->tcb_cap); /* We expect to never be woken up. */ while (1); /* Shut the compiler up about noreturn. */ }
void ffiset_tls_cnode_cap(unsigned char *c, long clen, unsigned char *a, long alen) { seL4_CPtr cnode; memcpy(&cnode, a, sizeof(cnode)); camkes_get_tls()->cnode_cap = cnode; a[0] = FFI_SUCCESS; }
int main_continued(void) { vm_t vm; int err; /* setup for restart with a setjmp */ while (setjmp(restart_jmp_buf) != 0) { reset_resources(); } restart_tcb = camkes_get_tls()->tcb_cap; restart_event_reg_callback(restart_event, NULL); err = vmm_init(); assert(!err); print_cpio_info(); /* Create the VM */ err = vm_create(VM_NAME, VM_PRIO, _fault_endpoint, VM_BADGE, &_vka, &_simple, &_vspace, &_io_ops, &vm); if (err) { printf("Failed to create VM\n"); seL4_DebugHalt(); return -1; } /* HACK: See if we have a "RAM device" for 1-1 mappings */ map_unity_ram(&vm); /* Load system images */ printf("Loading Linux: \'%s\' dtb: \'%s\'\n", VM_LINUX_NAME, VM_LINUX_DTB_NAME); err = load_linux(&vm, VM_LINUX_NAME, VM_LINUX_DTB_NAME); if (err) { printf("Failed to load VM image\n"); seL4_DebugHalt(); return -1; } vm_vchan_setup(&vm); /* Power on */ printf("Starting VM\n\n"); err = vm_start(&vm); if (err) { printf("Failed to start VM\n"); seL4_DebugHalt(); return -1; } /* Loop forever, handling events */ while (1) { seL4_MessageInfo_t tag; seL4_Word sender_badge; tag = seL4_Wait(_fault_endpoint, &sender_badge); if (sender_badge == 0) { seL4_Word label; label = seL4_MessageInfo_get_label(tag); if (label == IRQ_MESSAGE_LABEL) { irq_server_handle_irq_ipc(_irq_server); } else { printf("Unknown label (%d) for IPC badge %d\n", label, sender_badge); } } else if (sender_badge == VUSB_NBADGE) { vusb_notify(); } else { assert(sender_badge == VM_BADGE); err = vm_event(&vm, tag); if (err) { /* Shutdown */ vm_stop(&vm); seL4_DebugHalt(); while (1); } } } return 0; }