+2009-03-18 Robert Millan <rmh@aybabtu.com>
+
+ * loader/i386/linux.c: Include `<grub/video.h>' and
+ `<grub/i386/pc/vbe.h>'..
+ (grub_linux_setup_video): New function. Loosely based on the EFI one.
+ (grub_linux32_boot): Attempt to configure video settings with
+ grub_linux_setup_video().
+ (grub_rescue_cmd_linux): Set noreturn=0 in grub_loader_set, in order
+ to avoid grub_console_fini() which would step out of graphical mode
+ unconditionally.
+
2009-03-14 Robert Millan <rmh@aybabtu.com>
Fix build on powerpc.
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc.
+ * Copyright (C) 2006,2007,2008,2009 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
#include <grub/mm.h>
#include <grub/term.h>
#include <grub/cpu/linux.h>
+#include <grub/video.h>
+/* FIXME: the definition of `struct grub_video_render_target' is
+ VBE-specific. */
+#include <grub/i386/pc/vbe.h>
#define GRUB_LINUX_CL_OFFSET 0x1000
#define GRUB_LINUX_CL_END_OFFSET 0x2000
}
}
+static int
+grub_linux_setup_video (struct linux_kernel_params *params)
+{
+ struct grub_video_mode_info mode_info;
+ struct grub_video_render_target *render_target;
+ int ret;
+
+ ret = grub_video_get_info (&mode_info);
+ if (ret)
+ return 1;
+
+ ret = grub_video_get_active_render_target (&render_target);
+ if (ret)
+ return 1;
+
+ params->lfb_width = mode_info.width;
+ params->lfb_height = mode_info.height;
+ params->lfb_depth = mode_info.bpp;
+ params->lfb_line_len = mode_info.pitch;
+
+ params->lfb_base = (void *) render_target->data;
+ params->lfb_size = (params->lfb_line_len * params->lfb_height + 65535) >> 16;
+
+ params->red_mask_size = 8;
+ params->red_field_pos = 16;
+ params->green_mask_size = 8;
+ params->green_field_pos = 8;
+ params->blue_mask_size = 8;
+ params->blue_field_pos = 0;
+ params->reserved_mask_size = 8;
+ params->reserved_field_pos = 24;
+
+ return 0;
+}
+
#ifdef __x86_64__
struct
{
params = real_mode_mem;
+ if (! grub_linux_setup_video (params))
+ params->have_vga = GRUB_VIDEO_TYPE_VLFB;
+
grub_dprintf ("linux", "code32_start = %x, idt_desc = %lx, gdt_desc = %lx\n",
(unsigned) params->code32_start,
(unsigned long) &(idt_desc.limit),
grub_ssize_t len;
int i;
char *dest;
- int video_type;
grub_dl_ref (my_mod);
/* Detect explicitly specified memory size, if any. */
linux_mem_size = 0;
- video_type = 0;
for (i = 1; i < argc; i++)
if (grub_memcmp (argv[i], "mem=", 4) == 0)
{
if (grub_errno == GRUB_ERR_NONE)
{
- grub_loader_set (grub_linux32_boot, grub_linux_unload, 1);
+ grub_loader_set (grub_linux32_boot, grub_linux_unload,
+ 0 /* set noreturn=0 in order to avoid grub_console_fini() */);
loaded = 1;
}