1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
#ifndef LSCPU_API_H
#define LSCPU_API_H
#include "c.h"
#include "nls.h"
#include "cpuset.h"
#include "xalloc.h"
#include "strutils.h"
#include "bitops.h"
#include "path.h"
#include "pathnames.h"
#include "all-io.h"
#include "debug.h"
#define LSCPU_DEBUG_INIT (1 << 1)
#define LSCPU_DEBUG_MISC (1 << 2)
#define LSCPU_DEBUG_GATHER (1 << 3)
#define LSCPU_DEBUG_TYPE (1 << 4)
#define LSCPU_DEBUG_CPU (1 << 5)
#define LSCPU_DEBUG_VIRT (1 << 6)
#define LSBLK_DEBUG_ALL 0xFFFF
UL_DEBUG_DECLARE_MASK(lscpu);
#define DBG(m, x) __UL_DBG(lscpu, LSCPU_DEBUG_, m, x)
#define ON_DBG(m, x) __UL_DBG_CALL(lscpu, LSCPU_DEBUG_, m, x)
#define UL_DEBUG_CURRENT_MASK UL_DEBUG_MASK(lscpu)
#include "debugobj.h"
#define _PATH_SYS_SYSTEM "/sys/devices/system"
#define _PATH_SYS_HYP_FEATURES "/sys/hypervisor/properties/features"
#define _PATH_SYS_CPU _PATH_SYS_SYSTEM "/cpu"
#define _PATH_SYS_NODE _PATH_SYS_SYSTEM "/node"
struct lscpu_cputype {
int refcount;
char *vendor;
char *machinetype; /* s390 */
char *family;
char *model;
char *modelname;
char *revision; /* alternative for model (ppc) */
char *stepping;
char *bogomips;
char *flags;
char *mtid; /* maximum thread id (s390) */
char *addrsz; /* address sizes */
int dispatching; /* none, horizontal or vertical */
int freqboost; /* -1 if not evailable */
int *polarization; /* cpu polarization */
int *addresses; /* physical cpu addresses */
int *configured; /* cpu configured */
int physsockets; /* Physical sockets (modules) */
int physchips; /* Physical chips */
int physcoresperchip; /* Physical cores per chip */
int ncores;
int nbooks;
int threads;
int ndrawers;
};
struct lscpu_cpu {
int refcount;
struct lscpu_cputype *type;
int logical_id;
char *mhz;
char *dynamic_mhz;
char *static_mhz;
};
struct lscpu_arch {
char *name; /* uname() .machine */
unsigned int bit32:1,
bit64:1;
};
struct lscpu_vulnerability {
char *name;
char *text;
};
/* virtualization types */
enum {
VIRT_TYPE_NONE = 0,
VIRT_TYPE_PARA,
VIRT_TYPE_FULL,
VIRT_TYPE_CONTAINER
};
/* hypervisor vendors */
enum {
VIRT_VENDOR_NONE = 0,
VIRT_VENDOR_XEN,
VIRT_VENDOR_KVM,
VIRT_VENDOR_MSHV,
VIRT_VENDOR_VMWARE,
VIRT_VENDOR_IBM, /* sys-z powervm */
VIRT_VENDOR_VSERVER,
VIRT_VENDOR_UML,
VIRT_VENDOR_INNOTEK, /* VBOX */
VIRT_VENDOR_HITACHI,
VIRT_VENDOR_PARALLELS, /* OpenVZ/VIrtuozzo */
VIRT_VENDOR_VBOX,
VIRT_VENDOR_OS400,
VIRT_VENDOR_PHYP,
VIRT_VENDOR_SPAR,
VIRT_VENDOR_WSL,
};
struct lscpu_virt {
char *cpuflag; /* virtualization flag (vmx, svm) */
char *hypervisor; /* hypervisor software */
int vendor; /* VIRT_VENDOR_* */
int type; /* VIRT_TYPE_* ? */
};
struct lscpu_cxt {
int maxcpus; /* size in bits of kernel cpu mask */
const char *prefix; /* path to /sys and /proc snapshot or NULL */
struct path_cxt *syscpu; /* _PATH_SYS_CPU path handler */
struct path_cxt *procfs; /* /proc path handler */
size_t ncputypes;
struct lscpu_cputype **cputypes;
size_t ncpus;
struct lscpu_cpu **cpus;
/*
* All maps are sequentially indexed (0..ncpuspos), the array index
* does not have match with cpuX number as presented by kernel. You
* have to use real_cpu_num() to get the real cpuX number.
*
* For example, the possible system CPUs are: 1,3,5, it means that
* ncpuspos=3, so all arrays are in range 0..3.
*/
size_t ncpuspos; /* maximal possible CPUs */
int *idx2cpunum; /* mapping index to CPU num */
size_t npresents;
cpu_set_t *present; /* mask with present CPUs */
size_t nonlines; /* aka number of trhreads */
cpu_set_t *online; /* mask with online CPUs */
struct lscpu_arch *arch;
struct lscpu_virt *virt;
struct lscpu_vulnerability *vuls; /* array of CPU vulnerabilities */
size_t nvuls; /* number of CPU vulnerabilities */
size_t nnodes; /* number of NUMA modes */
int *idx2nodenum; /* Support for discontinuous nodes */
cpu_set_t **nodemaps; /* array with NUMA nodes */
unsigned int noalive : 1;
};
struct lscpu_cputype *lscpu_new_cputype(void);
void lscpu_ref_cputype(struct lscpu_cputype *ct);
void lscpu_unref_cputype(struct lscpu_cputype *ct);
struct lscpu_cputype *lscpu_add_cputype(struct lscpu_cxt *cxt, struct lscpu_cputype *ct);
struct lscpu_cputype *lscpu_cputype_get_default(struct lscpu_cxt *cxt);
int lscpu_read_cpuinfo(struct lscpu_cxt *cxt);
int lscpu_read_cpulists(struct lscpu_cxt *cxt);
int lscpu_read_extra(struct lscpu_cxt *cxt);
int lscpu_read_vulnerabilities(struct lscpu_cxt *cxt);
int lscpu_read_numas(struct lscpu_cxt *cxt);
struct lscpu_arch *lscpu_read_architecture(struct lscpu_cxt *cxt);
void lscpu_free_architecture(struct lscpu_arch *ar);
struct lscpu_virt *lscpu_read_virtualization(struct lscpu_cxt *cxt);
void lscpu_free_virtualization(struct lscpu_virt *virt);
struct lscpu_cpu *lscpu_new_cpu(void);
void lscpu_ref_cpu(struct lscpu_cpu *cpu);
void lscpu_unref_cpu(struct lscpu_cpu *cpu);
int lscpu_add_cpu(struct lscpu_cxt *cxt,
struct lscpu_cpu *cpu,
struct lscpu_cputype *ct);
int lscpu_cpus_apply_type(struct lscpu_cxt *cxt, struct lscpu_cputype *type);
struct lscpu_cxt *lscpu_new_context(void);
void lscpu_free_context(struct lscpu_cxt *cxt);
int lookup(char *line, char *pattern, char **value);
#endif /* LSCPU_API_H */
|