Exemple #1
0
int dev_handle_irq(dev_irq_state_t *irqState, uint32_t irq,
                   dev_irq_callback_fn_t callback, void *cookie)
{
    assert(irqState && irqState->magic == DEVICE_IRQ_MAGIC);

    if (irq >= DEVICE_MAX_IRQ) {
        ROS_ERROR("dev_handle_irq IRQ num too high. Try raising DEVICE_MAX_IRQ.");
        assert(!"Try raising DEVICE_MAX_IRQ.");
        return EINVALIDPARAM;
    }

    /* Retrieve the handler, if necessary. */
    if (!irqState->handler[irq].handler) {
        assert(irqState->cfg.getIRQHandlerEndpoint);
        irqState->handler[irq].handler = irqState->cfg.getIRQHandlerEndpoint(
            irqState->cfg.getIRQHandlerEndpointCookie, irq
        );
        if (!irqState->handler[irq].handler) {
            ROS_WARNING("dev_handle_irq : could not get IRQ handler for irq %u.\n", irq);
            return EINVALID;
        }
    }

    /* Determine next round-robin channel to go in. */
    uint32_t nextChannel = irqState->cfg.badgeBaseBit + irqState->nextIRQChannel;
    cvector_add(&irqState->channel[irqState->nextIRQChannel], (cvector_item_t) irq);
    irqState->nextIRQChannel = (irqState->nextIRQChannel + 1) % irqState->cfg.numIRQChannels;

    /* Mint the badged AEP. */
    assert(irqState->cfg.notifyAsyncEP);
    seL4_CPtr irqBadge = srv_mint((1 << nextChannel) | irqState->cfg.badgeMaskBits,
                                  irqState->cfg.notifyAsyncEP);
    if (!irqBadge) {
        ROS_WARNING("dev_handle_irq : could not mint badged aep for irq %u.\n", irq);
        return EINVALID;
    }

    /* Assign AEP to the IRQ handler. */
    int error = seL4_IRQHandler_SetNotification(irqState->handler[irq].handler, irqBadge);
    if (error) {
        ROS_WARNING("dev_handle_irq : could not set notify aep for irq %u.\n", irq);
        csfree_delete(irqBadge);
        return EINVALID;
    }
    seL4_IRQHandler_Ack(irqState->handler[irq].handler);

    /* Set callback function and cookie. */
    irqState->handler[irq].callback = callback;
    irqState->handler[irq].cookie = cookie;

    csfree_delete(irqBadge);
    return ESUCCESS;
}
Exemple #2
0
long sys_munmap(va_list ap)
{
    char *addr = va_arg(ap, char*);
    unsigned int length = va_arg(ap, unsigned int);
    refos_err_t err;

    seL4_CPtr window = proc_get_mem_window(addr);
    assert(window);

    seL4_CPtr dspace = proc_get_mem_window_dspace(window, &err);
    assert(dspace);

    /*
    flags = proc_get_window_flag(window);
    */

    err = data_dataunmap(REFOS_PROCSERV_EP, window);
    assert(err == ESUCCESS);

    err = proc_delete_mem_window(window);
    assert(err == ESUCCESS);

    csfree_delete(window);

    return 0;
}
Exemple #3
0
void 
serv_disconnect(serv_connection_t *sc)
{
    if (sc == NULL || sc->error != ESUCCESS) {
        return;
    }

    /* Clean up the parameter buffer. */
    if (sc->paramBuffer.err == ESUCCESS && sc->paramBuffer.vaddr != NULL) {
        data_mapping_release(sc->paramBuffer);
    }

    /* Disconnect session. */
    if (sc->serverSession && !sc->connectionLess) {
        serv_disconnect_direct(sc->serverSession);
        csfree_delete(sc->serverSession);
    }

    /* Release the mountpoint. */
    nsv_mountpoint_release(&sc->serverMountPoint);
    memset(sc, 0, sizeof(serv_connection_t));
}