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