int qcrypto_tls_session_check_credentials(QCryptoTLSSession *session, Error **errp) { if (object_dynamic_cast(OBJECT(session->creds), TYPE_QCRYPTO_TLS_CREDS_ANON)) { trace_qcrypto_tls_session_check_creds(session, "nop"); return 0; } else if (object_dynamic_cast(OBJECT(session->creds), TYPE_QCRYPTO_TLS_CREDS_PSK)) { trace_qcrypto_tls_session_check_creds(session, "nop"); return 0; } else if (object_dynamic_cast(OBJECT(session->creds), TYPE_QCRYPTO_TLS_CREDS_X509)) { if (session->creds->verifyPeer) { int ret = qcrypto_tls_session_check_certificate(session, errp); trace_qcrypto_tls_session_check_creds(session, ret == 0 ? "pass" : "fail"); return ret; } else { trace_qcrypto_tls_session_check_creds(session, "skip"); return 0; } } else { trace_qcrypto_tls_session_check_creds(session, "error"); error_setg(errp, "Unexpected credential type %s", object_get_typename(OBJECT(session->creds))); return -1; } }
static CcwDevice *s390_get_ccw_device(DeviceState *dev_st) { CcwDevice *ccw_dev = NULL; if (dev_st) { VirtioCcwDevice *virtio_ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent), TYPE_VIRTIO_CCW_DEVICE); if (virtio_ccw_dev) { ccw_dev = CCW_DEVICE(virtio_ccw_dev); } else { SCSIDevice *sd = (SCSIDevice *) object_dynamic_cast(OBJECT(dev_st), TYPE_SCSI_DEVICE); if (sd) { SCSIBus *bus = scsi_bus_from_device(sd); VirtIOSCSI *vdev = container_of(bus, VirtIOSCSI, bus); VirtIOSCSICcw *scsi_ccw = container_of(vdev, VirtIOSCSICcw, vdev); ccw_dev = (CcwDevice *)object_dynamic_cast(OBJECT(scsi_ccw), TYPE_CCW_DEVICE); } } } return ccw_dev; }
/* RP helper function to attach a device to an adaptor. */ void rp_device_attach(Object *adaptor, Object *dev, int rp_nr, int dev_nr, Error **errp) { Error *err = NULL; uint32_t nr_devs; char *name; int i; assert(adaptor); assert(dev); /* Verify that the adaptor is of Remote Port type. */ if (!object_dynamic_cast(adaptor, TYPE_REMOTE_PORT)) { error_setg(errp, "%s is not a Remote-Port adaptor!\n", object_get_canonical_path(adaptor)); return; } name = g_strdup_printf("rp-adaptor%d", rp_nr); object_property_set_link(dev, adaptor, name, &err); g_free(name); if (err != NULL) { error_propagate(errp, err); return; } name = g_strdup_printf("rp-chan%d", rp_nr); object_property_set_int(dev, dev_nr, name, &err); g_free(name); if (err != NULL && !object_dynamic_cast(dev, TYPE_REMOTE_PORT_DEVICE)) { /* * RP devices that only receive requests may not need to * know their channel/dev number. If not, treat this as * an error. */ error_propagate(errp, err); return; } err = NULL; nr_devs = object_property_get_int(dev, "nr-devs", &err); if (err) { nr_devs = 1; err = NULL; } /* Multi-channel devs use consecutive numbering. */ for (i = 0; i < nr_devs; i++) { name = g_strdup_printf("remote-port-dev%d", dev_nr + i); object_property_set_link(adaptor, dev, name, &err); g_free(name); if (err != NULL) { error_propagate(errp, err); return; } } }
static bool s390_gen_initial_iplb(S390IPLState *ipl) { DeviceState *dev_st; dev_st = get_boot_device(0); if (dev_st) { VirtioCcwDevice *virtio_ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent), TYPE_VIRTIO_CCW_DEVICE); SCSIDevice *sd = (SCSIDevice *) object_dynamic_cast(OBJECT(dev_st), TYPE_SCSI_DEVICE); VirtIONet *vn = (VirtIONet *) object_dynamic_cast(OBJECT(dev_st), TYPE_VIRTIO_NET); if (vn) { ipl->netboot = true; } if (virtio_ccw_dev) { CcwDevice *ccw_dev = CCW_DEVICE(virtio_ccw_dev); ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN); ipl->iplb.blk0_len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN - S390_IPLB_HEADER_LEN); ipl->iplb.pbt = S390_IPL_TYPE_CCW; ipl->iplb.ccw.devno = cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.ccw.ssid = ccw_dev->sch->ssid & 3; } else if (sd) { SCSIBus *bus = scsi_bus_from_device(sd); VirtIOSCSI *vdev = container_of(bus, VirtIOSCSI, bus); VirtIOSCSICcw *scsi_ccw = container_of(vdev, VirtIOSCSICcw, vdev); CcwDevice *ccw_dev; ccw_dev = (CcwDevice *)object_dynamic_cast(OBJECT(scsi_ccw), TYPE_CCW_DEVICE); if (!ccw_dev) { /* It might be a PCI device instead */ return false; } ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN); ipl->iplb.blk0_len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN - S390_IPLB_HEADER_LEN); ipl->iplb.pbt = S390_IPL_TYPE_QEMU_SCSI; ipl->iplb.scsi.lun = cpu_to_be32(sd->lun); ipl->iplb.scsi.target = cpu_to_be16(sd->id); ipl->iplb.scsi.channel = cpu_to_be16(sd->channel); ipl->iplb.scsi.devno = cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.scsi.ssid = ccw_dev->sch->ssid & 3; } else { return false; /* unknown device */ } if (!s390_ipl_set_loadparm(ipl->iplb.loadparm)) { ipl->iplb.flags |= DIAG308_FLAGS_LP_VALID; } return true; } return false; }
static bool s390_gen_initial_iplb(S390IPLState *ipl) { DeviceState *dev_st; CcwDevice *ccw_dev = NULL; dev_st = get_boot_device(0); if (dev_st) { ccw_dev = s390_get_ccw_device(dev_st); } /* * Currently allow IPL only from CCW devices. */ if (ccw_dev) { SCSIDevice *sd = (SCSIDevice *) object_dynamic_cast(OBJECT(dev_st), TYPE_SCSI_DEVICE); if (sd) { ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN); ipl->iplb.blk0_len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN - S390_IPLB_HEADER_LEN); ipl->iplb.pbt = S390_IPL_TYPE_QEMU_SCSI; ipl->iplb.scsi.lun = cpu_to_be32(sd->lun); ipl->iplb.scsi.target = cpu_to_be16(sd->id); ipl->iplb.scsi.channel = cpu_to_be16(sd->channel); ipl->iplb.scsi.devno = cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.scsi.ssid = ccw_dev->sch->ssid & 3; } else { VirtIONet *vn = (VirtIONet *) object_dynamic_cast(OBJECT(dev_st), TYPE_VIRTIO_NET); ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN); ipl->iplb.blk0_len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN - S390_IPLB_HEADER_LEN); ipl->iplb.pbt = S390_IPL_TYPE_CCW; ipl->iplb.ccw.devno = cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.ccw.ssid = ccw_dev->sch->ssid & 3; if (vn) { ipl->netboot = true; } } if (!s390_ipl_set_loadparm(ipl->iplb.loadparm)) { ipl->iplb.flags |= DIAG308_FLAGS_LP_VALID; } return true; } return false; }
void ich9_pm_device_plug_cb(ICH9LPCPMRegs *pm, DeviceState *dev, Error **errp) { if (pm->acpi_memory_hotplug.is_enabled && object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { acpi_memory_plug_cb(&pm->acpi_regs, pm->irq, &pm->acpi_memory_hotplug, dev, errp); } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { acpi_cpu_plug_cb(&pm->acpi_regs, pm->irq, &pm->gpe_cpu, dev, errp); } else { error_setg(errp, "acpi: device plug request for not supported device" " type: %s", object_get_typename(OBJECT(dev))); } }
static int query_one_iothread(Object *object, void *opaque) { IOThreadInfoList ***prev = opaque; IOThreadInfoList *elem; IOThreadInfo *info; IOThread *iothread; iothread = (IOThread *)object_dynamic_cast(object, TYPE_IOTHREAD); if (!iothread) { return 0; } info = g_new0(IOThreadInfo, 1); info->id = iothread_get_id(iothread); info->thread_id = iothread->thread_id; info->poll_max_ns = iothread->poll_max_ns; info->poll_grow = iothread->poll_grow; info->poll_shrink = iothread->poll_shrink; elem = g_new0(IOThreadInfoList, 1); elem->value = info; elem->next = NULL; **prev = elem; *prev = &elem->next; return 0; }
static int i2c_bus_fdt_init(char *node_path, FDTMachineInfo *fdti, void *priv) { Object *parent; DeviceState *dev; char parent_node_path[DT_PATH_LENGTH]; char *node_name = qemu_devtree_get_node_name(fdti->fdt, node_path); DB_PRINT_NP(1, "\n"); /* FIXME: share this code with fdt_generic_util.c/fdt_init_qdev() */ if (qemu_devtree_getparent(fdti->fdt, parent_node_path, node_path)) { abort(); } while (!fdt_init_has_opaque(fdti, parent_node_path)) { fdt_init_yield(fdti); } parent = fdt_init_get_opaque(fdti, parent_node_path); dev = (DeviceState *)object_dynamic_cast(parent, TYPE_DEVICE); if (parent && dev) { while (!dev->realized) { fdt_init_yield(fdti); } DB_PRINT_NP(0, "parenting i2c bus to %s bus %s\n", parent_node_path, node_name); fdt_init_set_opaque(fdti, node_path, qdev_get_child_bus(dev, node_name)); } else { DB_PRINT_NP(0, "orphaning i2c bus\n"); } return 0; }
void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st, DeviceState *dev, Error **errp) { MemStatus *mdev; AcpiEventStatusBits event; bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM); mdev = acpi_memory_slot_status(mem_st, dev, errp); if (!mdev) { return; } mdev->dimm = dev; /* * do not set is_enabled and is_inserting if the slot is plugged with * a nvdimm device to stop OSPM inquires memory region from the slot. */ if (is_nvdimm) { event = ACPI_NVDIMM_HOTPLUG_STATUS; } else { mdev->is_enabled = true; event = ACPI_MEMORY_HOTPLUG_STATUS; } if (dev->hotplugged) { if (!is_nvdimm) { mdev->is_inserting = true; } acpi_send_event(DEVICE(hotplug_dev), event); } }
void ich9_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev); if (lpc->pm.acpi_memory_hotplug.is_enabled && object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { acpi_memory_unplug_cb(&lpc->pm.acpi_memory_hotplug, dev, errp); } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) && !lpc->pm.cpu_hotplug_legacy) { acpi_cpu_unplug_cb(&lpc->pm.cpuhp_state, dev, errp); } else { error_setg(errp, "acpi: device unplug for not supported device" " type: %s", object_get_typename(OBJECT(dev))); } }
static void s390_machine_device_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { s390_cpu_plug(hotplug_dev, dev, errp); } }
static void s390_ipl_reset(DeviceState *dev) { S390IPLState *ipl = S390_IPL(dev); S390CPU *cpu = S390_CPU(qemu_get_cpu(0)); CPUS390XState *env = &cpu->env; env->psw.addr = ipl->start_addr; env->psw.mask = IPL_PSW_MASK; if (!ipl->kernel) { /* Tell firmware, if there is a preferred boot device */ env->regs[7] = -1; DeviceState *dev_st = get_boot_device(0); if (dev_st) { VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast( OBJECT(qdev_get_parent_bus(dev_st)->parent), TYPE_VIRTIO_CCW_DEVICE); if (ccw_dev) { env->regs[7] = ccw_dev->sch->cssid << 24 | ccw_dev->sch->ssid << 16 | ccw_dev->sch->devno; } } } s390_add_running_cpu(cpu); }
static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp) { Object *obj; QCryptoTLSCreds *creds; obj = object_resolve_path_component( object_get_objects_root(), id); if (!obj) { error_setg(errp, "No TLS credentials with id '%s'", id); return NULL; } creds = (QCryptoTLSCreds *) object_dynamic_cast(obj, TYPE_QCRYPTO_TLS_CREDS); if (!creds) { error_setg(errp, "Object with id '%s' is not TLS credentials", id); return NULL; } if (creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) { error_setg(errp, "Expecting TLS credentials with a server endpoint"); return NULL; } object_ref(obj); return creds; }
static void qjson_finalizefn(Object *obj) { QJSON *json = (QJSON *)object_dynamic_cast(obj, TYPE_QJSON); assert(json); qobject_decref(QOBJECT(json->str)); }
/* * In addition to updating the iplstate, this function returns: * - 0 if system was ipled with external kernel * - -1 if no valid boot device was found * - ccw id of the boot device otherwise */ static uint64_t s390_update_iplstate(S390IPLState *ipl) { DeviceState *dev_st; if (ipl->iplb_valid) { ipl->cssid = 0; ipl->ssid = 0; ipl->devno = ipl->iplb.devno; goto out; } if (ipl->kernel) { return 0; } dev_st = get_boot_device(0); if (dev_st) { VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast( OBJECT(qdev_get_parent_bus(dev_st)->parent), TYPE_VIRTIO_CCW_DEVICE); if (ccw_dev) { ipl->cssid = ccw_dev->sch->cssid; ipl->ssid = ccw_dev->sch->ssid; ipl->devno = ccw_dev->sch->devno; goto out; } } return -1; out: return (uint32_t) (ipl->cssid << 24 | ipl->ssid << 16 | ipl->devno); }
static void pc_dimm_md_fill_device_info(const MemoryDeviceState *md, MemoryDeviceInfo *info) { PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1); const DeviceClass *dc = DEVICE_GET_CLASS(md); const PCDIMMDevice *dimm = PC_DIMM(md); const DeviceState *dev = DEVICE(md); if (dev->id) { di->has_id = true; di->id = g_strdup(dev->id); } di->hotplugged = dev->hotplugged; di->hotpluggable = dc->hotpluggable; di->addr = dimm->addr; di->slot = dimm->slot; di->node = dimm->node; di->size = object_property_get_uint(OBJECT(dimm), PC_DIMM_SIZE_PROP, NULL); di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem)); if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) { info->u.nvdimm.data = di; info->type = MEMORY_DEVICE_INFO_KIND_NVDIMM; } else { info->u.dimm.data = di; info->type = MEMORY_DEVICE_INFO_KIND_DIMM; } }
static QCryptoTLSCreds * migration_tls_get_creds(MigrationState *s, QCryptoTLSCredsEndpoint endpoint, Error **errp) { Object *creds; QCryptoTLSCreds *ret; creds = object_resolve_path_component( object_get_objects_root(), s->parameters.tls_creds); if (!creds) { error_setg(errp, "No TLS credentials with id '%s'", s->parameters.tls_creds); return NULL; } ret = (QCryptoTLSCreds *)object_dynamic_cast( creds, TYPE_QCRYPTO_TLS_CREDS); if (!ret) { error_setg(errp, "Object with id '%s' is not TLS credentials", s->parameters.tls_creds); return NULL; } if (ret->endpoint != endpoint) { error_setg(errp, "Expected TLS credentials for a %s endpoint", endpoint == QCRYPTO_TLS_CREDS_ENDPOINT_CLIENT ? "client" : "server"); return NULL; } object_ref(OBJECT(ret)); return ret; }
static int query_memdev(Object *obj, void *opaque) { MemdevList **list = opaque; MemdevList *m = NULL; Error *err = NULL; if (object_dynamic_cast(obj, TYPE_MEMORY_BACKEND)) { m = g_malloc0(sizeof(*m)); m->value = g_malloc0(sizeof(*m->value)); m->value->size = object_property_get_int(obj, "size", &err); if (err) { goto error; } m->value->merge = object_property_get_bool(obj, "merge", &err); if (err) { goto error; } m->value->dump = object_property_get_bool(obj, "dump", &err); if (err) { goto error; } m->value->prealloc = object_property_get_bool(obj, "prealloc", &err); if (err) { goto error; } m->value->policy = object_property_get_enum(obj, "policy", HostMemPolicy_lookup, &err); if (err) { goto error; } object_property_get_uint16List(obj, "host-nodes", &m->value->host_nodes, &err); if (err) { goto error; } m->next = *list; *list = m; } return 0; error: g_free(m->value); g_free(m); return -1; }
static HotplugHandler *s390_get_hotplug_handler(MachineState *machine, DeviceState *dev) { if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { return HOTPLUG_HANDLER(machine); } return NULL; }
static void qjson_initfn(Object *obj) { QJSON *json = (QJSON *)object_dynamic_cast(obj, TYPE_QJSON); assert(json); json->str = qstring_from_str("{ "); json->omit_comma = true; }
static int powernv_populate_isa_device(DeviceState *dev, void *opaque) { ForeachPopulateArgs *args = opaque; ISADevice *d = ISA_DEVICE(dev); if (object_dynamic_cast(OBJECT(dev), TYPE_MC146818_RTC)) { powernv_populate_rtc(d, args->fdt, args->offset); } else if (object_dynamic_cast(OBJECT(dev), TYPE_ISA_SERIAL)) { powernv_populate_serial(d, args->fdt, args->offset); } else if (object_dynamic_cast(OBJECT(dev), "isa-ipmi-bt")) { powernv_populate_ipmi_bt(d, args->fdt, args->offset); } else { error_report("unknown isa device %s@i%x", qdev_fw_name(dev), d->ioport_id); } return 0; }
static int spapr_irq_post_load_xics(sPAPRMachineState *spapr, int version_id) { if (!object_dynamic_cast(OBJECT(spapr->ics), TYPE_ICS_KVM)) { CPUState *cs; CPU_FOREACH(cs) { PowerPCCPU *cpu = POWERPC_CPU(cs); icp_resend(ICP(cpu->intc)); } }
static int spapr_phb_get_active_win_num_cb(Object *child, void *opaque) { sPAPRTCETable *tcet; tcet = (sPAPRTCETable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE); if (tcet && tcet->nb_table) { ++*(unsigned *)opaque; } return 0; }
static int iothread_stop_iter(Object *object, void *opaque) { IOThread *iothread; iothread = (IOThread *)object_dynamic_cast(object, TYPE_IOTHREAD); if (!iothread) { return 0; } iothread_stop(iothread); return 0; }
static int nvdimm_device_list(Object *obj, void *opaque) { GSList **list = opaque; if (object_dynamic_cast(obj, TYPE_NVDIMM)) { *list = g_slist_append(*list, DEVICE(obj)); } object_child_foreach(obj, nvdimm_device_list, opaque); return 0; }
static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) { sPAPRTCETable *tcet; tcet = (sPAPRTCETable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE); if (tcet && !tcet->nb_table) { *(uint32_t *)opaque = tcet->liobn; return 1; } return 0; }
int qcrypto_tls_session_check_credentials(QCryptoTLSSession *session, Error **errp) { if (object_dynamic_cast(OBJECT(session->creds), TYPE_QCRYPTO_TLS_CREDS_ANON)) { return 0; } else if (object_dynamic_cast(OBJECT(session->creds), TYPE_QCRYPTO_TLS_CREDS_X509)) { if (session->creds->verifyPeer) { return qcrypto_tls_session_check_certificate(session, errp); } else { return 0; } } else { error_setg(errp, "Unexpected credential type %s", object_get_typename(OBJECT(session->creds))); return -1; } }
static void ahci_irq_lower(AHCIState *s, AHCIDevice *dev) { DeviceState *dev_state = s->container; PCIDevice *pci_dev = (PCIDevice *) object_dynamic_cast(OBJECT(dev_state), TYPE_PCI_DEVICE); DPRINTF(0, "lower irq\n"); if (!pci_dev || !msi_enabled(pci_dev)) { qemu_irq_lower(s->irq); } }
char *fw_path_provider_try_get_dev_path(Object *o, BusState *bus, DeviceState *dev) { FWPathProvider *p = (FWPathProvider *) object_dynamic_cast(o, TYPE_FW_PATH_PROVIDER); if (p) { return fw_path_provider_get_dev_path(p, bus, dev); } return NULL; }
static int iothread_stop(Object *object, void *opaque) { IOThread *iothread; iothread = (IOThread *)object_dynamic_cast(object, TYPE_IOTHREAD); if (!iothread || !iothread->ctx) { return 0; } iothread->stopping = true; aio_notify(iothread->ctx); qemu_thread_join(&iothread->thread); return 0; }