cpu.h 5.8 KB
Newer Older
J
Jiri Denemark 已提交
1 2 3
/*
 * cpu.h: internal functions for CPU manipulation
 *
4
 * Copyright (C) 2009-2010, 2013 Red Hat, Inc.
J
Jiri Denemark 已提交
5 6 7 8 9 10 11 12 13 14 15 16
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library.  If not, see
O
Osier Yang 已提交
18
 * <http://www.gnu.org/licenses/>.
J
Jiri Denemark 已提交
19 20 21 22 23 24
 *
 * Authors:
 *      Jiri Denemark <jdenemar@redhat.com>
 */

#ifndef __VIR_CPU_H__
25
# define __VIR_CPU_H__
J
Jiri Denemark 已提交
26

27
# include "virerror.h"
28
# include "datatypes.h"
29
# include "virarch.h"
30 31
# include "conf/cpu_conf.h"
# include "cpu_x86_data.h"
32
# include "cpu_ppc64_data.h"
J
Jiri Denemark 已提交
33 34


J
Jiri Denemark 已提交
35
typedef struct _virCPUData virCPUData;
36
typedef virCPUData *virCPUDataPtr;
J
Jiri Denemark 已提交
37 38 39
struct _virCPUData {
    virArch arch;
    union {
40
        virCPUx86Data *x86;
41
        virCPUppc64Data *ppc64;
J
Jiri Denemark 已提交
42 43
        /* generic driver needs no data */
    } data;
J
Jiri Denemark 已提交
44 45 46 47 48
};


typedef virCPUCompareResult
(*cpuArchCompare)   (virCPUDefPtr host,
49 50
                     virCPUDefPtr cpu,
                     bool failIncompatible);
J
Jiri Denemark 已提交
51 52 53

typedef int
(*cpuArchDecode)    (virCPUDefPtr cpu,
54
                     const virCPUData *data,
55
                     const char **models,
56
                     unsigned int nmodels,
57 58
                     const char *preferred,
                     unsigned int flags);
J
Jiri Denemark 已提交
59 60

typedef int
J
Jiri Denemark 已提交
61
(*cpuArchEncode)    (virArch arch,
62
                     const virCPUDef *cpu,
63 64 65 66 67 68
                     virCPUDataPtr *forced,
                     virCPUDataPtr *required,
                     virCPUDataPtr *optional,
                     virCPUDataPtr *disabled,
                     virCPUDataPtr *forbidden,
                     virCPUDataPtr *vendor);
J
Jiri Denemark 已提交
69 70

typedef void
71
(*cpuArchDataFree)  (virCPUDataPtr data);
J
Jiri Denemark 已提交
72

73
typedef virCPUDataPtr
74
(*cpuArchNodeData)  (virArch arch);
J
Jiri Denemark 已提交
75 76 77 78

typedef virCPUCompareResult
(*cpuArchGuestData) (virCPUDefPtr host,
                     virCPUDefPtr guest,
79
                     virCPUDataPtr *data,
80
                     char **message);
J
Jiri Denemark 已提交
81

82 83 84 85
typedef virCPUDefPtr
(*cpuArchBaseline)  (virCPUDefPtr *cpus,
                     unsigned int ncpus,
                     const char **models,
86 87
                     unsigned int nmodels,
                     unsigned int flags);
88

89 90
typedef int
(*cpuArchUpdate)    (virCPUDefPtr guest,
91
                     const virCPUDef *host);
92

D
Daniel P. Berrange 已提交
93
typedef int
94
(*cpuArchHasFeature) (const virCPUData *data,
D
Daniel P. Berrange 已提交
95 96
                      const char *feature);

97 98 99 100 101
typedef char *
(*cpuArchDataFormat)(const virCPUData *data);

typedef virCPUDataPtr
(*cpuArchDataParse) (const char *xmlStr);
J
Jiri Denemark 已提交
102

103 104 105
typedef int
(*cpuArchGetModels) (char ***models);

J
Jiri Denemark 已提交
106 107
struct cpuArchDriver {
    const char *name;
108
    const virArch *arch;
J
Jiri Denemark 已提交
109 110 111 112 113 114 115
    unsigned int narch;
    cpuArchCompare      compare;
    cpuArchDecode       decode;
    cpuArchEncode       encode;
    cpuArchDataFree     free;
    cpuArchNodeData     nodeData;
    cpuArchGuestData    guestData;
116
    cpuArchBaseline     baseline;
117
    cpuArchUpdate       update;
D
Daniel P. Berrange 已提交
118
    cpuArchHasFeature    hasFeature;
119 120
    cpuArchDataFormat   dataFormat;
    cpuArchDataParse    dataParse;
121
    cpuArchGetModels    getModels;
J
Jiri Denemark 已提交
122 123 124 125
};


extern virCPUCompareResult
126
cpuCompareXML(virCPUDefPtr host,
127 128
              const char *xml,
              bool failIncompatible)
129
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
J
Jiri Denemark 已提交
130 131

extern virCPUCompareResult
132
cpuCompare  (virCPUDefPtr host,
133 134
             virCPUDefPtr cpu,
             bool failIncompatible)
135
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
J
Jiri Denemark 已提交
136 137

extern int
138
cpuDecode   (virCPUDefPtr cpu,
139
             const virCPUData *data,
140
             const char **models,
141
             unsigned int nmodels,
142 143
             const char *preferred)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
J
Jiri Denemark 已提交
144 145

extern int
146
cpuEncode   (virArch arch,
147
             const virCPUDef *cpu,
148 149 150 151 152
             virCPUDataPtr *forced,
             virCPUDataPtr *required,
             virCPUDataPtr *optional,
             virCPUDataPtr *disabled,
             virCPUDataPtr *forbidden,
153 154
             virCPUDataPtr *vendor)
    ATTRIBUTE_NONNULL(2);
J
Jiri Denemark 已提交
155 156

extern void
J
Jiri Denemark 已提交
157
cpuDataFree (virCPUDataPtr data);
J
Jiri Denemark 已提交
158

159
extern virCPUDataPtr
160
cpuNodeData (virArch arch);
J
Jiri Denemark 已提交
161 162

extern virCPUCompareResult
163
cpuGuestData(virCPUDefPtr host,
J
Jiri Denemark 已提交
164
             virCPUDefPtr guest,
165
             virCPUDataPtr *data,
166 167
             char **msg)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
J
Jiri Denemark 已提交
168

169 170 171 172
extern char *
cpuBaselineXML(const char **xmlCPUs,
               unsigned int ncpus,
               const char **models,
173 174
               unsigned int nmodels,
               unsigned int flags);
175 176 177 178 179

extern virCPUDefPtr
cpuBaseline (virCPUDefPtr *cpus,
             unsigned int ncpus,
             const char **models,
180
             unsigned int nmodels,
181 182
             unsigned int flags)
    ATTRIBUTE_NONNULL(1);
183

184 185
extern int
cpuUpdate   (virCPUDefPtr guest,
186 187
             const virCPUDef *host)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
188

D
Daniel P. Berrange 已提交
189
extern int
190
cpuHasFeature(const virCPUData *data,
191 192
              const char *feature)
    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
D
Daniel P. Berrange 已提交
193 194


195 196 197
bool
cpuModelIsAllowed(const char *model,
                  const char **models,
198 199
                  unsigned int nmodels)
    ATTRIBUTE_NONNULL(1);
200

201
extern int
202 203
cpuGetModels(const char *arch, char ***models)
    ATTRIBUTE_NONNULL(1);
204

205 206 207
/* cpuDataFormat and cpuDataParse are implemented for unit tests only and
 * have no real-life usage
 */
208 209
char *cpuDataFormat(const virCPUData *data)
    ATTRIBUTE_NONNULL(1);
210
virCPUDataPtr cpuDataParse(virArch arch,
211 212
                           const char *xmlStr)
    ATTRIBUTE_NONNULL(2);
213

J
Jiri Denemark 已提交
214
#endif /* __VIR_CPU_H__ */