Ejemplo n.º 1
0
void
freebsd_linker_set_add(struct linker_set *set, void *sym)
{
	void **new_items;

	new_items = (void *)osenv_mem_alloc((set->ls_length + 2) * sizeof(void *), 0, 0);

#if 0
	printf("in %s: ",__FUNCTION__);
	printf("add %x to %x (%d entries)\n", sym, set, set->ls_length);
#endif

	bcopy(set->ls_items, new_items, set->ls_length * sizeof(void *));
	new_items[set->ls_length] = sym;
	set->ls_length++;
	new_items[set->ls_length] = NULL;

	if (set->ls_items)
		osenv_mem_free(set->ls_items, 0, 
			       set->ls_length * sizeof(void *));

#if 0
	printf("set->ls_items is %x; new_items is %x\n", set->ls_items, 
	       new_items);
#endif

	set->ls_items = new_items;
}
Ejemplo n.º 2
0
void *malloc(unsigned long size, int type, int flags)
{
    struct proc *p;
    int osenv_flags = OSENV_AUTO_SIZE;
    void *ptr;

    if (flags & M_NOWAIT)
	osenv_flags |= OSENV_NONBLOCKING;
    
    p = curproc;
    ptr = osenv_mem_alloc(size, osenv_flags, 0);
    curproc = p;
    if (!ptr && (flags & M_WAITOK))
	    panic("netbsd glue malloc: out of memory");
    return ptr; 
}
Ejemplo n.º 3
0
oskit_error_t
osenv_rootbus_addchild(oskit_device_t *dev)
{
	struct node *n, *nn;
	oskit_devinfo_t info;
	oskit_error_t err;
	int pos_n;

	/* XXX check already present */

	/*
	 * Find the device's short name;
	 * we'll use that to generate the position string.
	 */
	err = oskit_device_getinfo(dev, &info);
	if (err)
		return err;

	/* Create a new device node */
	n = osenv_mem_alloc(sizeof(*n), OSENV_PHYS_WIRED, 0);
	if (n == NULL)
		return OSKIT_E_OUTOFMEMORY;
	n->next = nodes; nodes = n;
	n->dev = dev; oskit_device_addref(dev);

	/*
	 * Produce a unique position string for this device node.
	 * If there are multiple nodes with the same name,
	 * tack on an integer to make them unique.
	 */
	osenv_assert(OSKIT_DEVNAME_MAX < OSKIT_BUS_POS_MAX);
	osenv_assert(strlen(info.name) <= OSKIT_DEVNAME_MAX);
	pos_n = 0;
	strcpy(n->pos, info.name);
	retry:
	for (nn = n->next; nn; nn = nn->next) {
		if (strcmp(n->pos, nn->pos) == 0) {
			sprintf(n->pos, "%s%d", info.name, ++pos_n);
			goto retry;
		}
	}

	return 0;
}
Ejemplo n.º 4
0
/*
 * One time setup.
 */
static int
init_network(void)
{
	if (eif_count >= 0)
		return eif_count;

	start_net_devices();

        eif_count = osenv_device_lookup(&oskit_etherdev_iid, (void***)&edev);
	assert(eif_count >= 0);
	if (eif_count == 0)
		return 0;

	eif = osenv_mem_alloc(sizeof(*eif) * eif_count, 0, 0);
	assert(eif != 0);
	memset(eif, 0, sizeof(*eif) * eif_count);

	startup_atexit(release_network, NULL);

	return eif_count;
}
Ejemplo n.º 5
0
Archivo: irq.c Proyecto: mischief/los
/*
 * Attach a handler to an IRQ.
 */
int
request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
            unsigned long flags, const char *device, void *dev_id)
{
    void (*intr_handler)(void *);
    struct task_struct *cur = current;
    int rc;
    int fdev_flags;
    struct int_handler *temp;

    /* Make sure it is valid to assign this handler */
#ifdef IRQ_DEBUG
    osenv_log(OSENV_LOG_DEBUG, "IRQ %d requested by %s at %p\n",
              irq, (device ? device : ""), handler);
#endif

    if (!handler) {
        return (-EINVAL);
    }

    if (!shared[irq]) {
        return (-EBUSY);
    }

    /* If owned by sharing, and we won't share, we're done too */
    if (handlers[irq] && ((flags & SA_SHIRQ) == 0)) {
        return (-EBUSY);
    }

    /* okay, now set up the handler */

    temp = osenv_mem_alloc(sizeof(struct int_handler), 0, 1);
    if (!temp)
        return (-ENOMEM);

    temp->next = handlers[irq];
    handlers[irq] = temp;

    handlers[irq]->func = handler;
    handlers[irq]->flags = flags;
    handlers[irq]->dev_id = dev_id;

    if (handlers[irq]->next) { /* already have the IRQ from FDEV. */
        osenv_log(OSENV_LOG_DEBUG,
                  "adding another linux handler to irq %d, tag = %x\n",
                  irq, (unsigned)handler);
    } else {

        intr_handler = (flags & SA_PROBE) ? probe_intr : linux_intr;
        fdev_flags = (flags & SA_SHIRQ) ? OSENV_IRQ_SHAREABLE : 0;

        rc=osenv_irq_alloc(irq, intr_handler, (void *)irq, fdev_flags);
        current = cur;	/* restore current after possibly blocking */
        if (rc) {
            temp = handlers[irq];
            handlers[irq] = handlers[irq]->next;
            osenv_mem_free(temp, 0, sizeof(struct int_handler));

            return (-EBUSY);
        }
    }

    /* update the shared flag */
    if ((flags & SA_SHIRQ) == 0)
        shared[irq] = 0;

    DEBUG_MSG();
    return (0);
}