+2009-05-04 Robert Millan <rmh.grub@aybabtu.com>
+
+ * loader/i386/linux.c (GRUB_ASSUME_LINUX_HAS_FB_SUPPORT): New macro.
+ (grub_linux_boot): Don't check for `linux_vesafb_modes' bounds (this
+ is done by grub_cmd_linux() now).
+ [! GRUB_ASSUME_LINUX_HAS_FB_SUPPORT]: If "vga=" parameter wasn't set,
+ restore video to text mode.
+ (grub_cmd_linux): Default `vid_mode' initialization to 0, which
+ indicates lack of "vga=" parameter. "vga=0" is mapped to
+ `GRUB_LINUX_VID_MODE_NORMAL'.
+
2009-05-04 Felix Zielcke <fzielcke@z-51.de>
* conf/i386-efi.rmk (grub_emu_SOURCES): Remove `normal/execute.c',
#define GRUB_LINUX_CL_OFFSET 0x1000
#define GRUB_LINUX_CL_END_OFFSET 0x2000
+/* This macro is useful for distributors, who can be certain they built FB support
+ into Linux, and therefore can benefit from seamless mode transition between
+ GRUB and Linux (saving boot time and visual glitches). Official GRUB, OTOH,
+ needs to be conservative. */
+#ifndef GRUB_ASSUME_LINUX_HAS_FB_SUPPORT
+#define GRUB_ASSUME_LINUX_HAS_FB_SUPPORT 0
+#endif
+
static grub_dl_t my_mod;
static grub_size_t linux_mem_size;
params = real_mode_mem;
- 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_LINUX_VID_MODE_NORMAL || vid_mode == GRUB_LINUX_VID_MODE_EXTENDED)
grub_video_restore ();
else if (vid_mode)
{
return grub_errno;
}
}
+#if ! GRUB_ASSUME_LINUX_HAS_FB_SUPPORT
+ else
+ /* If user didn't request a video mode, and we can't assume Linux supports FB,
+ then we go back to text mode. */
+ grub_video_restore ();
+#endif
if (! grub_linux_setup_video (params))
params->have_vga = GRUB_VIDEO_TYPE_VLFB;
(unsigned) real_size, (unsigned) prot_size);
/* Look for memory size and video mode specified on the command line. */
- vid_mode = GRUB_LINUX_VID_MODE_NORMAL;
+ vid_mode = 0;
linux_mem_size = 0;
for (i = 1; i < argc; i++)
if (grub_memcmp (argv[i], "vga=", 4) == 0)
else
vid_mode = (grub_uint16_t) grub_strtoul (val, 0, 0);
+ switch (vid_mode)
+ {
+ case 0:
+ vid_mode = GRUB_LINUX_VID_MODE_NORMAL;
+ break;
+ case 1:
+ vid_mode = GRUB_LINUX_VID_MODE_EXTENDED;
+ 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))
+ vid_mode = 0;
+ }
+
if (grub_errno)
goto fail;
}