1 /* 2 * cpu.h: internal functions for CPU manipulation 3 * 4 * Copyright (C) 2009-2010, 2013 Red Hat, Inc. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library. If not, see 18 * <http://www.gnu.org/licenses/>. 19 */ 20 21 #pragma once 22 23 #include "virerror.h" 24 #include "datatypes.h" 25 #include "virarch.h" 26 #include "domain_capabilities.h" 27 #include "cpu_conf.h" 28 #include "cpu_x86_data.h" 29 #include "cpu_ppc64_data.h" 30 #include "cpu_arm_data.h" 31 32 33 typedef struct _virCPUData virCPUData; 34 struct _virCPUData { 35 virArch arch; 36 union { 37 virCPUx86Data x86; 38 virCPUppc64Data ppc64; 39 virCPUarmData arm; 40 /* generic driver needs no data */ 41 } data; 42 }; 43 44 45 typedef virCPUCompareResult 46 (*virCPUArchCompare)(virCPUDef *host, 47 virCPUDef *cpu, 48 bool failIncompatible); 49 50 typedef int 51 (*cpuArchDecode) (virCPUDef *cpu, 52 const virCPUData *data, 53 virDomainCapsCPUModels *models); 54 55 typedef int 56 (*cpuArchEncode) (virArch arch, 57 const virCPUDef *cpu, 58 virCPUData **forced, 59 virCPUData **required, 60 virCPUData **optional, 61 virCPUData **disabled, 62 virCPUData **forbidden, 63 virCPUData **vendor); 64 65 typedef virCPUData * 66 (*cpuArchDataCopyNew)(virCPUData *data); 67 68 typedef void 69 (*cpuArchDataFree) (virCPUData *data); 70 71 typedef int 72 (*virCPUArchGetHost)(virCPUDef *cpu, 73 virDomainCapsCPUModels *models); 74 75 typedef virCPUDef * 76 (*virCPUArchBaseline)(virCPUDef **cpus, 77 unsigned int ncpus, 78 virDomainCapsCPUModels *models, 79 const char **features, 80 bool migratable); 81 82 typedef int 83 (*virCPUArchUpdate)(virCPUDef *guest, 84 const virCPUDef *host, 85 bool relative); 86 87 typedef int 88 (*virCPUArchUpdateLive)(virCPUDef *cpu, 89 virCPUData *dataEnabled, 90 virCPUData *dataDisabled); 91 92 typedef int 93 (*virCPUArchCheckFeature)(const virCPUDef *cpu, 94 const char *feature); 95 96 typedef int 97 (*virCPUArchDataCheckFeature)(const virCPUData *data, 98 const char *feature); 99 100 typedef char * 101 (*virCPUArchDataFormat)(const virCPUData *data); 102 103 typedef virCPUData * 104 (*virCPUArchDataParse)(xmlNodePtr node); 105 106 typedef int 107 (*virCPUArchGetModels)(char ***models); 108 109 typedef int 110 (*virCPUArchTranslate)(virCPUDef *cpu, 111 virDomainCapsCPUModels *models); 112 113 typedef int 114 (*virCPUArchConvertLegacy)(virCPUDef *cpu); 115 116 typedef int 117 (*virCPUArchExpandFeatures)(virCPUDef *cpu); 118 119 typedef virCPUDef * 120 (*virCPUArchCopyMigratable)(virCPUDef *cpu); 121 122 typedef int 123 (*virCPUArchValidateFeatures)(virCPUDef *cpu); 124 125 typedef int 126 (*virCPUArchDataAddFeature)(virCPUData *cpuData, 127 const char *name); 128 129 typedef virCPUCompareResult 130 (*virCPUArchDataIsIdentical)(const virCPUData *a, 131 const virCPUData *b); 132 133 typedef virCPUData * 134 (*virCPUArchDataGetHost)(void); 135 136 struct cpuArchDriver { 137 const char *name; 138 const virArch *arch; 139 unsigned int narch; 140 virCPUArchCompare compare; 141 cpuArchDecode decode; 142 cpuArchEncode encode; 143 cpuArchDataCopyNew dataCopyNew; 144 cpuArchDataFree dataFree; 145 virCPUArchGetHost getHost; 146 virCPUArchBaseline baseline; 147 virCPUArchUpdate update; 148 virCPUArchUpdateLive updateLive; 149 virCPUArchCheckFeature checkFeature; 150 virCPUArchDataCheckFeature dataCheckFeature; 151 virCPUArchDataFormat dataFormat; 152 virCPUArchDataParse dataParse; 153 virCPUArchGetModels getModels; 154 virCPUArchTranslate translate; 155 virCPUArchConvertLegacy convertLegacy; 156 virCPUArchExpandFeatures expandFeatures; 157 virCPUArchCopyMigratable copyMigratable; 158 virCPUArchValidateFeatures validateFeatures; 159 virCPUArchDataAddFeature dataAddFeature; 160 virCPUArchDataIsIdentical dataIsIdentical; 161 virCPUArchDataGetHost dataGetHost; 162 }; 163 164 165 virCPUCompareResult 166 virCPUCompareXML(virArch arch, 167 virCPUDef *host, 168 const char *xml, 169 bool failIncompatible, 170 bool validateXML); 171 172 virCPUCompareResult 173 virCPUCompare(virArch arch, 174 virCPUDef *host, 175 virCPUDef *cpu, 176 bool failIncompatible) 177 ATTRIBUTE_NONNULL(3); 178 179 int 180 cpuDecode (virCPUDef *cpu, 181 const virCPUData *data, 182 virDomainCapsCPUModels *models) 183 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); 184 185 int 186 cpuEncode (virArch arch, 187 const virCPUDef *cpu, 188 virCPUData **forced, 189 virCPUData **required, 190 virCPUData **optional, 191 virCPUData **disabled, 192 virCPUData **forbidden, 193 virCPUData **vendor) 194 ATTRIBUTE_NONNULL(2); 195 196 virCPUData * 197 virCPUDataNew(virArch arch); 198 199 virCPUData * 200 virCPUDataNewCopy(virCPUData *data); 201 202 void 203 virCPUDataFree(virCPUData *data); 204 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCPUData, virCPUDataFree); 205 206 bool 207 virCPUGetHostIsSupported(virArch arch); 208 209 virCPUDef * 210 virCPUGetHost(virArch arch, 211 virCPUType type, 212 virNodeInfoPtr nodeInfo, 213 virDomainCapsCPUModels *models); 214 215 virCPUDef * 216 virCPUProbeHost(virArch arch) G_GNUC_NO_INLINE; 217 218 virCPUDef * 219 virCPUBaseline(virArch arch, 220 virCPUDef **cpus, 221 unsigned int ncpus, 222 virDomainCapsCPUModels *models, 223 const char **features, 224 bool migratable); 225 226 int 227 virCPUUpdate(virArch arch, 228 virCPUDef *guest, 229 const virCPUDef *host) 230 ATTRIBUTE_NONNULL(2); 231 232 int 233 virCPUUpdateLive(virArch arch, 234 virCPUDef *cpu, 235 virCPUData *dataEnabled, 236 virCPUData *dataDisabled) 237 ATTRIBUTE_NONNULL(2); 238 239 int 240 virCPUCheckFeature(virArch arch, 241 const virCPUDef *cpu, 242 const char *feature) 243 ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); 244 245 246 int 247 virCPUCheckForbiddenFeatures(virCPUDef *guest, 248 const virCPUDef *host) 249 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); 250 251 252 int 253 virCPUDataCheckFeature(const virCPUData *data, 254 const char *feature) 255 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); 256 257 258 bool 259 virCPUModelIsAllowed(const char *model, 260 virDomainCapsCPUModels *models) 261 ATTRIBUTE_NONNULL(1); 262 263 int 264 virCPUGetModels(virArch arch, char ***models); 265 266 int 267 virCPUTranslate(virArch arch, 268 virCPUDef *cpu, 269 virDomainCapsCPUModels *models) 270 ATTRIBUTE_NONNULL(2); 271 272 int 273 virCPUConvertLegacy(virArch arch, 274 virCPUDef *cpu) 275 ATTRIBUTE_NONNULL(2); 276 277 int 278 virCPUExpandFeatures(virArch arch, 279 virCPUDef *cpu); 280 281 virCPUDef * 282 virCPUCopyMigratable(virArch arch, 283 virCPUDef *cpu); 284 285 int 286 virCPUValidateFeatures(virArch arch, 287 virCPUDef *cpu) 288 ATTRIBUTE_NONNULL(2); 289 290 int 291 virCPUDataAddFeature(virCPUData *cpuData, 292 const char *name); 293 294 virCPUCompareResult 295 virCPUDataIsIdentical(const virCPUData *a, 296 const virCPUData *b); 297 298 virCPUData* 299 virCPUDataGetHost(void); 300 301 bool 302 virCPUArchIsSupported(virArch arch); 303 304 /* virCPUDataFormat and virCPUDataParse are implemented for unit tests only and 305 * have no real-life usage 306 */ 307 char *virCPUDataFormat(const virCPUData *data) 308 ATTRIBUTE_NONNULL(1); 309 virCPUData *virCPUDataParse(const char *xmlStr) 310 ATTRIBUTE_NONNULL(1); 311 virCPUData *virCPUDataParseNode(xmlNodePtr node) 312 ATTRIBUTE_NONNULL(1); 313