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.
This commit is contained in:
parent
8cf83a279b
commit
14aad8072c
2 changed files with 56 additions and 4 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
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>
|
2009-03-14 Robert Millan <rmh@aybabtu.com>
|
||||||
|
|
||||||
Fix build on powerpc.
|
Fix build on powerpc.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* 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
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -30,6 +30,10 @@
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
#include <grub/term.h>
|
#include <grub/term.h>
|
||||||
#include <grub/cpu/linux.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_OFFSET 0x1000
|
||||||
#define GRUB_LINUX_CL_END_OFFSET 0x2000
|
#define GRUB_LINUX_CL_END_OFFSET 0x2000
|
||||||
|
@ -215,6 +219,41 @@ grub_e820_add_region (struct grub_e820_mmap *e820_map, int *e820_num,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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__
|
#ifdef __x86_64__
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -231,6 +270,9 @@ grub_linux32_boot (void)
|
||||||
|
|
||||||
params = real_mode_mem;
|
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",
|
grub_dprintf ("linux", "code32_start = %x, idt_desc = %lx, gdt_desc = %lx\n",
|
||||||
(unsigned) params->code32_start,
|
(unsigned) params->code32_start,
|
||||||
(unsigned long) &(idt_desc.limit),
|
(unsigned long) &(idt_desc.limit),
|
||||||
|
@ -314,7 +356,6 @@ grub_rescue_cmd_linux (int argc, char *argv[])
|
||||||
grub_ssize_t len;
|
grub_ssize_t len;
|
||||||
int i;
|
int i;
|
||||||
char *dest;
|
char *dest;
|
||||||
int video_type;
|
|
||||||
|
|
||||||
grub_dl_ref (my_mod);
|
grub_dl_ref (my_mod);
|
||||||
|
|
||||||
|
@ -422,7 +463,6 @@ grub_rescue_cmd_linux (int argc, char *argv[])
|
||||||
|
|
||||||
/* Detect explicitly specified memory size, if any. */
|
/* Detect explicitly specified memory size, if any. */
|
||||||
linux_mem_size = 0;
|
linux_mem_size = 0;
|
||||||
video_type = 0;
|
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < argc; i++)
|
||||||
if (grub_memcmp (argv[i], "mem=", 4) == 0)
|
if (grub_memcmp (argv[i], "mem=", 4) == 0)
|
||||||
{
|
{
|
||||||
|
@ -481,7 +521,8 @@ grub_rescue_cmd_linux (int argc, char *argv[])
|
||||||
|
|
||||||
if (grub_errno == GRUB_ERR_NONE)
|
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;
|
loaded = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue