/** * \brief Initialize the domain library * * Registers a iref with the monitor to offer the interdisp service on this core * Does not block for completion. */ errval_t domain_init(void) { errval_t err; struct domain_state *domain_state = malloc(sizeof(struct domain_state)); if (!domain_state) { return LIB_ERR_MALLOC_FAIL; } set_domain_state(domain_state); domain_state->iref = 0; domain_state->default_waitset_handler = NULL; domain_state->remote_wakeup_queue = NULL; waitset_chanstate_init(&domain_state->remote_wakeup_event, CHANTYPE_EVENT_QUEUE); for (int i = 0; i < MAX_CPUS; i++) { domain_state->b[i] = NULL; } waitset_init(&domain_state->interdisp_ws); domain_state->conditional = false; err = interdisp_export(NULL, server_listening, server_connected, &domain_state->interdisp_ws, IDC_EXPORT_FLAGS_DEFAULT); if (err_is_fail(err)) { return err; } // XXX: Wait for the export to finish before returning while(!domain_state->conditional) { messages_wait_and_handle_next(); } return SYS_ERR_OK; }
static int xm_serial_xm_ioctl(unsigned long minor, unsigned long cmd, void *arg) { domain_t *dom; int ret = 0; if (minor > XM_SERIAL_COUNT) { return -ENODEV; } if (minor == XM_SERIAL_COUNT) { /* serial device driver */ if (cmd & XMDEV_IO_INIT) { if (sdom == NULL) sdom = (domain_t*)arg; else if (sdom != (domain_t *)arg) { return -EBADF; } } return 0; } /* NON serial device driver */ if(cmd & XMDEV_IO_CLOSE) { clear_bit(xm_serials[minor].flag, XM_SERIAL_DEV_USED); clear_bit(xm_serials[minor].in.serf->flag, RT_SERIAL_dev_INIT); clear_bit(xm_serials[minor].out.serf->flag, RT_SERIAL_dev_INIT); xm_serials[minor].dom = NULL; } /* special command to initialize the serail domain */ if(cmd & XMDEV_IO_OPEN) { dom = (domain_t *)arg; if ((xm_serials[minor].flag & ( 1 << XM_SERIAL_DEV_USED)) && (xm_serials[minor].dom != dom) ) { return -EBUSY; } set_bit(xm_serials[minor].flag, XM_SERIAL_DEV_USED); xm_serials[minor].dom = dom; ret = xm_serial_xm_map(dom->pd, DEFAULT_SERIAL_ADDR, 0, (void *)minor); if( ! ret ) { if( dom->events) { dom->events->serialaddr = DEFAULT_SERIAL_ADDR; } else { XMBUG(); } } else { clear_bit(xm_serials[minor].flag, XM_SERIAL_DEV_USED); xm_serials[minor].dom = NULL; } } else if(cmd & XMDEV_IO_WKUP) { /* wake up the serial device domain */ if(sdom != NULL) set_domain_state(sdom, DOMAIN_ACTIVE); } return ret; }