int virCPUDefFormatBuf(virBufferPtr buf, virCPUDefPtr def, unsigned int flags) { unsigned int i; bool formatModel; bool formatFallback; if (!def) return 0; formatModel = (def->mode == VIR_CPU_MODE_CUSTOM || (flags & VIR_DOMAIN_XML_UPDATE_CPU)); formatFallback = (def->type == VIR_CPU_TYPE_GUEST && (def->mode == VIR_CPU_MODE_HOST_MODEL || (def->mode == VIR_CPU_MODE_CUSTOM && def->model))); if (!def->model && def->nfeatures) { virCPUReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Non-empty feature list specified without CPU model")); return -1; } if ((formatModel && def->model) || formatFallback) { virBufferAddLit(buf, "<model"); if (formatFallback) { const char *fallback; fallback = virCPUFallbackTypeToString(def->fallback); if (!fallback) { virCPUReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU fallback value: %d"), def->fallback); return -1; } virBufferAsprintf(buf, " fallback='%s'", fallback); } if (formatModel && def->model) { virBufferAsprintf(buf, ">%s</model>\n", def->model); } else { virBufferAddLit(buf, "/>\n"); } } if (formatModel && def->vendor) virBufferAsprintf(buf, "<vendor>%s</vendor>\n", def->vendor); if (def->sockets && def->cores && def->threads) { virBufferAddLit(buf, "<topology"); virBufferAsprintf(buf, " sockets='%u'", def->sockets); virBufferAsprintf(buf, " cores='%u'", def->cores); virBufferAsprintf(buf, " threads='%u'", def->threads); virBufferAddLit(buf, "/>\n"); } if (formatModel) { for (i = 0 ; i < def->nfeatures ; i++) { virCPUFeatureDefPtr feature = def->features + i; if (!feature->name) { virCPUReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU feature name")); return -1; } if (def->type == VIR_CPU_TYPE_GUEST) { const char *policy; policy = virCPUFeaturePolicyTypeToString(feature->policy); if (!policy) { virCPUReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU feature policy %d"), feature->policy); return -1; } virBufferAsprintf(buf, "<feature policy='%s' name='%s'/>\n", policy, feature->name); } else { virBufferAsprintf(buf, "<feature name='%s'/>\n", feature->name); } } } if (def->ncells) { virBufferAddLit(buf, "<numa>\n"); for (i = 0; i < def->ncells; i++) { virBufferAddLit(buf, " <cell"); virBufferAsprintf(buf, " cpus='%s'", def->cells[i].cpustr); virBufferAsprintf(buf, " memory='%d'", def->cells[i].mem); virBufferAddLit(buf, "/>\n"); } virBufferAddLit(buf, "</numa>\n"); } return 0; }
int virCPUDefFormatBuf(virBufferPtr buf, virCPUDefPtr def) { size_t i; bool formatModel; bool formatFallback; if (!def) return 0; formatModel = (def->mode == VIR_CPU_MODE_CUSTOM || def->mode == VIR_CPU_MODE_HOST_MODEL); formatFallback = (def->type == VIR_CPU_TYPE_GUEST && (def->mode == VIR_CPU_MODE_HOST_MODEL || (def->mode == VIR_CPU_MODE_CUSTOM && def->model))); if (!def->model && def->mode == VIR_CPU_MODE_CUSTOM && def->nfeatures) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Non-empty feature list specified without CPU model")); return -1; } if ((formatModel && def->model) || formatFallback) { virBufferAddLit(buf, "<model"); if (formatFallback) { const char *fallback; fallback = virCPUFallbackTypeToString(def->fallback); if (!fallback) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU fallback value: %d"), def->fallback); return -1; } virBufferAsprintf(buf, " fallback='%s'", fallback); if (def->vendor_id) virBufferEscapeString(buf, " vendor_id='%s'", def->vendor_id); } if (formatModel && def->model) { virBufferEscapeString(buf, ">%s</model>\n", def->model); } else { virBufferAddLit(buf, "/>\n"); } } if (formatModel && def->vendor) virBufferEscapeString(buf, "<vendor>%s</vendor>\n", def->vendor); if (def->type == VIR_CPU_TYPE_HOST && def->microcodeVersion) virBufferAsprintf(buf, "<microcode version='%u'/>\n", def->microcodeVersion); if (def->sockets && def->cores && def->threads) { virBufferAddLit(buf, "<topology"); virBufferAsprintf(buf, " sockets='%u'", def->sockets); virBufferAsprintf(buf, " cores='%u'", def->cores); virBufferAsprintf(buf, " threads='%u'", def->threads); virBufferAddLit(buf, "/>\n"); } if (def->cache) { virBufferAddLit(buf, "<cache "); if (def->cache->level != -1) virBufferAsprintf(buf, "level='%d' ", def->cache->level); virBufferAsprintf(buf, "mode='%s'", virCPUCacheModeTypeToString(def->cache->mode)); virBufferAddLit(buf, "/>\n"); } for (i = 0; i < def->nfeatures; i++) { virCPUFeatureDefPtr feature = def->features + i; if (!feature->name) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU feature name")); return -1; } if (def->type == VIR_CPU_TYPE_GUEST) { const char *policy; policy = virCPUFeaturePolicyTypeToString(feature->policy); if (!policy) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected CPU feature policy %d"), feature->policy); return -1; } virBufferAsprintf(buf, "<feature policy='%s' name='%s'/>\n", policy, feature->name); } else { virBufferAsprintf(buf, "<feature name='%s'/>\n", feature->name); } } return 0; }