Example #1
0
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;
}
Example #2
0
 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();
     }
 }
Example #3
0
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. */
}
Example #4
0
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;
}
Example #5
0
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;
}