criu/cpu.c
Cyrill Gorcunov cf2e6c54c9 cpu: Add code to fetch/test cpuinfo data
This patch add ability to test /proc/cpuinfo data
we're interested in at the moment.

The code provides the following functionality

 - cpu_init, to parse cpuinfo and check if the
   host cpu we're running on is suitable enough
   for FPU checkpoint/restore. If FPU present then
   there must be at least fxsave capability present

 - cpu_set_feature/cpu_has_feature helpers which
   provides to test certain bits and set them where
   needed (we need to set bits when parse cpuinfo)

Note, we reserve space for all cpuinfo bits known
by the kernel at moment, while use only three FPU
related bits for a while. This is done because we might
need to use or find out other features in future.

After all it's just 40 bytes of memory needed to keep
all possible bits.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2012-12-21 17:35:34 +04:00

70 lines
1.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include "compiler.h"
#include "types.h"
#include "log.h"
#include "util.h"
#include "bitops.h"
#include "proc_parse.h"
#include "fpu.h"
#include "cpu.h"
#undef LOG_PREFIX
#define LOG_PREFIX "cpu: "
const char * const x86_cap_flags[NCAPINTS_BITS] = {
[X86_FEATURE_FPU] = "fpu",
[X86_FEATURE_FXSR] = "fxsr",
[X86_FEATURE_XSAVE] = "xsave",
};
static DECLARE_BITMAP(cpu_features, NCAPINTS_BITS);
#define cpu_has(bit) test_bit(bit, cpu_features)
void cpu_set_feature(unsigned int feature)
{
if (likely(feature < NCAPINTS_BITS))
set_bit(feature, cpu_features);
}
bool cpu_has_feature(unsigned int feature)
{
if (likely(feature < NCAPINTS_BITS))
return cpu_has(feature);
return false;
}
int cpu_init(void)
{
if (parse_cpuinfo_features())
return -1;
BUILD_BUG_ON(sizeof(struct xsave_struct) != XSAVE_SIZE);
BUILD_BUG_ON(sizeof(struct i387_fxsave_struct) != FXSAVE_SIZE);
/*
* Make sure that at least FPU is onboard
* and fxsave is supported.
*/
if (cpu_has(X86_FEATURE_FPU)) {
if (!cpu_has(X86_FEATURE_FXSR)) {
pr_err("missing support fxsave/restore insns\n");
return -1;
}
}
pr_debug("fpu:%d fxsr:%d xsave:%d\n",
!!cpu_has(X86_FEATURE_FPU),
!!cpu_has(X86_FEATURE_FXSR),
!!cpu_has(X86_FEATURE_XSAVE));
return 0;
}