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