static void test_secret_crypt_base64(void) { Object *master = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "master", &error_abort, "data", "9miloPQCzGy+TL6aonfzVcptibCmCIhKzrnlfwiWivk=", "format", "base64", NULL); Object *sec = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "sec0", &error_abort, "data", "zL/3CUYZC1IqOrRrzXqwsA==", "format", "base64", "keyid", "master", "iv", "0I7Gw/TKuA+Old2W2apQ3g==", NULL); char *pw = qcrypto_secret_lookup_as_utf8("sec0", &error_abort); g_assert_cmpstr(pw, ==, "123456"); object_unparent(sec); object_unparent(master); g_free(pw); }
static void test_secret_crypt_raw(void) { Object *master = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "master", &error_abort, "data", "9miloPQCzGy+TL6aonfzVcptibCmCIhKzrnlfwiWivk=", "format", "base64", NULL); Object *sec = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "sec0", &error_abort, "data", "\xCC\xBF\xF7\x09\x46\x19\x0B\x52\x2A\x3A\xB4\x6B\xCD\x7A\xB0\xB0", "format", "raw", "keyid", "master", "iv", "0I7Gw/TKuA+Old2W2apQ3g==", NULL); char *pw = qcrypto_secret_lookup_as_utf8("sec0", &error_abort); g_assert_cmpstr(pw, ==, "123456"); object_unparent(sec); object_unparent(master); g_free(pw); }
static void spapr_unrealize_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc) { if (!sc->pre_3_0_migration) { vmstate_unregister(NULL, &vmstate_spapr_cpu_state, cpu->machine_data); } qemu_unregister_reset(spapr_cpu_reset, cpu); if (spapr_cpu_state(cpu)->icp) { object_unparent(OBJECT(spapr_cpu_state(cpu)->icp)); } if (spapr_cpu_state(cpu)->tctx) { object_unparent(OBJECT(spapr_cpu_state(cpu)->tctx)); } cpu_remove_sync(CPU(cpu)); object_unparent(OBJECT(cpu)); }
/* * Invoke device-specific unplug handler, disable the subchannel * (including sending a channel report to the guest) and remove the * device from the virtual css bus. */ static void ccw_device_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { CcwDevice *ccw_dev = CCW_DEVICE(dev); CCWDeviceClass *k = CCW_DEVICE_GET_CLASS(ccw_dev); SubchDev *sch = ccw_dev->sch; Error *err = NULL; if (k->unplug) { k->unplug(hotplug_dev, dev, &err); if (err) { error_propagate(errp, err); return; } } /* * We should arrive here only for device_del, since we don't support * direct hot(un)plug of channels. */ assert(sch != NULL); /* Subchannel is now disabled and no longer valid. */ sch->curr_status.pmcw.flags &= ~(PMCW_FLAGS_MASK_ENA | PMCW_FLAGS_MASK_DNV); css_generate_sch_crws(sch->cssid, sch->ssid, sch->schid, 1, 0); object_unparent(OBJECT(dev)); }
static void pcie_unplug_device(PCIBus *bus, PCIDevice *dev, void *opaque) { HotplugHandler *hotplug_ctrl = qdev_get_hotplug_handler(DEVICE(dev)); hotplug_handler_unplug(hotplug_ctrl, DEVICE(dev), &error_abort); object_unparent(OBJECT(dev)); }
static void test_secret_indirect_emptyfile(void) { Object *sec; char *fname = NULL; int fd = g_file_open_tmp("qemu-test-crypto-secretXXXXXX", &fname, NULL); g_assert(fd >= 0); g_assert_nonnull(fname); sec = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "sec0", &error_abort, "file", fname, NULL); char *pw = qcrypto_secret_lookup_as_utf8("sec0", &error_abort); g_assert_cmpstr(pw, ==, ""); object_unparent(sec); g_free(pw); close(fd); unlink(fname); g_free(fname); }
void user_creatable_del(const char *id, Error **errp) { Object *container; Object *obj; container = object_get_objects_root(); obj = object_resolve_path_component(container, id); if (!obj) { error_setg(errp, "object '%s' not found", id); return; } if (!user_creatable_can_be_deleted(USER_CREATABLE(obj))) { error_setg(errp, "object '%s' is in use, can not be deleted", id); return; } /* * if object was defined on the command-line, remove its corresponding * option group entry */ qemu_opts_del(qemu_opts_find(qemu_find_opts_err("object", &error_abort), id)); object_unparent(obj); }
static void ppc440_pcix_clear_region(MemoryRegion *parent, MemoryRegion *mem) { if (memory_region_is_mapped(mem)) { memory_region_del_subregion(parent, mem); object_unparent(OBJECT(mem)); } }
static void spapr_delete_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc) { SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu); cpu->machine_data = NULL; g_free(spapr_cpu); object_unparent(OBJECT(cpu)); }
static void unplug_nic(PCIBus *b, PCIDevice *d, void *o) { /* We have to ignore passthrough devices */ if (pci_get_word(d->config + PCI_CLASS_DEVICE) == PCI_CLASS_NETWORK_ETHERNET && strcmp(d->name, "xen-pci-passthrough") != 0) { object_unparent(OBJECT(d)); } }
static void unplug_nic(PCIBus *b, PCIDevice *d) { if (pci_get_word(d->config + PCI_CLASS_DEVICE) == PCI_CLASS_NETWORK_ETHERNET) { /* Until qdev_free includes a call to object_unparent, we call it here */ object_unparent(&d->qdev.parent_obj); qdev_free(&d->qdev); } }
static void spapr_cpu_core_unrealizefn(DeviceState *dev, Error **errp) { sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev)); CPUCore *cc = CPU_CORE(dev); int i; for (i = 0; i < cc->nr_threads; i++) { Object *obj = OBJECT(sc->threads[i]); DeviceState *dev = DEVICE(obj); CPUState *cs = CPU(dev); PowerPCCPU *cpu = POWERPC_CPU(cs); spapr_cpu_destroy(cpu); object_unparent(cpu->intc); cpu_remove_sync(cs); object_unparent(obj); } g_free(sc->threads); }
static void test_dummy_delchild(void) { Object *parent = object_get_objects_root(); DummyDev *dev = DUMMY_DEV( object_new_with_props(TYPE_DUMMY_DEV, parent, "dev0", &error_abort, NULL)); object_unparent(OBJECT(dev)); }
static void spapr_cpu_core_unrealizefn(DeviceState *dev, Error **errp) { sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev)); sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev)); size_t size = object_type_get_instance_size(scc->cpu_type); CPUCore *cc = CPU_CORE(dev); int i; for (i = 0; i < cc->nr_threads; i++) { void *obj = sc->threads + i * size; DeviceState *dev = DEVICE(obj); CPUState *cs = CPU(dev); PowerPCCPU *cpu = POWERPC_CPU(cs); spapr_cpu_destroy(cpu); object_unparent(cpu->intc); cpu_remove_sync(cs); object_unparent(obj); } g_free(sc->threads); }
void portio_list_destroy(PortioList *piolist) { MemoryRegionPortioList *mrpio; unsigned i; for (i = 0; i < piolist->nr; ++i) { mrpio = container_of(piolist->regions[i], MemoryRegionPortioList, mr); object_unparent(OBJECT(&mrpio->mr)); g_free(mrpio); } g_free(piolist->regions); }
static void test_qom_partial_path(void) { Object *root = object_get_objects_root(); Object *cont1 = container_get(root, "/cont1"); Object *obj1 = object_new(TYPE_DUMMY); Object *obj2a = object_new(TYPE_DUMMY); Object *obj2b = object_new(TYPE_DUMMY); bool ambiguous; /* Objects created: * /cont1 * /cont1/obj1 * /cont1/obj2 (obj2a) * /obj2 (obj2b) */ object_property_add_child(cont1, "obj1", obj1, &error_abort); object_unref(obj1); object_property_add_child(cont1, "obj2", obj2a, &error_abort); object_unref(obj2a); object_property_add_child(root, "obj2", obj2b, &error_abort); object_unref(obj2b); ambiguous = false; g_assert(!object_resolve_path_type("", TYPE_DUMMY, &ambiguous)); g_assert(ambiguous); g_assert(!object_resolve_path_type("", TYPE_DUMMY, NULL)); ambiguous = false; g_assert(!object_resolve_path("obj2", &ambiguous)); g_assert(ambiguous); g_assert(!object_resolve_path("obj2", NULL)); ambiguous = false; g_assert(object_resolve_path("obj1", &ambiguous) == obj1); g_assert(!ambiguous); g_assert(object_resolve_path("obj1", NULL) == obj1); object_unparent(obj2b); object_unparent(cont1); }
static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot) { int devfn; int pci_slot = SHPC_IDX_TO_PCI(slot); for (devfn = PCI_DEVFN(pci_slot, 0); devfn <= PCI_DEVFN(pci_slot, PCI_FUNC_MAX - 1); ++devfn) { PCIDevice *affected_dev = shpc->sec_bus->devices[devfn]; if (affected_dev) { object_unparent(OBJECT(affected_dev)); } } }
void shpc_free(PCIDevice *d) { SHPCDevice *shpc = d->shpc; if (!shpc) { return; } object_unparent(OBJECT(&shpc->mmio)); g_free(shpc->config); g_free(shpc->cmask); g_free(shpc->wmask); g_free(shpc->w1cmask); g_free(shpc); d->shpc = NULL; }
static void char_ringbuf_test(void) { QemuOpts *opts; Chardev *chr; CharBackend be; char *data; int ret; opts = qemu_opts_create(qemu_find_opts("chardev"), "ringbuf-label", 1, &error_abort); qemu_opt_set(opts, "backend", "ringbuf", &error_abort); qemu_opt_set(opts, "size", "5", &error_abort); chr = qemu_chr_new_from_opts(opts, NULL); g_assert_null(chr); qemu_opts_del(opts); opts = qemu_opts_create(qemu_find_opts("chardev"), "ringbuf-label", 1, &error_abort); qemu_opt_set(opts, "backend", "ringbuf", &error_abort); qemu_opt_set(opts, "size", "2", &error_abort); chr = qemu_chr_new_from_opts(opts, &error_abort); g_assert_nonnull(chr); qemu_opts_del(opts); qemu_chr_fe_init(&be, chr, &error_abort); ret = qemu_chr_fe_write(&be, (void *)"buff", 4); g_assert_cmpint(ret, ==, 4); data = qmp_ringbuf_read("ringbuf-label", 4, false, 0, &error_abort); g_assert_cmpstr(data, ==, "ff"); g_free(data); data = qmp_ringbuf_read("ringbuf-label", 4, false, 0, &error_abort); g_assert_cmpstr(data, ==, ""); g_free(data); qemu_chr_fe_deinit(&be, true); /* check alias */ opts = qemu_opts_create(qemu_find_opts("chardev"), "memory-label", 1, &error_abort); qemu_opt_set(opts, "backend", "memory", &error_abort); qemu_opt_set(opts, "size", "2", &error_abort); chr = qemu_chr_new_from_opts(opts, NULL); g_assert_nonnull(chr); object_unparent(OBJECT(chr)); qemu_opts_del(opts); }
static void bus_unparent(struct uc_struct *uc, Object *obj) { BusState *bus = BUS(uc, obj); BusChild *kid; while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) { DeviceState *dev = kid->child; object_unparent(uc, OBJECT(dev)); } if (bus->parent) { QLIST_REMOVE(bus, sibling); bus->parent->num_child_bus--; bus->parent = NULL; } }
/** * Add a child to an object. If the parent is NULL then we unparent the object, * which MAY FREE THE OBJECT. **/ void object_reparent(object_t *object, object_t *parent) { object_grab(object); object_unparent(object); object->parent = parent; if (parent) { parent->children = vec_expand(parent->children, parent->child_count); parent->children[parent->child_count++] = object; } else { object_ungrab(object); } }
static void pci_bridge_region_cleanup(PCIBridge *br, PCIBridgeWindows *w) { object_unparent(OBJECT(&w->alias_io)); object_unparent(OBJECT(&w->alias_mem)); object_unparent(OBJECT(&w->alias_pref_mem)); object_unparent(OBJECT(&w->alias_vga[QEMU_PCI_VGA_IO_LO])); object_unparent(OBJECT(&w->alias_vga[QEMU_PCI_VGA_IO_HI])); object_unparent(OBJECT(&w->alias_vga[QEMU_PCI_VGA_MEM])); g_free(w); }
static void char_console_test_subprocess(void) { QemuOpts *opts; Chardev *chr; opts = qemu_opts_create(qemu_find_opts("chardev"), "console-label", 1, &error_abort); qemu_opt_set(opts, "backend", "console", &error_abort); chr = qemu_chr_new_from_opts(opts, NULL); g_assert_nonnull(chr); qemu_chr_write_all(chr, (const uint8_t *)"CONSOLE", 7); qemu_opts_del(opts); object_unparent(OBJECT(chr)); }
static void test_secret_conv_base64_utf8invalid(void) { Object *sec = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "sec0", &error_abort, "data", "f0VMRgIBAQAAAA==", "format", "base64", NULL); char *pw = qcrypto_secret_lookup_as_utf8("sec0", NULL); g_assert(pw == NULL); object_unparent(sec); }
static void test_secret_direct(void) { Object *sec = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "sec0", &error_abort, "data", "123456", NULL); char *pw = qcrypto_secret_lookup_as_utf8("sec0", &error_abort); g_assert_cmpstr(pw, ==, "123456"); object_unparent(sec); g_free(pw); }
static void test_dummy_iterator(void) { Object *parent = object_get_objects_root(); DummyObject *dobj = DUMMY_OBJECT( object_new_with_props(TYPE_DUMMY, parent, "dummy0", &error_abort, "bv", "yes", "sv", "Hiss hiss hiss", "av", "platypus", NULL)); ObjectPropertyIterator iter; object_property_iter_init(&iter, OBJECT(dobj)); test_dummy_prop_iterator(&iter); object_unparent(OBJECT(dobj)); }
void user_creatable_del(const char *id, Error **errp) { Object *container; Object *obj; container = object_get_objects_root(); obj = object_resolve_path_component(container, id); if (!obj) { error_setg(errp, "object '%s' not found", id); return; } if (!user_creatable_can_be_deleted(USER_CREATABLE(obj), errp)) { error_setg(errp, "object '%s' is in use, can not be deleted", id); return; } object_unparent(obj); }
RegisterInfoArray *register_init_block32(DeviceState *owner, const RegisterAccessInfo *rae, int num, RegisterInfo *ri, uint32_t *data, const MemoryRegionOps *ops, bool debug_enabled, uint64_t memory_size) { const char *device_prefix = object_get_typename(OBJECT(owner)); RegisterInfoArray *r_array = g_new0(RegisterInfoArray, 1); int i; r_array->r = g_new0(RegisterInfo *, num); r_array->num_elements = num; r_array->debug = debug_enabled; r_array->prefix = device_prefix; for (i = 0; i < num; i++) { int index = rae[i].addr / 4; RegisterInfo *r = &ri[index]; *r = (RegisterInfo) { .data = &data[index], .data_size = sizeof(uint32_t), .access = &rae[i], .opaque = owner, }; register_init(r); r_array->r[i] = r; } memory_region_init_io(&r_array->mem, OBJECT(owner), ops, r_array, device_prefix, memory_size); return r_array; } void register_finalize_block(RegisterInfoArray *r_array) { object_unparent(OBJECT(&r_array->mem)); g_free(r_array->r); g_free(r_array); }
static void test_secret_noconv_base64_good(void) { Object *sec = object_new_with_props( TYPE_QCRYPTO_SECRET, object_get_objects_root(), "sec0", &error_abort, "data", "MTIzNDU2", "format", "base64", NULL); char *pw = qcrypto_secret_lookup_as_base64("sec0", &error_abort); g_assert_cmpstr(pw, ==, "MTIzNDU2"); object_unparent(sec); g_free(pw); }
static int pcie_cap_slot_hotplug(DeviceState *qdev, PCIDevice *pci_dev, PCIHotplugState state) { PCIDevice *d = PCI_DEVICE(qdev); uint8_t *exp_cap = d->config + d->exp.exp_cap; uint16_t sltsta = pci_get_word(exp_cap + PCI_EXP_SLTSTA); /* Don't send event when device is enabled during qemu machine creation: * it is present on boot, no hotplug event is necessary. We do send an * event when the device is disabled later. */ if (state == PCI_COLDPLUG_ENABLED) { pci_word_test_and_set_mask(exp_cap + PCI_EXP_SLTSTA, PCI_EXP_SLTSTA_PDS); return 0; } PCIE_DEV_PRINTF(pci_dev, "hotplug state: %d\n", state); if (sltsta & PCI_EXP_SLTSTA_EIS) { /* the slot is electromechanically locked. * This error is propagated up to qdev and then to HMP/QMP. */ return -EBUSY; } /* TODO: multifunction hot-plug. * Right now, only a device of function = 0 is allowed to be * hot plugged/unplugged. */ assert(PCI_FUNC(pci_dev->devfn) == 0); if (state == PCI_HOTPLUG_ENABLED) { pci_word_test_and_set_mask(exp_cap + PCI_EXP_SLTSTA, PCI_EXP_SLTSTA_PDS); pcie_cap_slot_event(d, PCI_EXP_HP_EV_PDC); } else { object_unparent(OBJECT(pci_dev)); pci_word_test_and_clear_mask(exp_cap + PCI_EXP_SLTSTA, PCI_EXP_SLTSTA_PDS); pcie_cap_slot_event(d, PCI_EXP_HP_EV_PDC); } return 0; }