From 67caf9eb064be6f1e740b5544498d8c34bb7c681 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Wed, 20 Jun 2012 23:39:33 +0200 Subject: [PATCH] * grub-core/loader/i386/linux.c (grub_linux_boot): Setup video before determining EFI memory map size. --- ChangeLog | 5 + grub-core/loader/i386/linux.c | 200 +++++++++++++++++----------------- 2 files changed, 104 insertions(+), 101 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ef11caba..e10dcd072 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-06-20 Vladimir Serbinenko + + * grub-core/loader/i386/linux.c (grub_linux_boot): Setup video before + determining EFI memory map size. + 2012-06-20 Vladimir Serbinenko * grub-core/disk/ieee1275/ofdisk.c (grub_ofdisk_iterate): Escape commas. diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c index 6e8238eec..07a9e3702 100644 --- a/grub-core/loader/i386/linux.c +++ b/grub-core/loader/i386/linux.c @@ -372,7 +372,6 @@ grub_linux_setup_video (struct linux_kernel_params *params) static grub_err_t grub_linux_boot (void) { - struct linux_kernel_params *params; int e820_num; grub_err_t err = 0; const char *modevar; @@ -383,11 +382,104 @@ grub_linux_boot (void) grub_size_t real_size, mmap_size; 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 (); /* Make sure that each size is aligned to a page boundary. */ - cl_offset = ALIGN_UP (mmap_size + sizeof (*params), 4096); - if (cl_offset < ((grub_size_t) params->setup_sects << GRUB_DISK_SECTOR_BITS)) - cl_offset = ALIGN_UP ((grub_size_t) (params->setup_sects + cl_offset = ALIGN_UP (mmap_size + sizeof (linux_params), 4096); + if (cl_offset < ((grub_size_t) linux_params.setup_sects << GRUB_DISK_SECTOR_BITS)) + cl_offset = ALIGN_UP ((grub_size_t) (linux_params.setup_sects << GRUB_DISK_SECTOR_BITS), 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", (unsigned long) real_mode_mem); + + struct linux_kernel_params *params; + params = real_mode_mem; *params = linux_params; @@ -466,20 +561,6 @@ grub_linux_boot (void) grub_memcpy ((char *) params + cl_offset, linux_cmdline, 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", (unsigned) params->code32_start); @@ -522,89 +603,6 @@ grub_linux_boot (void) return grub_errno; 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 { grub_efi_uintn_t efi_desc_size;