]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2005-08-19 Yoshinori K. Okuji <okuji@enbug.org>
authorokuji <okuji@localhost>
Fri, 19 Aug 2005 00:32:01 +0000 (00:32 +0000)
committerokuji <okuji@localhost>
Fri, 19 Aug 2005 00:32:01 +0000 (00:32 +0000)
        * DISTLIST: Replace commands/i386/pc/vbe_list_modes.c and
        commands/i386/pc/vbe_test.c with commands/i386/pc/vbeinfo.c and
        commands/i386/pc/vbetest.c.

        * video/i386/pc/vbe.c (grub_vbe_probe): If INFOBLOCK is not NULL,
        call grub_vbe_get_controller_info again, because the returned
        information is volatile.
        (grub_vbe_set_video_mode): Mostly rewritten.
        (grub_vbe_get_video_mode): Use grub_vbe_probe and use
        grub_vbe_status_t correctly.
        (grub_vbe_get_video_mode_info): Likewise.
        (grub_vbe_set_pixel_rgb): Use a switch statement rather than
        several if statements.

        * commands/i386/pc/vbe_list_modes.c: Renamed to ...
        * commands/i386/pc/vbeinfo.c: ... this.

        * commands/i386/pc/vbe_test.c: Renamed to ...
        * commands/i386/pc/vbetest.c: ... this.

        * commands/i386/pc/vbeinfo.c (grub_cmd_vbe_list_modes): Renamed to
        ...
        (grub_cmd_vbeinfo): ... this. Save video modes before
        iterating. Skip a video mode, if it is not available, not enough
        information is given or it is monochrome. Show the memory
        model. Leave the interpretation of MODEVAR to grub_strtoul
        completely.
        (GRUB_MOD_INIT): Rename vbe_list_modes to vbeinfo.
        (GRUB_MOD_FINI): Likewise.

        * commands/i386/pc/vbetest.c (grub_cmd_vbe_test): Renamed to ...
        (grub_cmd_vbetest): ... this. Don't print unnecessarily. Use
        grub_err_t instead of grub_uint32_t. Don't use SPTR. Remove a
        duplicated grub_env_get. Leave the interpretation of MODEVAR to
        grub_strtoul completely.
        (real2pm): Removed.
        (GRUB_MOD_INIT): Rename vbe_test to vbetest.
        (GRUB_MOD_FINI): Likewise.

        * normal/misc.c: Include grub/mm.h.

        * conf/i386-pc.rmk (pkgdata_MODULES): Replaced vbe_test.mod and
        vbe_list_modes with vbetest.mod and vbeinfo.mod.
        (vbe_list_modes_mod_SOURCES): Removed.
        (vbe_list_modes_mod_CFLAGS): Likewise.
        (vbe_test_mod_SOURCES): Likewise.
        (vbe_test_mod_CFLAGS): Likewise.
        (vbeinfo_mod_SOURCES): New variable.
        (vbeinfo_mod_CFLAGS): Likewise.
        (vbetest_mod_SOURCES): Likewise.
        (vbetest_mod_CFLAGS): Likewise.

ChangeLog
DISTLIST
commands/i386/pc/vbe_list_modes.c [deleted file]
commands/i386/pc/vbeinfo.c [new file with mode: 0644]
commands/i386/pc/vbetest.c [moved from commands/i386/pc/vbe_test.c with 74% similarity]
conf/i386-pc.mk
conf/i386-pc.rmk
normal/misc.c
video/i386/pc/vbe.c

index 0f953e97086a3f03ba0160eef56a840665ae4d61..36a01642b93b1c1b50e93c063198931a890e8c6d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,57 @@
+2005-08-19  Yoshinori K. Okuji  <okuji@enbug.org>
+
+       * DISTLIST: Replace commands/i386/pc/vbe_list_modes.c and
+       commands/i386/pc/vbe_test.c with commands/i386/pc/vbeinfo.c and
+       commands/i386/pc/vbetest.c.
+
+       * video/i386/pc/vbe.c (grub_vbe_probe): If INFOBLOCK is not NULL,
+       call grub_vbe_get_controller_info again, because the returned
+       information is volatile.
+       (grub_vbe_set_video_mode): Mostly rewritten.
+       (grub_vbe_get_video_mode): Use grub_vbe_probe and use
+       grub_vbe_status_t correctly.
+       (grub_vbe_get_video_mode_info): Likewise.
+       (grub_vbe_set_pixel_rgb): Use a switch statement rather than
+       several if statements.
+
+       * commands/i386/pc/vbe_list_modes.c: Renamed to ...
+       * commands/i386/pc/vbeinfo.c: ... this.
+
+       * commands/i386/pc/vbe_test.c: Renamed to ...
+       * commands/i386/pc/vbetest.c: ... this.
+
+       * commands/i386/pc/vbeinfo.c (grub_cmd_vbe_list_modes): Renamed to
+       ...
+       (grub_cmd_vbeinfo): ... this. Save video modes before
+       iterating. Skip a video mode, if it is not available, not enough
+       information is given or it is monochrome. Show the memory
+       model. Leave the interpretation of MODEVAR to grub_strtoul
+       completely.
+       (GRUB_MOD_INIT): Rename vbe_list_modes to vbeinfo.
+       (GRUB_MOD_FINI): Likewise.
+
+       * commands/i386/pc/vbetest.c (grub_cmd_vbe_test): Renamed to ...
+       (grub_cmd_vbetest): ... this. Don't print unnecessarily. Use
+       grub_err_t instead of grub_uint32_t. Don't use SPTR. Remove a
+       duplicated grub_env_get. Leave the interpretation of MODEVAR to
+       grub_strtoul completely.
+       (real2pm): Removed.
+       (GRUB_MOD_INIT): Rename vbe_test to vbetest.
+       (GRUB_MOD_FINI): Likewise.
+
+       * normal/misc.c: Include grub/mm.h.
+
+       * conf/i386-pc.rmk (pkgdata_MODULES): Replaced vbe_test.mod and
+       vbe_list_modes with vbetest.mod and vbeinfo.mod.
+       (vbe_list_modes_mod_SOURCES): Removed.
+       (vbe_list_modes_mod_CFLAGS): Likewise.
+       (vbe_test_mod_SOURCES): Likewise.
+       (vbe_test_mod_CFLAGS): Likewise.
+       (vbeinfo_mod_SOURCES): New variable.
+       (vbeinfo_mod_CFLAGS): Likewise.
+       (vbetest_mod_SOURCES): Likewise.
+       (vbetest_mod_CFLAGS): Likewise.
+
 2005-08-18  Yoshinori K. Okuji  <okuji@enbug.org>
 
        * normal/misc.c: New file.
index c93189f144a465affacd7ea525218d75287e11fd..92ce2c3ed713a94921d2db77f0d4721daa044369 100644 (file)
--- a/DISTLIST
+++ b/DISTLIST
@@ -32,8 +32,8 @@ boot/powerpc/ieee1275/cmain.c
 boot/powerpc/ieee1275/crt0.S
 commands/i386/pc/halt.c
 commands/i386/pc/reboot.c
-commands/i386/pc/vbe_list_modes.c
-commands/i386/pc/vbe_test.c
+commands/i386/pc/vbeinfo.c
+commands/i386/pc/vbetest.c
 commands/ieee1275/halt.c
 commands/ieee1275/reboot.c
 commands/ieee1275/suspend.c
diff --git a/commands/i386/pc/vbe_list_modes.c b/commands/i386/pc/vbe_list_modes.c
deleted file mode 100644 (file)
index d2f5178..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/* vbe_list_modes.c - command to list compatible VBE video modes.  */
-/*
- *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2005  Free Software Foundation, Inc.
- *
- *  GRUB is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with GRUB; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <grub/normal.h>
-#include <grub/dl.h>
-#include <grub/arg.h>
-#include <grub/env.h>
-#include <grub/misc.h>
-#include <grub/machine/init.h>
-#include <grub/machine/vbe.h>
-
-static void *
-real2pm(grub_vbe_farptr_t ptr)
-{
-  return (void *)((((unsigned long)ptr & 0xFFFF0000) >> 12UL)
-                  + ((unsigned long)ptr & 0x0000FFFF));
-}
-
-static grub_err_t
-grub_cmd_vbe_list_modes(struct grub_arg_list *state __attribute__ ((unused)),
-                       int argc __attribute__ ((unused)),
-                       char **args __attribute__ ((unused)))
-{
-  struct grub_vbe_info_block controller_info;
-  struct grub_vbe_mode_info_block mode_info_tmp;
-  grub_uint32_t use_mode = GRUB_VBE_DEFAULT_VIDEO_MODE;
-  grub_uint16_t *sptr;
-  grub_uint32_t rc;
-  char *modevar;
-
-  grub_printf ("List of compatible video modes:\n");
-
-  rc = grub_vbe_probe (&controller_info);
-
-  if (rc != GRUB_ERR_NONE)
-    {
-      grub_printf ("VESA BIOS Extension not detected!\n");
-      return rc;
-    }
-
-  sptr = real2pm (controller_info.video_mode_ptr);
-
-  /* Walk thru all video modes listed.  */
-  for (;*sptr != 0xFFFF; sptr++)
-    {
-      int valid_mode = 1;
-
-      rc = grub_vbe_get_video_mode_info (*sptr, &mode_info_tmp);
-      if (rc != GRUB_ERR_NONE) continue;
-
-      if ((mode_info_tmp.mode_attributes & 0x080) == 0)
-       {
-         /* We support only linear frame buffer modes.  */
-         continue;
-       }
-
-      if ((mode_info_tmp.mode_attributes & 0x010) == 0)
-       {
-         /* We allow only graphical modes.  */
-         continue;
-       }
-
-      switch(mode_info_tmp.memory_model)
-       {
-       case 0x04:
-       case 0x06:
-         break;
-
-       default:
-         valid_mode = 0;
-         break;
-       }
-
-      if (valid_mode == 0) continue;
-
-      grub_printf ("0x%03x: %d x %d x %d bpp\n",
-                   *sptr,
-                   mode_info_tmp.x_resolution,
-                   mode_info_tmp.y_resolution,
-                   mode_info_tmp.bits_per_pixel);
-    }
-
-  /* Check existence of vbe_mode environment variable.  */
-  modevar = grub_env_get ("vbe_mode");
-
-  /* Check existence of vbe_mode environment variable.  */
-  modevar = grub_env_get ("vbe_mode");
-
-  if (modevar != 0)
-    {
-      unsigned long value = 0;
-
-      if ((grub_strncmp (modevar, "0x", 2) == 0) ||
-         (grub_strncmp (modevar, "0X", 2) == 0))
-       {
-         /* Convert HEX mode number.  */
-         value = grub_strtoul (modevar + 2, 0, 16);
-       }
-      else
-       {
-         /* Convert DEC mode number.  */
-         value = grub_strtoul (modevar, 0, 10);
-       }
-
-      if (value != 0)
-       {
-         use_mode = value;
-       }
-    }
-
-  grub_printf ("Configured VBE mode (vbe_mode) = 0x%03x\n", use_mode);
-
-  return 0;
-}
-
-GRUB_MOD_INIT
-{
-  (void)mod;                   /* To stop warning.  */
-  grub_register_command ("vbe_list_modes",
-                         grub_cmd_vbe_list_modes,
-                         GRUB_COMMAND_FLAG_BOTH,
-                         "vbe_list_modes",
-                         "List compatible VESA BIOS extension video modes.",
-                         0);
-}
-
-GRUB_MOD_FINI
-{
-  grub_unregister_command ("vbe_list_modes");
-}
diff --git a/commands/i386/pc/vbeinfo.c b/commands/i386/pc/vbeinfo.c
new file mode 100644 (file)
index 0000000..06b9b32
--- /dev/null
@@ -0,0 +1,163 @@
+/* vbeinfo.c - command to list compatible VBE video modes.  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/normal.h>
+#include <grub/dl.h>
+#include <grub/arg.h>
+#include <grub/env.h>
+#include <grub/misc.h>
+#include <grub/machine/init.h>
+#include <grub/machine/vbe.h>
+#include <grub/mm.h>
+
+static void *
+real2pm (grub_vbe_farptr_t ptr)
+{
+  return (void *) ((((unsigned long) ptr & 0xFFFF0000) >> 12UL)
+                  + ((unsigned long) ptr & 0x0000FFFF));
+}
+
+static grub_err_t
+grub_cmd_vbeinfo (struct grub_arg_list *state __attribute__ ((unused)),
+                 int argc __attribute__ ((unused)),
+                 char **args __attribute__ ((unused)))
+{
+  struct grub_vbe_info_block controller_info;
+  struct grub_vbe_mode_info_block mode_info_tmp;
+  grub_uint32_t use_mode = GRUB_VBE_DEFAULT_VIDEO_MODE;
+  grub_uint16_t *video_mode_list;
+  grub_uint16_t *p;
+  grub_uint16_t *saved_video_mode_list;
+  grub_size_t video_mode_list_size;
+  grub_err_t err;
+  char *modevar;
+
+  grub_printf ("List of compatible video modes:\n");
+
+  err = grub_vbe_probe (&controller_info);
+  if (err != GRUB_ERR_NONE)
+    return err;
+
+  /* Because the information on video modes is stored in a temporary place,
+     it is better to copy it to somewhere safe.  */
+  p = video_mode_list = real2pm (controller_info.video_mode_ptr);
+  while (*p++ != 0xFFFF)
+    ;
+  
+  video_mode_list_size = (grub_addr_t) p - (grub_addr_t) video_mode_list;
+  saved_video_mode_list = grub_malloc (video_mode_list_size);
+  if (! saved_video_mode_list)
+    return grub_errno;
+
+  grub_memcpy (saved_video_mode_list, video_mode_list, video_mode_list_size);
+  
+  /* Walk through all video modes listed.  */
+  for (p = saved_video_mode_list; *p != 0xFFFF; p++)
+    {
+      const char *memory_model = 0;
+      grub_uint32_t mode = (grub_uint32_t) *p;
+      
+      err = grub_vbe_get_video_mode_info (mode, &mode_info_tmp);
+      if (err != GRUB_ERR_NONE)
+       {
+         grub_errno = GRUB_ERR_NONE;
+         continue;
+       }
+
+      if ((mode_info_tmp.mode_attributes & 0x001) == 0)
+       /* If not available, skip it.  */
+       continue;
+
+      if ((mode_info_tmp.mode_attributes & 0x002) == 0)
+       /* Not enough information.  */
+       continue;
+
+      if ((mode_info_tmp.mode_attributes & 0x008) == 0)
+       /* Monochrome is unusable.  */
+       continue;
+
+      if ((mode_info_tmp.mode_attributes & 0x080) == 0)
+       /* We support only linear frame buffer modes.  */
+       continue;
+
+      if ((mode_info_tmp.mode_attributes & 0x010) == 0)
+       /* We allow only graphical modes.  */
+       continue;
+
+      switch (mode_info_tmp.memory_model)
+       {
+       case 0x04:
+         memory_model = "Packed Pixel";
+         break;
+       case 0x06:
+         memory_model = "Direct Color";
+         break;
+
+       default:
+         break;
+       }
+
+      if (! memory_model)
+       continue;
+
+      grub_printf ("0x%03x: %d x %d x %d bpp (%s)\n",
+                  mode,
+                   mode_info_tmp.x_resolution,
+                   mode_info_tmp.y_resolution,
+                   mode_info_tmp.bits_per_pixel,
+                  memory_model);
+    }
+
+  grub_free (saved_video_mode_list);
+  
+  /* Check existence of vbe_mode environment variable.  */
+  modevar = grub_env_get ("vbe_mode");
+
+  if (modevar != 0)
+    {
+      unsigned long value;
+
+      value = grub_strtoul (modevar, 0, 0);
+      if (grub_errno == GRUB_ERR_NONE)
+       use_mode = value;
+      else
+       grub_errno = GRUB_ERR_NONE;
+    }
+
+  grub_printf ("Configured VBE mode (vbe_mode) = 0x%03x\n", use_mode);
+
+  return 0;
+}
+
+GRUB_MOD_INIT
+{
+  (void) mod;                  /* To stop warning.  */
+  grub_register_command ("vbeinfo",
+                         grub_cmd_vbeinfo,
+                         GRUB_COMMAND_FLAG_BOTH,
+                         "vbeinfo",
+                         "List compatible VESA BIOS extension video modes.",
+                         0);
+}
+
+GRUB_MOD_FINI
+{
+  grub_unregister_command ("vbeinfo");
+}
similarity index 74%
rename from commands/i386/pc/vbe_test.c
rename to commands/i386/pc/vbetest.c
index 9bbde8dfc6dab3fbc6d1ae4aeaadd7a6042867ce..8e0a246b45a7ce46cda05d52ff8144bbc234d27f 100644 (file)
@@ -1,4 +1,4 @@
-/* vbe_test.c - command to test VESA BIOS Extension 2.0+ support.  */
+/* vbetest.c - command to test VESA BIOS Extension 2.0+ support.  */
 /*
  *  GRUB  --  GRand Unified Bootloader
  *  Copyright (C) 2005  Free Software Foundation, Inc.
 #include <grub/term.h>
 #include <grub/machine/init.h>
 #include <grub/machine/vbe.h>
-
-static void *
-real2pm(grub_vbe_farptr_t ptr)
-{
-  return (void *)((((unsigned long)ptr & 0xFFFF0000) >> 12UL)
-                  + ((unsigned long)ptr & 0x0000FFFF));
-}
+#include <grub/err.h>
 
 static grub_err_t
-grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)),
+grub_cmd_vbetest (struct grub_arg_list *state __attribute__ ((unused)),
                  int argc __attribute__ ((unused)),
                  char **args __attribute__ ((unused)))
 {
-  grub_uint32_t rc;
-  grub_uint16_t *sptr;
+  grub_err_t err;
   char *modevar;
   struct grub_vbe_mode_info_block mode_info;
   struct grub_vbe_info_block controller_info;
@@ -54,12 +47,10 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)),
   grub_printf ("Probing for VESA BIOS Extension ... ");
 
   /* Check if VESA BIOS exists.  */
-  rc = grub_vbe_probe(&controller_info);
-  if (rc != GRUB_ERR_NONE)
-    {
-      grub_printf ("not found!\n");
-      return rc;
-    }
+  err = grub_vbe_probe (&controller_info);
+  if (err != GRUB_ERR_NONE)
+    return err;
+
   grub_printf ("found!\n");
 
   /* Dump out controller information.  */
@@ -77,43 +68,31 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)),
   grub_printf ("Total memory = %d\n",
               controller_info.total_memory);
 
-  sptr = real2pm(controller_info.video_mode_ptr);
-
-  rc = grub_vbe_get_video_mode(&old_mode);
-  grub_printf ("Get video mode rc = %04x\n", rc);
-
-  if (rc == GRUB_ERR_NONE)
-    {
-      grub_printf ("Old video mode = %04x\n", old_mode);
-    }
+  err = grub_vbe_get_video_mode (&old_mode);
+  grub_printf ("Get video mode err = %04x\n", err);
 
+  if (err == GRUB_ERR_NONE)
+    grub_printf ("Old video mode = %04x\n", old_mode);
+  else
+    grub_errno = GRUB_ERR_NONE;
+  
   /* Check existence of vbe_mode environment variable.  */
   modevar = grub_env_get ("vbe_mode");
-
   if (modevar != 0)
     {
-      unsigned long value = 0;
-
-      if ((grub_strncmp (modevar, "0x", 2) == 0) ||
-         (grub_strncmp (modevar, "0X", 2) == 0))
-       {
-         /* Convert HEX mode number.  */
-         value = grub_strtoul (modevar + 2, 0, 16);
-       }
+      unsigned long value;
+
+      value = grub_strtoul (modevar, 0, 0);
+      if (grub_errno == GRUB_ERR_NONE)
+       use_mode = value;
       else
-       {
-         /* Convert DEC mode number.  */
-         value = grub_strtoul (modevar, 0, 10);
-       }
-
-      if (value != 0)
-       {
-         use_mode = value;
-       }
+       grub_errno = GRUB_ERR_NONE;
     }
 
-  rc = grub_vbe_get_video_mode_info (use_mode, &mode_info);
-
+  err = grub_vbe_get_video_mode_info (use_mode, &mode_info);
+  if (err != GRUB_ERR_NONE)
+    return err;
+  
   /* Dump out details about the mode being tested.  */
   grub_printf ("mode: 0x%03x\n",
                use_mode);
@@ -144,10 +123,12 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)),
   grub_getkey ();
 
   /* Setup GFX mode.  */
-  rc = grub_vbe_set_video_mode (use_mode, &mode_info);
+  err = grub_vbe_set_video_mode (use_mode, &mode_info);
+  if (err != GRUB_ERR_NONE)
+    return err;
 
   /* Determine framebuffer address and how many bytes are in scan line.  */
-  framebuffer = (grub_uint8_t *)mode_info.phys_base_addr;
+  framebuffer = (grub_uint8_t *) mode_info.phys_base_addr;
   ptr = framebuffer;
 
   if (controller_info.version >= 0x300)
@@ -179,21 +160,21 @@ grub_cmd_vbe_test(struct grub_arg_list *state __attribute__ ((unused)),
   /* Restore old video mode.  */
   grub_vbe_set_video_mode (old_mode, 0);
 
-  return 0;
+  return grub_errno;
 }
 
 GRUB_MOD_INIT
 {
-  (void)mod;                   /* To stop warning.  */
-  grub_register_command ("vbe_test",
-                         grub_cmd_vbe_test,
+  (void) mod;                  /* To stop warning.  */
+  grub_register_command ("vbetest",
+                         grub_cmd_vbetest,
                          GRUB_COMMAND_FLAG_BOTH,
-                         "vbe_test",
+                         "vbetest",
                          "Test VESA BIOS Extension 2.0+ support",
                          0);
 }
 
 GRUB_MOD_FINI
 {
-  grub_unregister_command ("vbe_test");
+  grub_unregister_command ("vbetest");
 }
index c013a67840a9aa7652696dffbf3c5a2d2daa1d5e..bdfbe540af7b053564890a61640052807fb5aef7 100644 (file)
@@ -1150,7 +1150,7 @@ pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod \
        terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod       \
        apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod       \
        help.mod default.mod timeout.mod configfile.mod vbe.mod         \
-       vesafb.mod vbe_test.mod vbe_list_modes.mod
+       vesafb.mod vbetest.mod vbeinfo.mod
 
 # For _chain.mod.
 _chain_mod_SOURCES = loader/i386/pc/chainloader.c
@@ -3081,105 +3081,105 @@ fs-vesafb.lst: term/i386/pc/vesafb.c genfslist.sh
 
 vesafb_mod_CFLAGS = $(COMMON_CFLAGS)
 
-# For vbe_list_modes.mod.
-vbe_list_modes_mod_SOURCES = commands/i386/pc/vbe_list_modes.c
-CLEANFILES += vbe_list_modes.mod mod-vbe_list_modes.o mod-vbe_list_modes.c pre-vbe_list_modes.o vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o def-vbe_list_modes.lst und-vbe_list_modes.lst
-MOSTLYCLEANFILES += vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.d
-DEFSYMFILES += def-vbe_list_modes.lst
-UNDSYMFILES += und-vbe_list_modes.lst
+# For vbeinfo.mod.
+vbeinfo_mod_SOURCES = commands/i386/pc/vbeinfo.c
+CLEANFILES += vbeinfo.mod mod-vbeinfo.o mod-vbeinfo.c pre-vbeinfo.o vbeinfo_mod-commands_i386_pc_vbeinfo.o def-vbeinfo.lst und-vbeinfo.lst
+MOSTLYCLEANFILES += vbeinfo_mod-commands_i386_pc_vbeinfo.d
+DEFSYMFILES += def-vbeinfo.lst
+UNDSYMFILES += und-vbeinfo.lst
 
-vbe_list_modes.mod: pre-vbe_list_modes.o mod-vbe_list_modes.o
+vbeinfo.mod: pre-vbeinfo.o mod-vbeinfo.o
        -rm -f $@
        $(LD) -r -d -o $@ $^
        $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@
 
-pre-vbe_list_modes.o: vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o
+pre-vbeinfo.o: vbeinfo_mod-commands_i386_pc_vbeinfo.o
        -rm -f $@
        $(LD) -r -d -o $@ $^
 
-mod-vbe_list_modes.o: mod-vbe_list_modes.c
-       $(CC) $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -c -o $@ $<
+mod-vbeinfo.o: mod-vbeinfo.c
+       $(CC) $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -c -o $@ $<
 
-mod-vbe_list_modes.c: moddep.lst genmodsrc.sh
-       sh $(srcdir)/genmodsrc.sh 'vbe_list_modes' $< > $@ || (rm -f $@; exit 1)
+mod-vbeinfo.c: moddep.lst genmodsrc.sh
+       sh $(srcdir)/genmodsrc.sh 'vbeinfo' $< > $@ || (rm -f $@; exit 1)
 
-def-vbe_list_modes.lst: pre-vbe_list_modes.o
-       $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbe_list_modes/' > $@
+def-vbeinfo.lst: pre-vbeinfo.o
+       $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbeinfo/' > $@
 
-und-vbe_list_modes.lst: pre-vbe_list_modes.o
-       echo 'vbe_list_modes' > $@
+und-vbeinfo.lst: pre-vbeinfo.o
+       echo 'vbeinfo' > $@
        $(NM) -u -P -p $< | cut -f1 -d' ' >> $@
 
-vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o: commands/i386/pc/vbe_list_modes.c
-       $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -c -o $@ $<
+vbeinfo_mod-commands_i386_pc_vbeinfo.o: commands/i386/pc/vbeinfo.c
+       $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -c -o $@ $<
 
-vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.d: commands/i386/pc/vbe_list_modes.c
-       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -M $<          | sed 's,vbe_list_modes\.o[ :]*,vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.o $@ : ,g' > $@;     [ -s $@ ] || rm -f $@
+vbeinfo_mod-commands_i386_pc_vbeinfo.d: commands/i386/pc/vbeinfo.c
+       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -M $<         | sed 's,vbeinfo\.o[ :]*,vbeinfo_mod-commands_i386_pc_vbeinfo.o $@ : ,g' > $@;          [ -s $@ ] || rm -f $@
 
--include vbe_list_modes_mod-commands_i386_pc_vbe_list_modes.d
+-include vbeinfo_mod-commands_i386_pc_vbeinfo.d
 
-CLEANFILES += cmd-vbe_list_modes.lst fs-vbe_list_modes.lst
-COMMANDFILES += cmd-vbe_list_modes.lst
-FSFILES += fs-vbe_list_modes.lst
+CLEANFILES += cmd-vbeinfo.lst fs-vbeinfo.lst
+COMMANDFILES += cmd-vbeinfo.lst
+FSFILES += fs-vbeinfo.lst
 
-cmd-vbe_list_modes.lst: commands/i386/pc/vbe_list_modes.c gencmdlist.sh
-       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -E $<          | sh $(srcdir)/gencmdlist.sh vbe_list_modes > $@ || (rm -f $@; exit 1)
+cmd-vbeinfo.lst: commands/i386/pc/vbeinfo.c gencmdlist.sh
+       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -E $<         | sh $(srcdir)/gencmdlist.sh vbeinfo > $@ || (rm -f $@; exit 1)
 
-fs-vbe_list_modes.lst: commands/i386/pc/vbe_list_modes.c genfslist.sh
-       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_list_modes_mod_CFLAGS) -E $<          | sh $(srcdir)/genfslist.sh vbe_list_modes > $@ || (rm -f $@; exit 1)
+fs-vbeinfo.lst: commands/i386/pc/vbeinfo.c genfslist.sh
+       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbeinfo_mod_CFLAGS) -E $<         | sh $(srcdir)/genfslist.sh vbeinfo > $@ || (rm -f $@; exit 1)
 
 
-vbe_list_modes_mod_CFLAGS = $(COMMON_CFLAGS)
+vbeinfo_mod_CFLAGS = $(COMMON_CFLAGS)
 
-# For vbe_test.mod.
-vbe_test_mod_SOURCES = commands/i386/pc/vbe_test.c
-CLEANFILES += vbe_test.mod mod-vbe_test.o mod-vbe_test.c pre-vbe_test.o vbe_test_mod-commands_i386_pc_vbe_test.o def-vbe_test.lst und-vbe_test.lst
-MOSTLYCLEANFILES += vbe_test_mod-commands_i386_pc_vbe_test.d
-DEFSYMFILES += def-vbe_test.lst
-UNDSYMFILES += und-vbe_test.lst
+# For vbetest.mod.
+vbetest_mod_SOURCES = commands/i386/pc/vbetest.c
+CLEANFILES += vbetest.mod mod-vbetest.o mod-vbetest.c pre-vbetest.o vbetest_mod-commands_i386_pc_vbetest.o def-vbetest.lst und-vbetest.lst
+MOSTLYCLEANFILES += vbetest_mod-commands_i386_pc_vbetest.d
+DEFSYMFILES += def-vbetest.lst
+UNDSYMFILES += und-vbetest.lst
 
-vbe_test.mod: pre-vbe_test.o mod-vbe_test.o
+vbetest.mod: pre-vbetest.o mod-vbetest.o
        -rm -f $@
        $(LD) -r -d -o $@ $^
        $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@
 
-pre-vbe_test.o: vbe_test_mod-commands_i386_pc_vbe_test.o
+pre-vbetest.o: vbetest_mod-commands_i386_pc_vbetest.o
        -rm -f $@
        $(LD) -r -d -o $@ $^
 
-mod-vbe_test.o: mod-vbe_test.c
-       $(CC) $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -c -o $@ $<
+mod-vbetest.o: mod-vbetest.c
+       $(CC) $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -c -o $@ $<
 
-mod-vbe_test.c: moddep.lst genmodsrc.sh
-       sh $(srcdir)/genmodsrc.sh 'vbe_test' $< > $@ || (rm -f $@; exit 1)
+mod-vbetest.c: moddep.lst genmodsrc.sh
+       sh $(srcdir)/genmodsrc.sh 'vbetest' $< > $@ || (rm -f $@; exit 1)
 
-def-vbe_test.lst: pre-vbe_test.o
-       $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbe_test/' > $@
+def-vbetest.lst: pre-vbetest.o
+       $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 vbetest/' > $@
 
-und-vbe_test.lst: pre-vbe_test.o
-       echo 'vbe_test' > $@
+und-vbetest.lst: pre-vbetest.o
+       echo 'vbetest' > $@
        $(NM) -u -P -p $< | cut -f1 -d' ' >> $@
 
-vbe_test_mod-commands_i386_pc_vbe_test.o: commands/i386/pc/vbe_test.c
-       $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -c -o $@ $<
+vbetest_mod-commands_i386_pc_vbetest.o: commands/i386/pc/vbetest.c
+       $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -c -o $@ $<
 
-vbe_test_mod-commands_i386_pc_vbe_test.d: commands/i386/pc/vbe_test.c
-       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -M $<        | sed 's,vbe_test\.o[ :]*,vbe_test_mod-commands_i386_pc_vbe_test.o $@ : ,g' > $@;       [ -s $@ ] || rm -f $@
+vbetest_mod-commands_i386_pc_vbetest.d: commands/i386/pc/vbetest.c
+       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -M $<         | sed 's,vbetest\.o[ :]*,vbetest_mod-commands_i386_pc_vbetest.o $@ : ,g' > $@;          [ -s $@ ] || rm -f $@
 
--include vbe_test_mod-commands_i386_pc_vbe_test.d
+-include vbetest_mod-commands_i386_pc_vbetest.d
 
-CLEANFILES += cmd-vbe_test.lst fs-vbe_test.lst
-COMMANDFILES += cmd-vbe_test.lst
-FSFILES += fs-vbe_test.lst
+CLEANFILES += cmd-vbetest.lst fs-vbetest.lst
+COMMANDFILES += cmd-vbetest.lst
+FSFILES += fs-vbetest.lst
 
-cmd-vbe_test.lst: commands/i386/pc/vbe_test.c gencmdlist.sh
-       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -E $<        | sh $(srcdir)/gencmdlist.sh vbe_test > $@ || (rm -f $@; exit 1)
+cmd-vbetest.lst: commands/i386/pc/vbetest.c gencmdlist.sh
+       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -E $<         | sh $(srcdir)/gencmdlist.sh vbetest > $@ || (rm -f $@; exit 1)
 
-fs-vbe_test.lst: commands/i386/pc/vbe_test.c genfslist.sh
-       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbe_test_mod_CFLAGS) -E $<        | sh $(srcdir)/genfslist.sh vbe_test > $@ || (rm -f $@; exit 1)
+fs-vbetest.lst: commands/i386/pc/vbetest.c genfslist.sh
+       set -e;           $(CC) -Icommands/i386/pc -I$(srcdir)/commands/i386/pc $(CPPFLAGS) $(CFLAGS) $(vbetest_mod_CFLAGS) -E $<         | sh $(srcdir)/genfslist.sh vbetest > $@ || (rm -f $@; exit 1)
 
 
-vbe_test_mod_CFLAGS = $(COMMON_CFLAGS)
+vbetest_mod_CFLAGS = $(COMMON_CFLAGS)
 CLEANFILES += moddep.lst command.lst fs.lst
 pkgdata_DATA += moddep.lst command.lst fs.lst
 moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep
index 3a18e1d6f3b23dddcea6c8f42a71212b4a647f7e..da1769d2d9ce5acf4291d3b6e669d04cb5a3b25f 100644 (file)
@@ -112,7 +112,7 @@ pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod   \
        terminal.mod fshelp.mod chain.mod multiboot.mod amiga.mod       \
        apple.mod pc.mod sun.mod loopback.mod reboot.mod halt.mod       \
        help.mod default.mod timeout.mod configfile.mod vbe.mod         \
-       vesafb.mod vbe_test.mod vbe_list_modes.mod
+       vesafb.mod vbetest.mod vbeinfo.mod
 
 # For _chain.mod.
 _chain_mod_SOURCES = loader/i386/pc/chainloader.c
@@ -262,10 +262,10 @@ vbe_mod_CFLAGS = $(COMMON_CFLAGS)
 vesafb_mod_SOURCES = term/i386/pc/vesafb.c
 vesafb_mod_CFLAGS = $(COMMON_CFLAGS)
 
-# For vbe_list_modes.mod.
-vbe_list_modes_mod_SOURCES = commands/i386/pc/vbe_list_modes.c
-vbe_list_modes_mod_CFLAGS = $(COMMON_CFLAGS)
+# For vbeinfo.mod.
+vbeinfo_mod_SOURCES = commands/i386/pc/vbeinfo.c
+vbeinfo_mod_CFLAGS = $(COMMON_CFLAGS)
 
-# For vbe_test.mod.
-vbe_test_mod_SOURCES = commands/i386/pc/vbe_test.c
-vbe_test_mod_CFLAGS = $(COMMON_CFLAGS)
+# For vbetest.mod.
+vbetest_mod_SOURCES = commands/i386/pc/vbetest.c
+vbetest_mod_CFLAGS = $(COMMON_CFLAGS)
index a89b8e45cc8c58a8120a5a17d4ebc8ba48284f9c..48e651673148a8304554f56e2be392473fc7dfce 100644 (file)
@@ -23,6 +23,7 @@
 #include <grub/fs.h>
 #include <grub/err.h>
 #include <grub/misc.h>
+#include <grub/mm.h>
 
 /* Print the information on the device NAME.  */
 grub_err_t
index d40c3ff5da08c90258bdffd7a31a8635eee43c53..04d39d315655d0b9c337df3e21ec94bb6018876d 100644 (file)
@@ -71,70 +71,51 @@ grub_err_t
 grub_vbe_probe (struct grub_vbe_info_block *info_block)
 {
   struct grub_vbe_info_block *vbe_ib;
-  grub_uint32_t rc;
-
+  grub_vbe_status_t status;
+  
   /* Clear caller's controller info block.  */
-  if (info_block != 0)
-    {
-      grub_memset (info_block, 0, sizeof(struct grub_vbe_info_block));
-    }
+  if (info_block)
+    grub_memset (info_block, 0, sizeof (*info_block));
 
-  /* Do not probe more than one time.  */
-  if (vbe_detected != -1)
+  /* Do not probe more than one time, if not necessary.  */
+  if (vbe_detected == -1 || info_block)
     {
-      if (vbe_detected == 1)
+      /* Clear old copy of controller info block.  */
+      grub_memset (&controller_info, 0, sizeof (controller_info));
+
+      /* Mark VESA BIOS extension as undetected.  */
+      vbe_detected = 0;
+      
+      /* Use low memory scratch area as temporary storage
+        for VESA BIOS call.  */
+      vbe_ib = (struct grub_vbe_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
+      
+      /* Prepare info block.  */
+      grub_memset (vbe_ib, 0, sizeof (*vbe_ib));
+      
+      vbe_ib->signature[0] = 'V';
+      vbe_ib->signature[1] = 'B';
+      vbe_ib->signature[2] = 'E';
+      vbe_ib->signature[3] = '2';
+      
+      /* Try to get controller info block.  */
+      status = grub_vbe_get_controller_info (vbe_ib);
+      if (status == 0x004F)
        {
-          /* Make copy of controller info block to caller.  */
-         if (info_block != 0)
-           {
-             grub_memcpy (info_block,
-                          &controller_info,
-                          sizeof(struct grub_vbe_info_block));
-           }
-         return GRUB_ERR_NONE;
+         /* Copy it for later usage.  */
+         grub_memcpy (&controller_info, vbe_ib, sizeof (controller_info));
+         
+         /* Mark VESA BIOS extension as detected.  */
+         vbe_detected = 1;
        }
-      else
-       {
-         return GRUB_ERR_BAD_DEVICE;
-       }
-    }
-
-  /* Clear old copy of controller info block.  */
-  grub_memset (&controller_info, 0, sizeof(struct grub_vbe_info_block));
-
-  /* Mark VESA BIOS extension as undetected.  */
-  vbe_detected = 0;
-
-  /* Use low memory scratch area as temporary storage for VESA BIOS call.  */
-  vbe_ib = (struct grub_vbe_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
-
-  /* Prepare info block.  */
-  grub_memset (vbe_ib, 0, sizeof(struct grub_vbe_info_block));
-
-  vbe_ib->signature[0] = 'V';
-  vbe_ib->signature[1] = 'B';
-  vbe_ib->signature[2] = 'E';
-  vbe_ib->signature[3] = '2';
-
-  /* Try to get controller info block.  */
-  rc = grub_vbe_get_controller_info (vbe_ib);
-  if (rc != 0x004F)
-    {
-      return GRUB_ERR_BAD_DEVICE;
     }
 
-  /* Copy it for later usage.  */
-  grub_memcpy (&controller_info,
-              vbe_ib,
-              sizeof(struct grub_vbe_info_block));
-
-  /* Copy it for caller.  */
-  grub_memcpy (info_block,
-              vbe_ib,
-              sizeof(struct grub_vbe_info_block));
+  if (! vbe_detected)
+    return grub_error (GRUB_ERR_BAD_DEVICE, "VESA BIOS Extension not found");
 
-  /* Mark VESA BIOS extension as detected.  */
-  vbe_detected = 1;
+  /* Make copy of controller info block to caller.  */
+  if (info_block)
+    grub_memcpy (info_block, &controller_info, sizeof (*info_block));
 
   return GRUB_ERR_NONE;
 }
@@ -143,20 +124,16 @@ grub_err_t
 grub_vbe_set_video_mode (grub_uint32_t mode,
                          struct grub_vbe_mode_info_block *mode_info)
 {
-  grub_uint32_t rc;
-
-  /* If grub_vesafb_probe has not been called or no VBE, abort.  */
-  if (vbe_detected == 0)
-    {
-      return GRUB_ERR_BAD_DEVICE;
-    }
+  grub_vbe_status_t status;
+  grub_uint32_t old_mode;
+  
+  /* Make sure that VBE is supported.  */
+  if (grub_vbe_probe (0) != GRUB_ERR_NONE)
+    return grub_errno;
 
   /* Try to get mode info.  */
-  rc = grub_vbe_get_video_mode_info (mode, &active_mode_info);
-  if (rc != GRUB_ERR_NONE)
-    {
-      return rc;
-    }
+  if (grub_vbe_get_video_mode_info (mode, &active_mode_info) != GRUB_ERR_NONE)
+    return grub_errno;
 
   /* For all VESA BIOS modes, force linear frame buffer.  */
   if (mode >= 0x100)
@@ -165,27 +142,31 @@ grub_vbe_set_video_mode (grub_uint32_t mode,
       mode |= 1 << 14;
 
       /* Determine frame buffer pixel format.  */
-      switch(active_mode_info.memory_model)
+      switch (active_mode_info.memory_model)
        {
        case 0x04:
          index_color_mode = 1;
          break;
-
+         
        case 0x06:
          index_color_mode = 0;
          break;
-
+         
        default:
-         return GRUB_ERR_BAD_DEVICE;
+         return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
+                            "unsupported pixel format 0x%x",
+                            active_mode_info.memory_model);
        }
     }
 
+  /* Get current mode.  */
+  if (grub_vbe_get_video_mode (&old_mode) != GRUB_ERR_NONE)
+    return grub_errno;
+  
   /* Try to set video mode.  */
-  rc = grub_vbe_set_mode (mode, 0);
-  if (rc != 0x004F)
-    {
-      return GRUB_ERR_BAD_DEVICE;
-    }
+  status = grub_vbe_set_mode (mode, 0);
+  if (status != 0x004F)
+    return grub_error (GRUB_ERR_BAD_DEVICE, "cannot set VBE mode %x", mode);
 
   /* Save information for later usage.  */
   active_mode = mode;
@@ -193,40 +174,43 @@ grub_vbe_set_video_mode (grub_uint32_t mode,
   if (mode < 0x100)
     {
       /* If this is not a VESA mode, guess address.  */
-      framebuffer = (grub_uint8_t *)0xA0000;
+      framebuffer = (grub_uint8_t *) 0xA0000;
       index_color_mode = 1;
     }
   else
     {
-      framebuffer = (grub_uint8_t *)active_mode_info.phys_base_addr;
+      framebuffer = (grub_uint8_t *) active_mode_info.phys_base_addr;
 
       if (controller_info.version >= 0x300)
-       {
-         bytes_per_scan_line = active_mode_info.lin_bytes_per_scan_line;
-       }
+       bytes_per_scan_line = active_mode_info.lin_bytes_per_scan_line;
       else
-       {
-         bytes_per_scan_line = active_mode_info.bytes_per_scan_line;
-       }
+       bytes_per_scan_line = active_mode_info.bytes_per_scan_line;
     }
 
   /* If video mode is in indexed color, setup default VGA palette.  */
-  if (index_color_mode != 0)
+  if (index_color_mode)
     {
-      rc = grub_vbe_set_palette_data (16, 0, vga_colors);
-      if (rc != 0x004F)
-        {
-          return GRUB_ERR_BAD_DEVICE;
-        }
+      struct grub_vbe_palette_data *palette
+       = (struct grub_vbe_palette_data *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
+
+      /* Make sure that the BIOS can reach the palette.  */
+      grub_memcpy (palette, vga_colors, sizeof (vga_colors));
+      status = grub_vbe_set_palette_data (16, 0, palette);
+
+      /* For now, ignore the status. Not sure if this is fatal.  */
+#if 0
+      if (status != 0x004F)
+       {
+         grub_vbe_set_mode (old_mode, 0);
+         return grub_error (GRUB_ERR_BAD_DEVICE,
+                            "cannot set the default VGA palette");
+       }
+#endif
     }
 
   /* Copy mode info for caller.  */
-  if (mode_info != 0)
-    {
-      grub_memcpy (mode_info,
-                   &active_mode_info,
-                   sizeof(struct grub_vbe_mode_info_block));
-    }
+  if (mode_info)
+    grub_memcpy (mode_info, &active_mode_info, sizeof (*mode_info));
 
   return GRUB_ERR_NONE;
 }
@@ -234,20 +218,16 @@ grub_vbe_set_video_mode (grub_uint32_t mode,
 grub_err_t
 grub_vbe_get_video_mode (grub_uint32_t *mode)
 {
-  grub_uint32_t rc;
+  grub_vbe_status_t status;
 
-  /* If grub_vesafb_probe has not been called or no VBE, abort.  */
-  if (vbe_detected == 0)
-    {
-      return GRUB_ERR_BAD_DEVICE;
-    }
+  /* Make sure that VBE is supported.  */
+  if (grub_vbe_probe (0) != GRUB_ERR_NONE)
+    return grub_errno;
 
   /* Try to query current mode from VESA BIOS.  */
-  rc = grub_vbe_get_mode (mode);
-  if (rc != 0x004F)
-    {
-      return GRUB_ERR_BAD_DEVICE;
-    }
+  status = grub_vbe_get_mode (mode);
+  if (status != 0x004F)
+    return grub_error (GRUB_ERR_BAD_DEVICE, "cannot get current VBE mode");
 
   return GRUB_ERR_NONE;
 }
@@ -256,37 +236,29 @@ grub_err_t
 grub_vbe_get_video_mode_info (grub_uint32_t mode,
                               struct grub_vbe_mode_info_block *mode_info)
 {
-  struct grub_vbe_mode_info_block *mi_tmp = (struct grub_vbe_mode_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
-  grub_uint32_t rc;
+  struct grub_vbe_mode_info_block *mi_tmp
+    = (struct grub_vbe_mode_info_block *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
+  grub_vbe_status_t status;
 
-  /* If grub_vesafb_probe has not been called or no VBE, abort.  */
-  if (vbe_detected == 0)
-    {
-      return GRUB_ERR_BAD_DEVICE;
-    }
+  /* Make sure that VBE is supported.  */
+  if (grub_vbe_probe (0) != GRUB_ERR_NONE)
+    return grub_errno;
 
   /* If mode is not VESA mode, skip mode info query.  */
   if (mode >= 0x100)
     {
       /* Try to get mode info from VESA BIOS.  */
-      rc = grub_vbe_get_mode_info (mode, mi_tmp);
-      if (rc != 0x004F)
-       {
-         return GRUB_ERR_BAD_DEVICE;
-       }
+      status = grub_vbe_get_mode_info (mode, mi_tmp);
+      if (status != 0x004F)
+       return grub_error (GRUB_ERR_BAD_DEVICE,
+                          "cannot get information on the mode %x", mode);
 
       /* Make copy of mode info block.  */
-      grub_memcpy (mode_info,
-                  mi_tmp,
-                  sizeof(struct grub_vbe_mode_info_block));
+      grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info));
     }
   else
-    {
-      /* Just clear mode info block if it isn't a VESA mode.  */
-      grub_memset (mode_info,
-                  0,
-                  sizeof(struct grub_vbe_mode_info_block));
-    }
+    /* Just clear mode info block if it isn't a VESA mode.  */
+    grub_memset (mode_info, 0, sizeof (*mode_info));
 
   return GRUB_ERR_NONE;
 }
@@ -327,33 +299,44 @@ grub_vbe_set_pixel_rgb (grub_uint32_t x,
       value |= blue << active_mode_info.blue_field_position;
     }
 
-  if (active_mode_info.bits_per_pixel == 32)
+  switch (active_mode_info.bits_per_pixel)
     {
-      grub_uint32_t *ptr = (grub_uint32_t *)(framebuffer
-                                            + y * bytes_per_scan_line
-                                            + x * 4);
-
-      *ptr = value;
-    }
-  else if (active_mode_info.bits_per_pixel == 24)
-    {
-      grub_uint8_t *ptr = (grub_uint8_t *)(framebuffer
-                                          + y * bytes_per_scan_line
-                                          + x * 3);
-      grub_uint8_t *ptr2 = (grub_uint8_t *)&value;
-
-      ptr[0] = ptr2[0];
-      ptr[1] = ptr2[1];
-      ptr[2] = ptr2[2];
-    }
-  else if ((active_mode_info.bits_per_pixel == 16) ||
-          (active_mode_info.bits_per_pixel == 15))
-    {
-      grub_uint16_t *ptr = (grub_uint16_t *)(framebuffer
-                                            + y * bytes_per_scan_line
-                                            + x * 2);
-
-      *ptr = (grub_uint16_t)(value & 0xFFFF);
+    case 32:
+      {
+       grub_uint32_t *ptr = (grub_uint32_t *) (framebuffer
+                                               + y * bytes_per_scan_line
+                                               + x * 4);
+       
+       *ptr = value;
+      }
+      break;
+      
+    case 24:
+      {
+       grub_uint8_t *ptr = (grub_uint8_t *) (framebuffer
+                                             + y * bytes_per_scan_line
+                                             + x * 3);
+       grub_uint8_t *ptr2 = (grub_uint8_t *) &value;
+       
+       ptr[0] = ptr2[0];
+       ptr[1] = ptr2[1];
+       ptr[2] = ptr2[2];
+      }
+      break;
+
+    case 16:
+    case 15:
+      {
+       grub_uint16_t *ptr = (grub_uint16_t *) (framebuffer
+                                               + y * bytes_per_scan_line
+                                               + x * 2);
+       
+       *ptr = (grub_uint16_t) (value & 0xFFFF);
+      }
+      break;
+
+    default:
+      break;
     }
 }
 
@@ -370,16 +353,16 @@ grub_vbe_set_pixel_index (grub_uint32_t x,
 
   if (index_color_mode == 1)
     {
-      grub_uint8_t *ptr = (grub_uint8_t *)(framebuffer
-                                          + y * bytes_per_scan_line
-                                          + x);
+      grub_uint8_t *ptr = (grub_uint8_t *) (framebuffer
+                                           + y * bytes_per_scan_line
+                                           + x);
 
       *ptr = color;
     }
   else
     {
       color &= 0x0F;
-
+      
       if (color < 16)
        {
          grub_vbe_set_pixel_rgb (x,
@@ -396,5 +379,5 @@ grub_vbe_set_pixel_index (grub_uint32_t x,
                                   0,
                                   0);
        }
-  }
+    }
 }