Example #1
0
/**
 * \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;
}
Example #2
0
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;
}