2020-03-17 07:12:12 -05:00
|
|
|
|
|
|
|
#include "c.h"
|
|
|
|
#include "nls.h"
|
|
|
|
#include "cpuset.h"
|
|
|
|
#include "xalloc.h"
|
|
|
|
#include "pathnames.h"
|
|
|
|
#include "path.h"
|
|
|
|
#include "strutils.h"
|
2020-03-17 07:30:05 -05:00
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
UL_DEBUG_DEFINE_MASK(lscpu);
|
|
|
|
UL_DEBUG_DEFINE_MASKNAMES(lscpu) = UL_DEBUG_EMPTY_MASKNAMES;
|
|
|
|
|
|
|
|
/*** TODO: move to lscpu.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 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"
|
2020-03-17 07:12:12 -05:00
|
|
|
|
|
|
|
#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 {
|
|
|
|
cpu_set_t *map; /* which cpus use this type */
|
|
|
|
|
|
|
|
int refcount;
|
|
|
|
|
|
|
|
char *arch;
|
|
|
|
char *vendor;
|
|
|
|
char *machinetype; /* s390 */
|
|
|
|
char *family;
|
|
|
|
char *model;
|
|
|
|
char *modelname;
|
|
|
|
char *revision; /* alternative for model (ppc) */
|
|
|
|
char *cpu; /* alternative for modelname (ppc, sparc) */
|
|
|
|
char *virtflag; /* virtualization flag (vmx, svm) */
|
|
|
|
char *hypervisor; /* hypervisor software */
|
|
|
|
int hyper; /* hypervisor vendor ID */
|
|
|
|
int virtype; /* VIRT_PARA|FULL|NONE ? */
|
|
|
|
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;
|
|
|
|
|
|
|
|
unsigned int bit32:1,
|
|
|
|
bit64:1;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct lscpu_cxt {
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2020-03-17 07:30:05 -05:00
|
|
|
/*** endof-TODO ***/
|
|
|
|
|
|
|
|
static void lscpu_init_debug(void)
|
|
|
|
{
|
|
|
|
__UL_INIT_DEBUG_FROM_ENV(lscpu, LSCPU_DEBUG_, 0, LSCPU_DEBUG);
|
|
|
|
}
|
2020-03-17 07:12:12 -05:00
|
|
|
|
|
|
|
static void context_init_paths(struct lscpu_cxt *cxt)
|
|
|
|
{
|
2020-03-17 07:30:05 -05:00
|
|
|
DBG(MISC, ul_debugobj(cxt, "initialize paths"));
|
2020-03-17 07:12:12 -05:00
|
|
|
ul_path_init_debug();
|
|
|
|
|
|
|
|
/* /sys/devices/system/cpu */
|
|
|
|
cxt->syscpu = ul_new_path(_PATH_SYS_CPU);
|
|
|
|
if (!cxt->syscpu)
|
|
|
|
err(EXIT_FAILURE, _("failed to initialize CPUs sysfs handler"));
|
|
|
|
if (cxt->prefix)
|
|
|
|
ul_path_set_prefix(cxt->syscpu, cxt->prefix);
|
|
|
|
|
|
|
|
/* /proc */
|
|
|
|
cxt->procfs = ul_new_path("/proc");
|
|
|
|
if (!cxt->procfs)
|
|
|
|
err(EXIT_FAILURE, _("failed to initialize procfs handler"));
|
|
|
|
if (cxt->prefix)
|
|
|
|
ul_path_set_prefix(cxt->procfs, cxt->prefix);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void free_context(struct lscpu_cxt *cxt)
|
|
|
|
{
|
|
|
|
if (!cxt)
|
|
|
|
return;
|
|
|
|
|
2020-03-17 07:30:05 -05:00
|
|
|
DBG(MISC, ul_debugobj(cxt, "de-initialize paths"));
|
2020-03-17 07:12:12 -05:00
|
|
|
ul_unref_path(cxt->syscpu);
|
|
|
|
ul_unref_path(cxt->procfs);
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct lscpu_cputype *lscpu_new_cputype(void)
|
|
|
|
{
|
|
|
|
struct lscpu_cputype *ct;
|
|
|
|
|
|
|
|
ct = xcalloc(1, sizeof(struct lscpu_cputype));
|
|
|
|
ct->refcount = 1;
|
|
|
|
|
2020-03-17 07:30:05 -05:00
|
|
|
DBG(TYPE, ul_debugobj(ct, "alloc"));
|
2020-03-17 07:12:12 -05:00
|
|
|
return ct;
|
|
|
|
}
|
|
|
|
|
|
|
|
int lscpu_read_cputypes(struct lscpu_cxt *cxt)
|
|
|
|
{
|
2020-03-17 07:30:05 -05:00
|
|
|
DBG(GATHER, ul_debugobj(cxt, "reading types"));
|
2020-03-17 07:12:12 -05:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef TEST_PROGRAM_CPUTYPE
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
struct lscpu_cxt _cxt = { .prefix = NULL },
|
|
|
|
*cxt = &_cxt;
|
|
|
|
|
|
|
|
if (argc == 3 && strcmp(argv[1], "--prefix") == 0)
|
|
|
|
cxt->prefix = argv[2];
|
|
|
|
|
2020-03-17 07:30:05 -05:00
|
|
|
lscpu_init_debug();
|
2020-03-17 07:12:12 -05:00
|
|
|
context_init_paths(cxt);
|
|
|
|
|
2020-03-17 07:30:05 -05:00
|
|
|
lscpu_read_cputypes(cxt);
|
|
|
|
|
2020-03-17 07:12:12 -05:00
|
|
|
free_context(cxt);
|
|
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
#endif /* TEST_PROGRAM_CPUTYPES */
|