From 1007d1f5627be46c9ebfec12620cbbcae3960c97 Mon Sep 17 00:00:00 2001 From: proski Date: Tue, 7 Apr 2009 00:48:57 +0000 Subject: [PATCH] 2009-04-06 Pavel Roskin * 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 | 10 ++++++++++ include/grub/i386/linux.h | 1 + include/grub/misc.h | 1 + loader/i386/linux.c | 15 +++++++++------ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 62115be13..ff629413c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2009-04-06 Pavel Roskin + * 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. diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h index d5b520729..dad38e545 100644 --- a/include/grub/i386/linux.h +++ b/include/grub/i386/linux.h @@ -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 diff --git a/include/grub/misc.h b/include/grub/misc.h index c377c20a2..3490db0d5 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -26,6 +26,7 @@ #include #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. */ diff --git a/loader/i386/linux.c b/loader/i386/linux.c index a2fff83fa..01d10d598 100644 --- a/loader/i386/linux.c +++ b/loader/i386/linux.c @@ -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);