int of_set_property(struct device_node *dp, const char *name, void *val, int len) { struct property **prevp; void *new_val; int err; new_val = kmalloc(len, GFP_KERNEL); if (!new_val) return -ENOMEM; memcpy(new_val, val, len); err = -ENODEV; mutex_lock(&of_set_property_mutex); write_lock(&devtree_lock); prevp = &dp->properties; while (*prevp) { struct property *prop = *prevp; if (!strcasecmp(prop->name, name)) { void *old_val = prop->value; int ret; ret = prom_setprop(dp->phandle, name, val, len); err = -EINVAL; if (ret >= 0) { prop->value = new_val; prop->length = len; if (OF_IS_DYNAMIC(prop)) kfree(old_val); OF_MARK_DYNAMIC(prop); err = 0; } break; } prevp = &(*prevp)->next; } write_unlock(&devtree_lock); mutex_unlock(&of_set_property_mutex); /* XXX Upate procfs if necessary... */ return err; }
/* returns added device node so it can be added to procfs in the case * of hotpluging */ static struct device_node *xen_add_vcpu_node(struct device_node *boot_cpu, uint cpu) { struct device_node *new_cpu; struct property *pp; void *p; int sz; int type_sz; int name_sz; DBG("%s: boot cpu: %s\n", __func__, boot_cpu->full_name); /* allocate in one shot in case we fail */ name_sz = strlen(boot_cpu->name) + 1; type_sz = strlen(boot_cpu->type) + 1; sz = sizeof (*new_cpu); /* the node */ sz += strlen(boot_cpu->full_name) + 3; /* full_name */ sz += name_sz; /* name */ sz += type_sz; /* type */ p = xen_of_alloc(sz); if (!p) return NULL; memset(p, 0, sz); /* the node */ new_cpu = p; p += sizeof (*new_cpu); /* name */ new_cpu->name = p; strcpy(new_cpu->name, boot_cpu->name); p += name_sz; /* type */ new_cpu->type = p; strcpy(new_cpu->type, boot_cpu->type); p += type_sz; /* full_name */ new_cpu->full_name = p; /* assemble new full_name */ pp = of_find_property(boot_cpu, "name", NULL); if (!pp) panic("%s: no name prop\n", __func__); DBG("%s: name is: %s = %s\n", __func__, pp->name, pp->value); sprintf(new_cpu->full_name, "/cpus/%s@%u", pp->value, cpu); if (dup_properties(new_cpu, boot_cpu)) { xen_of_free(new_cpu); return NULL; } /* fixup reg property */ DBG("%s: updating reg: %d\n", __func__, cpu); pp = of_find_property(new_cpu, "reg", NULL); if (!pp) panic("%s: no reg prop\n", __func__); *(int *)pp->value = cpu; if (mem_init_done) OF_MARK_DYNAMIC(new_cpu); kref_init(&new_cpu->kref); /* insert the node */ new_cpu->parent = of_get_parent(boot_cpu); of_attach_node(new_cpu); of_node_put(new_cpu->parent); return new_cpu; }