* grub-core/loader/i386/linux.c (grub_linux_boot): Setup video before
determining EFI memory map size.
This commit is contained in:
parent
436575581e
commit
67caf9eb06
2 changed files with 104 additions and 101 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2012-06-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/loader/i386/linux.c (grub_linux_boot): Setup video before
|
||||||
|
determining EFI memory map size.
|
||||||
|
|
||||||
2012-06-20 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-06-20 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Escape commas.
|
* grub-core/disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Escape commas.
|
||||||
|
|
|
@ -372,7 +372,6 @@ grub_linux_setup_video (struct linux_kernel_params *params)
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_linux_boot (void)
|
grub_linux_boot (void)
|
||||||
{
|
{
|
||||||
struct linux_kernel_params *params;
|
|
||||||
int e820_num;
|
int e820_num;
|
||||||
grub_err_t err = 0;
|
grub_err_t err = 0;
|
||||||
const char *modevar;
|
const char *modevar;
|
||||||
|
@ -383,11 +382,104 @@ grub_linux_boot (void)
|
||||||
grub_size_t real_size, mmap_size;
|
grub_size_t real_size, mmap_size;
|
||||||
grub_size_t cl_offset;
|
grub_size_t cl_offset;
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
{
|
||||||
|
const char *bootpath;
|
||||||
|
grub_ssize_t len;
|
||||||
|
|
||||||
|
bootpath = grub_env_get ("root");
|
||||||
|
if (bootpath)
|
||||||
|
grub_ieee1275_set_property (grub_ieee1275_chosen,
|
||||||
|
"bootpath", bootpath,
|
||||||
|
grub_strlen (bootpath) + 1,
|
||||||
|
&len);
|
||||||
|
linux_params.ofw_signature = GRUB_LINUX_OFW_SIGNATURE;
|
||||||
|
linux_params.ofw_num_items = 1;
|
||||||
|
linux_params.ofw_cif_handler = (grub_uint32_t) grub_ieee1275_entry_fn;
|
||||||
|
linux_params.ofw_idt = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
modevar = grub_env_get ("gfxpayload");
|
||||||
|
|
||||||
|
/* Now all graphical modes are acceptable.
|
||||||
|
May change in future if we have modes without framebuffer. */
|
||||||
|
if (modevar && *modevar != 0)
|
||||||
|
{
|
||||||
|
tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
|
||||||
|
if (! tmp)
|
||||||
|
return grub_errno;
|
||||||
|
#if ACCEPTS_PURE_TEXT
|
||||||
|
err = grub_video_set_mode (tmp, 0, 0);
|
||||||
|
#else
|
||||||
|
err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
|
||||||
|
#endif
|
||||||
|
grub_free (tmp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if ACCEPTS_PURE_TEXT
|
||||||
|
err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0, 0);
|
||||||
|
#else
|
||||||
|
err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
|
||||||
|
GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
grub_print_error ();
|
||||||
|
grub_puts_ (N_("Booting in blind mode"));
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_linux_setup_video (&linux_params))
|
||||||
|
{
|
||||||
|
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
|
||||||
|
linux_params.have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
|
||||||
|
linux_params.video_mode = 0x3;
|
||||||
|
#else
|
||||||
|
linux_params.have_vga = 0;
|
||||||
|
linux_params.video_mode = 0;
|
||||||
|
linux_params.video_width = 0;
|
||||||
|
linux_params.video_height = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GRUB_MACHINE_IEEE1275
|
||||||
|
if (linux_params.have_vga == GRUB_VIDEO_LINUX_TYPE_TEXT)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
grub_term_output_t term;
|
||||||
|
int found = 0;
|
||||||
|
FOR_ACTIVE_TERM_OUTPUTS(term)
|
||||||
|
if (grub_strcmp (term->name, "vga_text") == 0
|
||||||
|
|| grub_strcmp (term->name, "console") == 0
|
||||||
|
|| grub_strcmp (term->name, "ofconsole") == 0)
|
||||||
|
{
|
||||||
|
grub_uint16_t pos = grub_term_getxy (term);
|
||||||
|
linux_params.video_cursor_x = pos >> 8;
|
||||||
|
linux_params.video_cursor_y = pos & 0xff;
|
||||||
|
linux_params.video_width = grub_term_width (term);
|
||||||
|
linux_params.video_height = grub_term_height (term);
|
||||||
|
found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
linux_params.video_cursor_x = 0;
|
||||||
|
linux_params.video_cursor_y = 0;
|
||||||
|
linux_params.video_width = 80;
|
||||||
|
linux_params.video_height = 25;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mmap_size = find_mmap_size ();
|
mmap_size = find_mmap_size ();
|
||||||
/* Make sure that each size is aligned to a page boundary. */
|
/* Make sure that each size is aligned to a page boundary. */
|
||||||
cl_offset = ALIGN_UP (mmap_size + sizeof (*params), 4096);
|
cl_offset = ALIGN_UP (mmap_size + sizeof (linux_params), 4096);
|
||||||
if (cl_offset < ((grub_size_t) params->setup_sects << GRUB_DISK_SECTOR_BITS))
|
if (cl_offset < ((grub_size_t) linux_params.setup_sects << GRUB_DISK_SECTOR_BITS))
|
||||||
cl_offset = ALIGN_UP ((grub_size_t) (params->setup_sects
|
cl_offset = ALIGN_UP ((grub_size_t) (linux_params.setup_sects
|
||||||
<< GRUB_DISK_SECTOR_BITS), 4096);
|
<< GRUB_DISK_SECTOR_BITS), 4096);
|
||||||
real_size = ALIGN_UP (cl_offset + maximal_cmdline_size, 4096);
|
real_size = ALIGN_UP (cl_offset + maximal_cmdline_size, 4096);
|
||||||
|
|
||||||
|
@ -459,6 +551,9 @@ grub_linux_boot (void)
|
||||||
|
|
||||||
grub_dprintf ("linux", "real_mode_mem = %lx\n",
|
grub_dprintf ("linux", "real_mode_mem = %lx\n",
|
||||||
(unsigned long) real_mode_mem);
|
(unsigned long) real_mode_mem);
|
||||||
|
|
||||||
|
struct linux_kernel_params *params;
|
||||||
|
|
||||||
params = real_mode_mem;
|
params = real_mode_mem;
|
||||||
|
|
||||||
*params = linux_params;
|
*params = linux_params;
|
||||||
|
@ -466,20 +561,6 @@ grub_linux_boot (void)
|
||||||
grub_memcpy ((char *) params + cl_offset, linux_cmdline,
|
grub_memcpy ((char *) params + cl_offset, linux_cmdline,
|
||||||
maximal_cmdline_size);
|
maximal_cmdline_size);
|
||||||
|
|
||||||
#ifdef GRUB_MACHINE_IEEE1275
|
|
||||||
{
|
|
||||||
const char *bootpath;
|
|
||||||
grub_ssize_t len;
|
|
||||||
|
|
||||||
bootpath = grub_env_get ("root");
|
|
||||||
if (bootpath)
|
|
||||||
grub_ieee1275_set_property (grub_ieee1275_chosen,
|
|
||||||
"bootpath", bootpath,
|
|
||||||
grub_strlen (bootpath) + 1,
|
|
||||||
&len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
grub_dprintf ("linux", "code32_start = %x\n",
|
grub_dprintf ("linux", "code32_start = %x\n",
|
||||||
(unsigned) params->code32_start);
|
(unsigned) params->code32_start);
|
||||||
|
|
||||||
|
@ -522,89 +603,6 @@ grub_linux_boot (void)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
params->mmap_size = e820_num;
|
params->mmap_size = e820_num;
|
||||||
|
|
||||||
modevar = grub_env_get ("gfxpayload");
|
|
||||||
|
|
||||||
/* Now all graphical modes are acceptable.
|
|
||||||
May change in future if we have modes without framebuffer. */
|
|
||||||
if (modevar && *modevar != 0)
|
|
||||||
{
|
|
||||||
tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
|
|
||||||
if (! tmp)
|
|
||||||
return grub_errno;
|
|
||||||
#if ACCEPTS_PURE_TEXT
|
|
||||||
err = grub_video_set_mode (tmp, 0, 0);
|
|
||||||
#else
|
|
||||||
err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
|
|
||||||
#endif
|
|
||||||
grub_free (tmp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#if ACCEPTS_PURE_TEXT
|
|
||||||
err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0, 0);
|
|
||||||
#else
|
|
||||||
err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
|
|
||||||
GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (err)
|
|
||||||
{
|
|
||||||
grub_print_error ();
|
|
||||||
grub_puts_ (N_("Booting in blind mode"));
|
|
||||||
grub_errno = GRUB_ERR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (grub_linux_setup_video (params))
|
|
||||||
{
|
|
||||||
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
|
|
||||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
|
|
||||||
params->video_mode = 0x3;
|
|
||||||
#else
|
|
||||||
params->have_vga = 0;
|
|
||||||
params->video_mode = 0;
|
|
||||||
params->video_width = 0;
|
|
||||||
params->video_height = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize these last, because terminal position could be affected by printfs above. */
|
|
||||||
#ifndef GRUB_MACHINE_IEEE1275
|
|
||||||
if (params->have_vga == GRUB_VIDEO_LINUX_TYPE_TEXT)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
grub_term_output_t term;
|
|
||||||
int found = 0;
|
|
||||||
FOR_ACTIVE_TERM_OUTPUTS(term)
|
|
||||||
if (grub_strcmp (term->name, "vga_text") == 0
|
|
||||||
|| grub_strcmp (term->name, "console") == 0
|
|
||||||
|| grub_strcmp (term->name, "ofconsole") == 0)
|
|
||||||
{
|
|
||||||
grub_uint16_t pos = grub_term_getxy (term);
|
|
||||||
params->video_cursor_x = pos >> 8;
|
|
||||||
params->video_cursor_y = pos & 0xff;
|
|
||||||
params->video_width = grub_term_width (term);
|
|
||||||
params->video_height = grub_term_height (term);
|
|
||||||
found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
params->video_cursor_x = 0;
|
|
||||||
params->video_cursor_y = 0;
|
|
||||||
params->video_width = 80;
|
|
||||||
params->video_height = 25;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef GRUB_MACHINE_IEEE1275
|
|
||||||
{
|
|
||||||
params->ofw_signature = GRUB_LINUX_OFW_SIGNATURE;
|
|
||||||
params->ofw_num_items = 1;
|
|
||||||
params->ofw_cif_handler = (grub_uint32_t) grub_ieee1275_entry_fn;
|
|
||||||
params->ofw_idt = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GRUB_MACHINE_EFI
|
#ifdef GRUB_MACHINE_EFI
|
||||||
{
|
{
|
||||||
grub_efi_uintn_t efi_desc_size;
|
grub_efi_uintn_t efi_desc_size;
|
||||||
|
|
Loading…
Reference in a new issue