x86 setup: handle more than 8 CPU flag words
authorH. Peter Anvin <hpa@zytor.com>
Tue, 16 Sep 2008 22:09:26 +0000 (15:09 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Tue, 16 Sep 2008 22:09:26 +0000 (15:09 -0700)
Checkin e38e05a85828dac23540cd007df5f20985388afc added a 9th CPU flag
word, but didn't adjust the boot code to match.  This patch adds the
necessary boot code support.

Note: due to a typo in an #if statement, it didn't trigger the #error
this was supposed to do.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/boot/cpu.c
arch/x86/boot/mkcpustr.c

index 75298fe2edca6ac30c76354a573c87fb4eab135c..6ec6bb6e9957a0319259f966c0ac7b2ca4ff69a0 100644 (file)
@@ -59,17 +59,18 @@ int validate_cpu(void)
                        u32 e = err_flags[i];
 
                        for (j = 0; j < 32; j++) {
-                               int n = (i << 5)+j;
-                               if (*msg_strs < n) {
+                               if (msg_strs[0] < i ||
+                                   (msg_strs[0] == i && msg_strs[1] < j)) {
                                        /* Skip to the next string */
-                                       do {
-                                               msg_strs++;
-                                       } while (*msg_strs);
-                                       msg_strs++;
+                                       msg_strs += 2;
+                                       while (*msg_strs++)
+                                               ;
                                }
                                if (e & 1) {
-                                       if (*msg_strs == n && msg_strs[1])
-                                               printf("%s ", msg_strs+1);
+                                       if (msg_strs[0] == i &&
+                                           msg_strs[1] == j &&
+                                           msg_strs[2])
+                                               printf("%s ", msg_strs+2);
                                        else
                                                printf("%d:%d ", i, j);
                                }
index 4589caa3e9d1f23c53d6f36ef1949fb50eff9bd1..8ef60f20b371017efc47f60fc371d090d0e76014 100644 (file)
 
 #include "../kernel/cpu/capflags.c"
 
-#if NCAPFLAGS > 8
-# error "Need to adjust the boot code handling of CPUID strings"
-#endif
-
 int main(void)
 {
-       int i;
+       int i, j;
        const char *str;
 
        printf("static const char x86_cap_strs[] = \n");
 
-       for (i = 0; i < NCAPINTS*32; i++) {
-               str = x86_cap_flags[i];
-
-               if (i == NCAPINTS*32-1) {
-                       /* The last entry must be unconditional; this
-                          also consumes the compiler-added null character */
-                       if (!str)
-                               str = "";
-                       printf("\t\"\\x%02x\"\"%s\"\n", i, str);
-               } else if (str) {
-                       printf("#if REQUIRED_MASK%d & (1 << %d)\n"
-                              "\t\"\\x%02x\"\"%s\\0\"\n"
-                              "#endif\n",
-                              i >> 5, i & 31, i, str);
+       for (i = 0; i < NCAPINTS; i++) {
+               for (j = 0; j < 32; j++) {
+                       str = x86_cap_flags[i*32+j];
+
+                       if (i == NCAPINTS-1 && j == 31) {
+                               /* The last entry must be unconditional; this
+                                  also consumes the compiler-added null
+                                  character */
+                               if (!str)
+                                       str = "";
+                               printf("\t\"\\x%02x\\x%02x\"\"%s\"\n",
+                                      i, j, str);
+                       } else if (str) {
+                               printf("#if REQUIRED_MASK%d & (1 << %d)\n"
+                                      "\t\"\\x%02x\\x%02x\"\"%s\\0\"\n"
+                                      "#endif\n",
+                                      i, j, i, j, str);
+                       }
                }
        }
        printf("\t;\n");