mansection = 1;
common = util/grub-menulst2cfg.c;
common = grub-core/lib/legacy_parse.c;
+ common = grub-core/lib/i386/pc/vesa_modes_table.c;
+
ldadd = libgrub.a;
ldflags = '$(LIBDEVMAPPER)';
};
module = {
name = linux;
x86 = loader/i386/linux.c;
+ i386_pc = lib/i386/pc/vesa_modes_table.c;
mips = loader/mips/linux.c;
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
--- /dev/null
+
+#include <grub/i386/pc/vesa_modes_table.h>
+
+/* This is the reverse of the table in [linux]/Documentation/fb/vesafb.txt
+ plus a few more modes based on the table in
+ http://en.wikipedia.org/wiki/VESA_BIOS_Extensions */
+struct grub_vesa_mode_table_entry
+grub_vesa_mode_table[GRUB_VESA_MODE_TABLE_END
+ - GRUB_VESA_MODE_TABLE_START + 1] =
+ {
+ { 640, 400, 8 }, /* 0x300 */
+ { 640, 480, 8 }, /* 0x301 */
+ { 800, 600, 4 }, /* 0x302 */
+ { 800, 600, 8 }, /* 0x303 */
+ { 1024, 768, 4 }, /* 0x304 */
+ { 1024, 768, 8 }, /* 0x305 */
+ { 1280, 1024, 4 }, /* 0x306 */
+ { 1280, 1024, 8 }, /* 0x307 */
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 320, 200, 15 }, /* 0x30d */
+ { 320, 200, 16 }, /* 0x30e */
+ { 320, 200, 24 }, /* 0x30f */
+ { 640, 480, 15 }, /* 0x310 */
+ { 640, 480, 16 }, /* 0x311 */
+ { 640, 480, 24 }, /* 0x312 */
+ { 800, 600, 15 }, /* 0x313 */
+ { 800, 600, 16 }, /* 0x314 */
+ { 800, 600, 24 }, /* 0x315 */
+ { 1024, 768, 15 }, /* 0x316 */
+ { 1024, 768, 16 }, /* 0x317 */
+ { 1024, 768, 24 }, /* 0x318 */
+ { 1280, 1024, 15 }, /* 0x319 */
+ { 1280, 1024, 16 }, /* 0x31a */
+ { 1280, 1024, 24 }, /* 0x31b */
+ { 1600, 1200, 8 }, /* 0x31c */
+ { 1600, 1200, 15 }, /* 0x31d */
+ { 1600, 1200, 16 }, /* 0x31e */
+ { 1600, 1200, 24 }, /* 0x31f */
+ { 0, 0, 0 },
+ { 640, 400, 15 }, /* 0x321 */
+ { 640, 400, 16 }, /* 0x322 */
+ { 640, 400, 24 }, /* 0x323 */
+ { 640, 400, 32 }, /* 0x324 */
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 640, 480, 32 }, /* 0x329 */
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 896, 672, 8 }, /* 0x32f */
+ { 896, 672, 15 }, /* 0x330 */
+ { 896, 672, 16 }, /* 0x331 */
+ { 896, 672, 24 }, /* 0x332 */
+ { 896, 672, 32 }, /* 0x333 */
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 1600, 1200, 32 }, /* 0x342 */
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 0, 0, 0 },
+ { 1440, 900, 8 }, /* 0x360 */
+ { 1440, 900, 15 }, /* 0x361 */
+ { 1440, 900, 16 }, /* 0x362 */
+ { 1440, 900, 24 }, /* 0x363 */
+ { 1440, 900, 32 }, /* 0x364 */
+ { 1152, 720, 8 }, /* 0x365 */
+ { 1152, 720, 15 }, /* 0x366 */
+ { 1152, 720, 16 }, /* 0x367 */
+ { 1152, 720, 24 }, /* 0x368 */
+ { 1152, 720, 32 }, /* 0x369 */
+ { 1024, 640, 8 }, /* 0x36a */
+ { 1024, 640, 15 }, /* 0x36b */
+ { 1024, 640, 16 }, /* 0x36c */
+ { 1024, 640, 24 }, /* 0x36d */
+ { 1024, 640, 32 }, /* 0x36e */
+ { 800, 500, 8 }, /* 0x36f */
+ { 800, 500, 15 }, /* 0x370 */
+ { 800, 500, 16 }, /* 0x371 */
+ { 800, 500, 24 }, /* 0x372 */
+ { 800, 500, 32 }, /* 0x373 */
+ };
#include <grub/mm.h>
#include <grub/err.h>
#include <grub/legacy_parse.h>
+#include <grub/i386/pc/vesa_modes_table.h>
struct legacy_command
{
TYPE_PARTITION,
TYPE_BOOL,
TYPE_INT,
- TYPE_REST_VERBATIM
+ TYPE_REST_VERBATIM,
+ TYPE_VBE_MODE
} argt[4];
enum {
FLAG_IGNORE_REST = 1,
" compares them, to test the filesystem code. "
" If this test succeeds, then a good next"
" step is to try loading a kernel."},
- /* FIXME: testvbe unsupported. */
+ {"testvbe", "insmod vbe; videotest '%s'\n", NULL, 0, 1, {TYPE_VBE_MODE}, 0,
+ "MODE", "Test the VBE mode MODE. Hit any key to return."},
/* FIXME: tftpserver unsupported. */
{"timeout", "set timeout=%s\n", NULL, 0, 1, {TYPE_INT}, 0, "SEC",
"Set a timeout, in SEC seconds, before automatically booting the"
{"uuid", "search --set=root --fs-uuid '%s'\n", NULL, 0, 1, {TYPE_VERBATIM},
0, "UUID", "Find root by UUID"},
/* FIXME: support MODE. */
- {"vbeprobe", "vbeinfo\n", NULL, 0, 0, {}, 0, "[MODE]",
+ {"vbeprobe", "insmod vbe; videoinfo\n", NULL, 0, 0, {}, 0, "[MODE]",
"Probe VBE information. If the mode number MODE is specified, show only"
" the information about only the mode."}
};
args[i] = grub_strndup (curarg, brk - curarg);
}
break;
+ case TYPE_VBE_MODE:
+ {
+ unsigned mod;
+ struct grub_vesa_mode_table_entry *modedesc;
+
+ mod = grub_strtoul (curarg, 0, 0);
+ if (grub_errno)
+ {
+ mod = 0;
+ grub_errno = GRUB_ERR_NONE;
+ }
+ if (mod < GRUB_VESA_MODE_TABLE_START
+ || mod > GRUB_VESA_MODE_TABLE_END)
+ {
+ args[i] = grub_strdup ("auto");
+ break;
+ }
+ modedesc = &grub_vesa_mode_table[mod - GRUB_VESA_MODE_TABLE_START];
+ if (!modedesc->width)
+ {
+ args[i] = grub_strdup ("auto");
+ break;
+ }
+ args[i] = grub_xasprintf ("%ux%ux%u",
+ modedesc->width, modedesc->height,
+ modedesc->depth);
+ break;
+ }
case TYPE_BOOL:
if (curarglen == 2 && curarg[0] == 'o' && curarg[1] == 'n')
args[i] = grub_strdup ("1");
case TYPE_BOOL:
case TYPE_INT:
args[i] = grub_strdup ("0");
- break;
+ break;
+ case TYPE_VBE_MODE:
+ args[i] = grub_strdup ("auto");
+ break;
}
if (legacy_commands[cmdnum].flags & FLAG_COLOR_INVERT)
#include <grub/i386/relocator.h>
#include <grub/i18n.h>
+#ifdef GRUB_MACHINE_PCBIOS
+#include <grub/i386/pc/vesa_modes_table.h>
+#endif
+
#ifdef GRUB_MACHINE_EFI
#include <grub/efi/efi.h>
#define HAS_VGA_TEXT 0
};
#endif
-#ifdef GRUB_MACHINE_PCBIOS
-struct linux_vesafb_res
-{
- grub_uint16_t width;
- grub_uint16_t height;
-};
-
-struct linux_vesafb_mode
-{
- grub_uint8_t res_index;
- grub_uint8_t depth;
-};
-
-enum vga_modes
- {
- VGA_320_200,
- VGA_640_400,
- VGA_640_480,
- VGA_800_500,
- VGA_800_600,
- VGA_896_672,
- VGA_1024_640,
- VGA_1024_768,
- VGA_1152_720,
- VGA_1280_1024,
- VGA_1440_900,
- VGA_1600_1200,
- };
-
-static struct linux_vesafb_res linux_vesafb_res[] =
- {
- { 320, 200 },
- { 640, 400 },
- { 640, 480 },
- { 800, 500 },
- { 800, 600 },
- { 896, 672 },
- { 1024, 640 },
- { 1024, 768 },
- { 1152, 720 },
- { 1280, 1024 },
- { 1440, 900 },
- { 1600, 1200 },
- };
-
-/* This is the reverse of the table in [linux]/Documentation/fb/vesafb.txt
- plus a few more modes based on the table in
- http://en.wikipedia.org/wiki/VESA_BIOS_Extensions */
-struct linux_vesafb_mode linux_vesafb_modes[] =
- {
- { VGA_640_400, 8 }, /* 0x300 */
- { VGA_640_480, 8 }, /* 0x301 */
- { VGA_800_600, 4 }, /* 0x302 */
- { VGA_800_600, 8 }, /* 0x303 */
- { VGA_1024_768, 4 }, /* 0x304 */
- { VGA_1024_768, 8 }, /* 0x305 */
- { VGA_1280_1024, 4 }, /* 0x306 */
- { VGA_1280_1024, 8 }, /* 0x307 */
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { VGA_320_200, 15 }, /* 0x30d */
- { VGA_320_200, 16 }, /* 0x30e */
- { VGA_320_200, 24 }, /* 0x30f */
- { VGA_640_480, 15 }, /* 0x310 */
- { VGA_640_480, 16 }, /* 0x311 */
- { VGA_640_480, 24 }, /* 0x312 */
- { VGA_800_600, 15 }, /* 0x313 */
- { VGA_800_600, 16 }, /* 0x314 */
- { VGA_800_600, 24 }, /* 0x315 */
- { VGA_1024_768, 15 }, /* 0x316 */
- { VGA_1024_768, 16 }, /* 0x317 */
- { VGA_1024_768, 24 }, /* 0x318 */
- { VGA_1280_1024, 15 }, /* 0x319 */
- { VGA_1280_1024, 16 }, /* 0x31a */
- { VGA_1280_1024, 24 }, /* 0x31b */
- { VGA_1600_1200, 8 }, /* 0x31c */
- { VGA_1600_1200, 15 }, /* 0x31d */
- { VGA_1600_1200, 16 }, /* 0x31e */
- { VGA_1600_1200, 24 }, /* 0x31f */
- { 0, 0 },
- { VGA_640_400, 15 }, /* 0x321 */
- { VGA_640_400, 16 }, /* 0x322 */
- { VGA_640_400, 24 }, /* 0x323 */
- { VGA_640_400, 32 }, /* 0x324 */
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { VGA_640_480, 32 }, /* 0x329 */
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { VGA_896_672, 8 }, /* 0x32f */
- { VGA_896_672, 15 }, /* 0x330 */
- { VGA_896_672, 16 }, /* 0x331 */
- { VGA_896_672, 24 }, /* 0x332 */
- { VGA_896_672, 32 }, /* 0x333 */
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { VGA_1600_1200, 32 }, /* 0x342 */
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { 0, 0 },
- { VGA_1440_900, 8 }, /* 0x360 */
- { VGA_1440_900, 15 }, /* 0x361 */
- { VGA_1440_900, 16 }, /* 0x362 */
- { VGA_1440_900, 24 }, /* 0x363 */
- { VGA_1440_900, 32 }, /* 0x364 */
- { VGA_1152_720, 8 }, /* 0x365 */
- { VGA_1152_720, 15 }, /* 0x366 */
- { VGA_1152_720, 16 }, /* 0x367 */
- { VGA_1152_720, 24 }, /* 0x368 */
- { VGA_1152_720, 32 }, /* 0x369 */
- { VGA_1024_640, 8 }, /* 0x36a */
- { VGA_1024_640, 15 }, /* 0x36b */
- { VGA_1024_640, 16 }, /* 0x36c */
- { VGA_1024_640, 24 }, /* 0x36d */
- { VGA_1024_640, 32 }, /* 0x36e */
- { VGA_800_500, 8 }, /* 0x36f */
- { VGA_800_500, 15 }, /* 0x370 */
- { VGA_800_500, 16 }, /* 0x371 */
- { VGA_800_500, 24 }, /* 0x372 */
- { VGA_800_500, 32 }, /* 0x373 */
- };
-#endif
-
static inline grub_size_t
page_align (grub_size_t size)
{
/* Video mode selection support. */
char *val = argv[i] + 4;
unsigned vid_mode = GRUB_LINUX_VID_MODE_NORMAL;
- struct linux_vesafb_mode *linux_mode;
+ struct grub_vesa_mode_table_entry *linux_mode;
grub_err_t err;
char *buf;
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))
+ if (vid_mode < GRUB_VESA_MODE_TABLE_START ||
+ vid_mode > GRUB_VESA_MODE_TABLE_END)
{
grub_env_set ("gfxpayload", "text");
grub_printf ("%s is deprecated. Mode %d isn't recognized. "
is built-in because `vga=' parameter was used. */
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
- linux_mode
- = &linux_vesafb_modes[vid_mode - GRUB_LINUX_VID_MODE_VESA_START];
+ linux_mode = &grub_vesa_mode_table[vid_mode
+ - GRUB_VESA_MODE_TABLE_START];
buf = grub_xasprintf ("%ux%ux%u,%ux%u",
- linux_vesafb_res[linux_mode->res_index].width,
- linux_vesafb_res[linux_mode->res_index].height,
+ linux_mode->width, linux_mode->height,
linux_mode->depth,
- linux_vesafb_res[linux_mode->res_index].width,
- linux_vesafb_res[linux_mode->res_index].height);
+ linux_mode->width, linux_mode->height);
if (! buf)
goto fail;