Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6.24
[linux-2.6] / arch / x86 / boot / cpu.c
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 }