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; }
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; }
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)); }