diff options
Diffstat (limited to 'arch/x86/boot/cpu.c')
-rw-r--r-- | arch/x86/boot/cpu.c | 68 |
1 files changed, 41 insertions, 27 deletions
diff --git a/arch/x86/boot/cpu.c b/arch/x86/boot/cpu.c index 6ec6bb6e9957..29207f69ae8c 100644 --- a/arch/x86/boot/cpu.c +++ b/arch/x86/boot/cpu.c | |||
@@ -16,7 +16,9 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include "boot.h" | 18 | #include "boot.h" |
19 | #ifdef CONFIG_X86_FEATURE_NAMES | ||
19 | #include "cpustr.h" | 20 | #include "cpustr.h" |
21 | #endif | ||
20 | 22 | ||
21 | static char *cpu_name(int level) | 23 | static char *cpu_name(int level) |
22 | { | 24 | { |
@@ -32,11 +34,48 @@ static char *cpu_name(int level) | |||
32 | } | 34 | } |
33 | } | 35 | } |
34 | 36 | ||
37 | static void show_cap_strs(u32 *err_flags) | ||
38 | { | ||
39 | int i, j; | ||
40 | #ifdef CONFIG_X86_FEATURE_NAMES | ||
41 | const unsigned char *msg_strs = (const unsigned char *)x86_cap_strs; | ||
42 | for (i = 0; i < NCAPINTS; i++) { | ||
43 | u32 e = err_flags[i]; | ||
44 | for (j = 0; j < 32; j++) { | ||
45 | if (msg_strs[0] < i || | ||
46 | (msg_strs[0] == i && msg_strs[1] < j)) { | ||
47 | /* Skip to the next string */ | ||
48 | msg_strs += 2; | ||
49 | while (*msg_strs++) | ||
50 | ; | ||
51 | } | ||
52 | if (e & 1) { | ||
53 | if (msg_strs[0] == i && | ||
54 | msg_strs[1] == j && | ||
55 | msg_strs[2]) | ||
56 | printf("%s ", msg_strs+2); | ||
57 | else | ||
58 | printf("%d:%d ", i, j); | ||
59 | } | ||
60 | e >>= 1; | ||
61 | } | ||
62 | } | ||
63 | #else | ||
64 | for (i = 0; i < NCAPINTS; i++) { | ||
65 | u32 e = err_flags[i]; | ||
66 | for (j = 0; j < 32; j++) { | ||
67 | if (e & 1) | ||
68 | printf("%d:%d ", i, j); | ||
69 | e >>= 1; | ||
70 | } | ||
71 | } | ||
72 | #endif | ||
73 | } | ||
74 | |||
35 | int validate_cpu(void) | 75 | int validate_cpu(void) |
36 | { | 76 | { |
37 | u32 *err_flags; | 77 | u32 *err_flags; |
38 | int cpu_level, req_level; | 78 | int cpu_level, req_level; |
39 | const unsigned char *msg_strs; | ||
40 | 79 | ||
41 | check_cpu(&cpu_level, &req_level, &err_flags); | 80 | check_cpu(&cpu_level, &req_level, &err_flags); |
42 | 81 | ||
@@ -49,34 +88,9 @@ int validate_cpu(void) | |||
49 | } | 88 | } |
50 | 89 | ||
51 | if (err_flags) { | 90 | if (err_flags) { |
52 | int i, j; | ||
53 | puts("This kernel requires the following features " | 91 | puts("This kernel requires the following features " |
54 | "not present on the CPU:\n"); | 92 | "not present on the CPU:\n"); |
55 | 93 | show_cap_strs(err_flags); | |
56 | msg_strs = (const unsigned char *)x86_cap_strs; | ||
57 | |||
58 | for (i = 0; i < NCAPINTS; i++) { | ||
59 | u32 e = err_flags[i]; | ||
60 | |||
61 | for (j = 0; j < 32; j++) { | ||
62 | if (msg_strs[0] < i || | ||
63 | (msg_strs[0] == i && msg_strs[1] < j)) { | ||
64 | /* Skip to the next string */ | ||
65 | msg_strs += 2; | ||
66 | while (*msg_strs++) | ||
67 | ; | ||
68 | } | ||
69 | if (e & 1) { | ||
70 | if (msg_strs[0] == i && | ||
71 | msg_strs[1] == j && | ||
72 | msg_strs[2]) | ||
73 | printf("%s ", msg_strs+2); | ||
74 | else | ||
75 | printf("%d:%d ", i, j); | ||
76 | } | ||
77 | e >>= 1; | ||
78 | } | ||
79 | } | ||
80 | putchar('\n'); | 94 | putchar('\n'); |
81 | return -1; | 95 | return -1; |
82 | } else { | 96 | } else { |