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".
This commit is contained in:
parent
761319cfd3
commit
1007d1f562
4 changed files with 21 additions and 6 deletions
10
ChangeLog
10
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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue