]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2009-04-06 Pavel Roskin <proski@gnu.org>
authorproski <proski@localhost>
Tue, 7 Apr 2009 00:48:57 +0000 (00:48 +0000)
committerproski <proski@localhost>
Tue, 7 Apr 2009 00:48:57 +0000 (00:48 +0000)
* include/grub/misc.h (ARRAY_SIZE): New macro.
* include/grub/i386/linux.h (GRUB_LINUX_VID_MODE_VESA_START):
New macro.
* loader/i386/linux.c (allocate_pages): Use free_pages().
(grub_linux_unload): Don't use free_pages().
(grub_linux_boot): Prevent accessing linux_vesafb_modes with a
wrong index.  Treat all other modes as text modes.
(grub_cmd_linux): Initialize vid_mode unconditionally to
GRUB_LINUX_VID_MODE_NORMAL.  Recognize and support "vga=ask".

ChangeLog
include/grub/i386/linux.h
include/grub/misc.h
loader/i386/linux.c

index 62115be13c5aead2884ca009badbaf142db33692..ff629413c5dff72f4fca313a1b43e9153d8328e3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2009-04-06  Pavel Roskin  <proski@gnu.org>
 
+       * include/grub/misc.h (ARRAY_SIZE): New macro.
+       * include/grub/i386/linux.h (GRUB_LINUX_VID_MODE_VESA_START):
+       New macro.
+       * loader/i386/linux.c (allocate_pages): Use free_pages().
+       (grub_linux_unload): Don't use free_pages().
+       (grub_linux_boot): Prevent accessing linux_vesafb_modes with a
+       wrong index.  Treat all other modes as text modes.
+       (grub_cmd_linux): Initialize vid_mode unconditionally to
+       GRUB_LINUX_VID_MODE_NORMAL.  Recognize and support "vga=ask".
+
        * commands/help.c (print_command_help): Use cmd->prio, not
        cmd->flags to check for GRUB_PRIO_LIST_FLAG_ACTIVE.
 
index d5b520729d9fd39c59b2831162babf2abd1c6cea..dad38e5454ed9e35cd47ba49478778467da6c8ee 100644 (file)
@@ -38,6 +38,7 @@
 #define GRUB_LINUX_VID_MODE_NORMAL     0xFFFF
 #define GRUB_LINUX_VID_MODE_EXTENDED   0xFFFE
 #define GRUB_LINUX_VID_MODE_ASK                0xFFFD
+#define GRUB_LINUX_VID_MODE_VESA_START 0x0301
 
 #define GRUB_LINUX_SETUP_MOVE_SIZE     0x9100
 #define GRUB_LINUX_CL_MAGIC            0xA33F
index c377c20a2590efc252787d41e1315b74c2e665c4..3490db0d566d8de94bb517123b7f0de81f517089 100644 (file)
@@ -26,6 +26,7 @@
 #include <grub/err.h>
 
 #define ALIGN_UP(addr, align) (((grub_uint64_t)addr + align - 1) & ~(align - 1))
+#define ARRAY_SIZE(array) (sizeof (array) / sizeof (array[0]))
 
 #define grub_dprintf(condition, fmt, args...) grub_real_dprintf(__FILE__, __LINE__, condition, fmt, ## args);
 /* XXX: If grub_memmove is too slow, we must implement grub_memcpy.  */
index a2fff83faed4ec22ef292fa3f284e9a99b02fe24..01d10d598963ecbe9c59faf203709ff4e4d65ca1 100644 (file)
@@ -206,8 +206,7 @@ allocate_pages (grub_size_t prot_size)
   prot_mode_pages = (prot_size >> 12);
   
   /* Initialize the memory pointers with NULL for convenience.  */
-  real_mode_mem = 0;
-  prot_mode_mem = 0;
+  free_pages ();
   
   /* FIXME: Should request low memory from the heap when this feature is
      implemented.  */
@@ -332,7 +331,9 @@ grub_linux_boot (void)
   
   params = real_mode_mem;
 
-  if (vid_mode == GRUB_LINUX_VID_MODE_NORMAL || vid_mode == GRUB_LINUX_VID_MODE_EXTENDED)
+  if (vid_mode < GRUB_LINUX_VID_MODE_VESA_START ||
+      vid_mode >= GRUB_LINUX_VID_MODE_VESA_START +
+                 ARRAY_SIZE (linux_vesafb_modes))
     grub_video_restore ();
   else if (vid_mode)
     {
@@ -340,7 +341,7 @@ grub_linux_boot (void)
       int depth, flags;
       
       flags = 0;
-      linux_mode = &linux_vesafb_modes[vid_mode - 0x301];
+      linux_mode = &linux_vesafb_modes[vid_mode - GRUB_LINUX_VID_MODE_VESA_START];
       depth = linux_mode->depth;
       
       /* If we have 8 or less bits, then assume that it is indexed color mode.  */
@@ -443,7 +444,6 @@ grub_linux_boot (void)
 static grub_err_t
 grub_linux_unload (void)
 {
-  free_pages ();
   grub_dl_unref (my_mod);
   loaded = 0;
   return GRUB_ERR_NONE;
@@ -569,7 +569,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
   grub_printf ("   [Linux-bzImage, setup=0x%x, size=0x%x]\n",
               (unsigned) real_size, (unsigned) prot_size);
 
-  /* Detect explicitly specified memory size, if any.  */
+  /* Look for memory size and video mode specified on the command line.  */
+  vid_mode = GRUB_LINUX_VID_MODE_NORMAL;
   linux_mem_size = 0;
   for (i = 1; i < argc; i++)
     if (grub_memcmp (argv[i], "vga=", 4) == 0)
@@ -581,6 +582,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
          vid_mode = GRUB_LINUX_VID_MODE_NORMAL;
        else if (grub_strcmp (val, "ext") == 0)
          vid_mode = GRUB_LINUX_VID_MODE_EXTENDED;
+       else if (grub_strcmp (val, "ask") == 0)
+         vid_mode = GRUB_LINUX_VID_MODE_ASK;
        else
          vid_mode = (grub_uint16_t) grub_strtoul (val, 0, 0);