Version:  2.0.40 2.2.26 2.4.37 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16

Linux/arch/x86/boot/cpu.c

  1 /* -*- linux-c -*- ------------------------------------------------------- *
  2  *
  3  *   Copyright (C) 1991, 1992 Linus Torvalds
  4  *   Copyright 2007-2008 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/x86/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 "cpustr.h"
 20 
 21 static char *cpu_name(int level)
 22 {
 23         static char buf[6];
 24 
 25         if (level == 64) {
 26                 return "x86-64";
 27         } else {
 28                 if (level == 15)
 29                         level = 6;
 30                 sprintf(buf, "i%d86", level);
 31                 return buf;
 32         }
 33 }
 34 
 35 int validate_cpu(void)
 36 {
 37         u32 *err_flags;
 38         int cpu_level, req_level;
 39         const unsigned char *msg_strs;
 40 
 41         check_cpu(&cpu_level, &req_level, &err_flags);
 42 
 43         if (cpu_level < req_level) {
 44                 printf("This kernel requires an %s CPU, ",
 45                        cpu_name(req_level));
 46                 printf("but only detected an %s CPU.\n",
 47                        cpu_name(cpu_level));
 48                 return -1;
 49         }
 50 
 51         if (err_flags) {
 52                 int i, j;
 53                 puts("This kernel requires the following features "
 54                      "not present on the CPU:\n");
 55 
 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');
 81                 return -1;
 82         } else {
 83                 return 0;
 84         }
 85 }
 86 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us