diff options
Diffstat (limited to 'arch/x86/boot/cpu.c')
-rw-r--r-- | arch/x86/boot/cpu.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/arch/x86/boot/cpu.c b/arch/x86/boot/cpu.c new file mode 100644 index 000000000000..2a5c32da5852 --- /dev/null +++ b/arch/x86/boot/cpu.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* -*- linux-c -*- ------------------------------------------------------- * | ||
2 | * | ||
3 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
4 | * Copyright 2007 rPath, Inc. - All Rights Reserved | ||
5 | * | ||
6 | * This file is part of the Linux kernel, and is made available under | ||
7 | * the terms of the GNU General Public License version 2. | ||
8 | * | ||
9 | * ----------------------------------------------------------------------- */ | ||
10 | |||
11 | /* | ||
12 | * arch/i386/boot/cpu.c | ||
13 | * | ||
14 | * Check for obligatory CPU features and abort if the features are not | ||
15 | * present. | ||
16 | */ | ||
17 | |||
18 | #include "boot.h" | ||
19 | #include "bitops.h" | ||
20 | #include <asm/cpufeature.h> | ||
21 | |||
22 | static char *cpu_name(int level) | ||
23 | { | ||
24 | static char buf[6]; | ||
25 | |||
26 | if (level == 64) { | ||
27 | return "x86-64"; | ||
28 | } else { | ||
29 | sprintf(buf, "i%d86", level); | ||
30 | return buf; | ||
31 | } | ||
32 | } | ||
33 | |||
34 | int validate_cpu(void) | ||
35 | { | ||
36 | u32 *err_flags; | ||
37 | int cpu_level, req_level; | ||
38 | |||
39 | check_cpu(&cpu_level, &req_level, &err_flags); | ||
40 | |||
41 | if (cpu_level < req_level) { | ||
42 | printf("This kernel requires an %s CPU, ", | ||
43 | cpu_name(req_level)); | ||
44 | printf("but only detected an %s CPU.\n", | ||
45 | cpu_name(cpu_level)); | ||
46 | return -1; | ||
47 | } | ||
48 | |||
49 | if (err_flags) { | ||
50 | int i, j; | ||
51 | puts("This kernel requires the following features " | ||
52 | "not present on the CPU:\n"); | ||
53 | |||
54 | for (i = 0; i < NCAPINTS; i++) { | ||
55 | u32 e = err_flags[i]; | ||
56 | |||
57 | for (j = 0; j < 32; j++) { | ||
58 | if (e & 1) | ||
59 | printf("%d:%d ", i, j); | ||
60 | |||
61 | e >>= 1; | ||
62 | } | ||
63 | } | ||
64 | putchar('\n'); | ||
65 | return -1; | ||
66 | } else { | ||
67 | return 0; | ||
68 | } | ||
69 | } | ||