]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Transform legacy mode numbers into resolution specification
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 15 Sep 2010 09:39:53 +0000 (11:39 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 15 Sep 2010 09:39:53 +0000 (11:39 +0200)
Makefile.util.def
grub-core/Makefile.core.def
grub-core/lib/i386/pc/vesa_modes_table.c [new file with mode: 0644]
grub-core/lib/legacy_parse.c
grub-core/loader/i386/linux.c

index febbfd0edbd755537d2a8f96f92ef89426255f87..54ec6ee8addf140c17805490f7908311b711e54b 100644 (file)
@@ -563,6 +563,8 @@ program = {
   mansection = 1;
   common = util/grub-menulst2cfg.c;
   common = grub-core/lib/legacy_parse.c;
+  common = grub-core/lib/i386/pc/vesa_modes_table.c;
+
   ldadd = libgrub.a;
   ldflags = '$(LIBDEVMAPPER)';
 };
index 36a6e65645ebcef561363117e9d284b61a492545..03505ad5aaf46585eaa5b5c13b3dba469d5bae60 100644 (file)
@@ -1111,6 +1111,7 @@ module = {
 module = {
   name = linux;
   x86 = loader/i386/linux.c;
+  i386_pc = lib/i386/pc/vesa_modes_table.c;
   mips = loader/mips/linux.c;
   powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
   sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
diff --git a/grub-core/lib/i386/pc/vesa_modes_table.c b/grub-core/lib/i386/pc/vesa_modes_table.c
new file mode 100644 (file)
index 0000000..6dc4b7d
--- /dev/null
@@ -0,0 +1,127 @@
+
+#include <grub/i386/pc/vesa_modes_table.h>
+
+/* This is the reverse of the table in [linux]/Documentation/fb/vesafb.txt
+   plus a few more modes based on the table in
+   http://en.wikipedia.org/wiki/VESA_BIOS_Extensions  */
+struct grub_vesa_mode_table_entry
+grub_vesa_mode_table[GRUB_VESA_MODE_TABLE_END
+                    - GRUB_VESA_MODE_TABLE_START + 1] =
+  {
+    { 640, 400, 8 },           /* 0x300 */
+    { 640, 480, 8 },           /* 0x301 */
+    { 800, 600, 4 },           /* 0x302 */
+    { 800, 600, 8 },           /* 0x303 */
+    { 1024, 768, 4 },  /* 0x304 */
+    { 1024, 768, 8 },  /* 0x305 */
+    { 1280, 1024, 4 }, /* 0x306 */
+    { 1280, 1024, 8 }, /* 0x307 */
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 320, 200, 15 },  /* 0x30d */
+    { 320, 200, 16 },  /* 0x30e */
+    { 320, 200, 24 },  /* 0x30f */
+    { 640, 480, 15 },  /* 0x310 */
+    { 640, 480, 16 },  /* 0x311 */
+    { 640, 480, 24 },  /* 0x312 */
+    { 800, 600, 15 },  /* 0x313 */
+    { 800, 600, 16 },  /* 0x314 */
+    { 800, 600, 24 },  /* 0x315 */
+    { 1024, 768, 15 }, /* 0x316 */
+    { 1024, 768, 16 }, /* 0x317 */
+    { 1024, 768, 24 }, /* 0x318 */
+    { 1280, 1024, 15 },        /* 0x319 */
+    { 1280, 1024, 16 },        /* 0x31a */
+    { 1280, 1024, 24 },        /* 0x31b */
+    { 1600, 1200, 8 }, /* 0x31c */
+    { 1600, 1200, 15 },        /* 0x31d */
+    { 1600, 1200, 16 },        /* 0x31e */
+    { 1600, 1200, 24 },        /* 0x31f */
+    { 0, 0, 0 },
+    { 640, 400, 15 },  /* 0x321 */
+    { 640, 400, 16 },  /* 0x322 */
+    { 640, 400, 24 },  /* 0x323 */
+    { 640, 400, 32 },  /* 0x324 */
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 640, 480, 32 },  /* 0x329 */
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 896, 672, 8 },           /* 0x32f */
+    { 896, 672, 15 },  /* 0x330 */
+    { 896, 672, 16 },  /* 0x331 */
+    { 896, 672, 24 },  /* 0x332 */
+    { 896, 672, 32 },  /* 0x333 */
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 1600, 1200, 32 },        /* 0x342 */
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 0, 0, 0 },
+    { 1440, 900, 8 },  /* 0x360 */
+    { 1440, 900, 15 }, /* 0x361 */
+    { 1440, 900, 16 }, /* 0x362 */
+    { 1440, 900, 24 }, /* 0x363 */
+    { 1440, 900, 32 }, /* 0x364 */
+    { 1152, 720, 8 },  /* 0x365 */
+    { 1152, 720, 15 }, /* 0x366 */
+    { 1152, 720, 16 }, /* 0x367 */
+    { 1152, 720, 24 }, /* 0x368 */
+    { 1152, 720, 32 }, /* 0x369 */
+    { 1024, 640, 8 },  /* 0x36a */
+    { 1024, 640, 15 }, /* 0x36b */
+    { 1024, 640, 16 }, /* 0x36c */
+    { 1024, 640, 24 }, /* 0x36d */
+    { 1024, 640, 32 }, /* 0x36e */
+    { 800, 500, 8 },           /* 0x36f */
+    { 800, 500, 15 },  /* 0x370 */
+    { 800, 500, 16 },  /* 0x371 */
+    { 800, 500, 24 },  /* 0x372 */
+    { 800, 500, 32 },  /* 0x373 */
+  };
index 7ecd1c74fe592abeba011aed27b67127fa612437..959d8367df771e0d3bc264b3e5e368b44b6e6516 100644 (file)
@@ -21,6 +21,7 @@
 #include <grub/mm.h>
 #include <grub/err.h>
 #include <grub/legacy_parse.h>
+#include <grub/i386/pc/vesa_modes_table.h>
 
 struct legacy_command
 {
@@ -40,7 +41,8 @@ struct legacy_command
     TYPE_PARTITION,
     TYPE_BOOL,
     TYPE_INT,
-    TYPE_REST_VERBATIM
+    TYPE_REST_VERBATIM,
+    TYPE_VBE_MODE
   } argt[4];
   enum {
     FLAG_IGNORE_REST        =  1,
@@ -264,7 +266,8 @@ struct legacy_command legacy_commands[] =
      " compares them, to test the filesystem code. "
      " If this test succeeds, then a good next"
      " step is to try loading a kernel."},
-    /* FIXME: testvbe unsupported.  */
+    {"testvbe", "insmod vbe; videotest '%s'\n", NULL, 0, 1, {TYPE_VBE_MODE}, 0,
+     "MODE", "Test the VBE mode MODE. Hit any key to return."},
     /* FIXME: tftpserver unsupported.  */
     {"timeout", "set timeout=%s\n", NULL, 0, 1, {TYPE_INT}, 0, "SEC",
      "Set a timeout, in SEC seconds, before automatically booting the"
@@ -278,7 +281,7 @@ struct legacy_command legacy_commands[] =
     {"uuid", "search --set=root --fs-uuid '%s'\n", NULL, 0, 1, {TYPE_VERBATIM},
      0, "UUID", "Find root by UUID"},
     /* FIXME: support MODE.  */
-    {"vbeprobe", "vbeinfo\n", NULL, 0, 0, {}, 0, "[MODE]",
+    {"vbeprobe", "insmod vbe; videoinfo\n", NULL, 0, 0, {}, 0, "[MODE]",
      "Probe VBE information. If the mode number MODE is specified, show only"
      " the information about only the mode."}
   };
@@ -566,6 +569,34 @@ grub_legacy_parse (const char *buf, char **entryname, char **suffix)
                args[i] = grub_strndup (curarg, brk - curarg);
            }
            break;
+         case TYPE_VBE_MODE:
+           {
+             unsigned mod;
+             struct grub_vesa_mode_table_entry *modedesc;
+
+             mod = grub_strtoul (curarg, 0, 0);
+             if (grub_errno)
+               {
+                 mod = 0;
+                 grub_errno = GRUB_ERR_NONE;
+               }
+             if (mod < GRUB_VESA_MODE_TABLE_START
+                 || mod > GRUB_VESA_MODE_TABLE_END)
+               {
+                 args[i] = grub_strdup ("auto");
+                 break;
+               }
+             modedesc = &grub_vesa_mode_table[mod - GRUB_VESA_MODE_TABLE_START];
+             if (!modedesc->width)
+               {
+                 args[i] = grub_strdup ("auto");
+                 break;
+               }
+             args[i] = grub_xasprintf ("%ux%ux%u",
+                                       modedesc->width, modedesc->height,
+                                       modedesc->depth);
+             break;
+           }
          case TYPE_BOOL:
            if (curarglen == 2 && curarg[0] == 'o' && curarg[1] == 'n')
              args[i] = grub_strdup ("1");
@@ -599,7 +630,10 @@ grub_legacy_parse (const char *buf, char **entryname, char **suffix)
       case TYPE_BOOL:
       case TYPE_INT:
        args[i] = grub_strdup ("0");
-           break;
+       break;
+      case TYPE_VBE_MODE:    
+       args[i] = grub_strdup ("auto");
+       break;
       }
 
   if (legacy_commands[cmdnum].flags & FLAG_COLOR_INVERT)
index cc2d20af3a996adf6baafaf731e1c035d80b2959..9d5b7b727d5e7549abbbacf4a173e709d16a1978 100644 (file)
 #include <grub/i386/relocator.h>
 #include <grub/i18n.h>
 
+#ifdef GRUB_MACHINE_PCBIOS
+#include <grub/i386/pc/vesa_modes_table.h>
+#endif
+
 #ifdef GRUB_MACHINE_EFI
 #include <grub/efi/efi.h>
 #define HAS_VGA_TEXT 0
@@ -89,175 +93,6 @@ static struct idt_descriptor idt_desc =
   };
 #endif
 
-#ifdef GRUB_MACHINE_PCBIOS
-struct linux_vesafb_res
-{
-  grub_uint16_t width;
-  grub_uint16_t height;
-};
-
-struct linux_vesafb_mode
-{
-  grub_uint8_t res_index;
-  grub_uint8_t depth;
-};
-
-enum vga_modes
-  {
-    VGA_320_200,
-    VGA_640_400,
-    VGA_640_480,
-    VGA_800_500,
-    VGA_800_600,
-    VGA_896_672,
-    VGA_1024_640,
-    VGA_1024_768,
-    VGA_1152_720,
-    VGA_1280_1024,
-    VGA_1440_900,
-    VGA_1600_1200,
-  };
-
-static struct linux_vesafb_res linux_vesafb_res[] =
-  {
-    { 320, 200 },
-    { 640, 400 },
-    { 640, 480 },
-    { 800, 500 },
-    { 800, 600 },
-    { 896, 672 },
-    { 1024, 640 },
-    { 1024, 768 },
-    { 1152, 720 },
-    { 1280, 1024 },
-    { 1440, 900 },
-    { 1600, 1200 },
-  };
-
-/* This is the reverse of the table in [linux]/Documentation/fb/vesafb.txt
-   plus a few more modes based on the table in
-   http://en.wikipedia.org/wiki/VESA_BIOS_Extensions  */
-struct linux_vesafb_mode linux_vesafb_modes[] =
-  {
-    { VGA_640_400, 8 },                /* 0x300 */
-    { VGA_640_480, 8 },                /* 0x301 */
-    { VGA_800_600, 4 },                /* 0x302 */
-    { VGA_800_600, 8 },                /* 0x303 */
-    { VGA_1024_768, 4 },       /* 0x304 */
-    { VGA_1024_768, 8 },       /* 0x305 */
-    { VGA_1280_1024, 4 },      /* 0x306 */
-    { VGA_1280_1024, 8 },      /* 0x307 */
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { VGA_320_200, 15 },       /* 0x30d */
-    { VGA_320_200, 16 },       /* 0x30e */
-    { VGA_320_200, 24 },       /* 0x30f */
-    { VGA_640_480, 15 },       /* 0x310 */
-    { VGA_640_480, 16 },       /* 0x311 */
-    { VGA_640_480, 24 },       /* 0x312 */
-    { VGA_800_600, 15 },       /* 0x313 */
-    { VGA_800_600, 16 },       /* 0x314 */
-    { VGA_800_600, 24 },       /* 0x315 */
-    { VGA_1024_768, 15 },      /* 0x316 */
-    { VGA_1024_768, 16 },      /* 0x317 */
-    { VGA_1024_768, 24 },      /* 0x318 */
-    { VGA_1280_1024, 15 },     /* 0x319 */
-    { VGA_1280_1024, 16 },     /* 0x31a */
-    { VGA_1280_1024, 24 },     /* 0x31b */
-    { VGA_1600_1200, 8 },      /* 0x31c */
-    { VGA_1600_1200, 15 },     /* 0x31d */
-    { VGA_1600_1200, 16 },     /* 0x31e */
-    { VGA_1600_1200, 24 },     /* 0x31f */
-    { 0, 0 },
-    { VGA_640_400, 15 },       /* 0x321 */
-    { VGA_640_400, 16 },       /* 0x322 */
-    { VGA_640_400, 24 },       /* 0x323 */
-    { VGA_640_400, 32 },       /* 0x324 */
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { VGA_640_480, 32 },       /* 0x329 */
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { VGA_896_672, 8 },                /* 0x32f */
-    { VGA_896_672, 15 },       /* 0x330 */
-    { VGA_896_672, 16 },       /* 0x331 */
-    { VGA_896_672, 24 },       /* 0x332 */
-    { VGA_896_672, 32 },       /* 0x333 */
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { VGA_1600_1200, 32 },     /* 0x342 */
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { 0, 0 },
-    { VGA_1440_900, 8 },       /* 0x360 */
-    { VGA_1440_900, 15 },      /* 0x361 */
-    { VGA_1440_900, 16 },      /* 0x362 */
-    { VGA_1440_900, 24 },      /* 0x363 */
-    { VGA_1440_900, 32 },      /* 0x364 */
-    { VGA_1152_720, 8 },       /* 0x365 */
-    { VGA_1152_720, 15 },      /* 0x366 */
-    { VGA_1152_720, 16 },      /* 0x367 */
-    { VGA_1152_720, 24 },      /* 0x368 */
-    { VGA_1152_720, 32 },      /* 0x369 */
-    { VGA_1024_640, 8 },       /* 0x36a */
-    { VGA_1024_640, 15 },      /* 0x36b */
-    { VGA_1024_640, 16 },      /* 0x36c */
-    { VGA_1024_640, 24 },      /* 0x36d */
-    { VGA_1024_640, 32 },      /* 0x36e */
-    { VGA_800_500, 8 },                /* 0x36f */
-    { VGA_800_500, 15 },       /* 0x370 */
-    { VGA_800_500, 16 },       /* 0x371 */
-    { VGA_800_500, 24 },       /* 0x372 */
-    { VGA_800_500, 32 },       /* 0x373 */
-  };
-#endif
-
 static inline grub_size_t
 page_align (grub_size_t size)
 {
@@ -882,7 +717,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
        /* Video mode selection support.  */
        char *val = argv[i] + 4;
        unsigned vid_mode = GRUB_LINUX_VID_MODE_NORMAL;
-       struct linux_vesafb_mode *linux_mode;
+       struct grub_vesa_mode_table_entry *linux_mode;
        grub_err_t err;
        char *buf;
 
@@ -925,9 +760,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
            break;
          default:
            /* Ignore invalid values.  */
-           if (vid_mode < GRUB_LINUX_VID_MODE_VESA_START ||
-               vid_mode >= GRUB_LINUX_VID_MODE_VESA_START +
-               ARRAY_SIZE (linux_vesafb_modes))
+           if (vid_mode < GRUB_VESA_MODE_TABLE_START ||
+               vid_mode > GRUB_VESA_MODE_TABLE_END)
              {
                grub_env_set ("gfxpayload", "text");
                grub_printf ("%s is deprecated. Mode %d isn't recognized. "
@@ -941,15 +775,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
               is built-in because `vga=' parameter was used.  */
            params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
 
-           linux_mode
-             = &linux_vesafb_modes[vid_mode - GRUB_LINUX_VID_MODE_VESA_START];
+           linux_mode = &grub_vesa_mode_table[vid_mode
+                                              - GRUB_VESA_MODE_TABLE_START];
 
            buf = grub_xasprintf ("%ux%ux%u,%ux%u",
-                                linux_vesafb_res[linux_mode->res_index].width,
-                                linux_vesafb_res[linux_mode->res_index].height,
+                                linux_mode->width, linux_mode->height,
                                 linux_mode->depth,
-                                linux_vesafb_res[linux_mode->res_index].width,
-                                linux_vesafb_res[linux_mode->res_index].height);
+                                linux_mode->width, linux_mode->height);
            if (! buf)
              goto fail;