On 11.06.2012 22:10, stuart_ha...@dell.com wrote: >> >> It looks like the problem is that we set video mode. Other than that we >> do only mmap iterating and allocating the memory in question. How about >> this patch (not tested): >> === modified file 'grub-core/loader/i386/linux.c' >> --- grub-core/loader/i386/linux.c 2012-05-31 12:06:11 +0000 >> +++ grub-core/loader/i386/linux.c 2012-06-11 19:27:48 +0000 >> @@ -383,6 +383,103 @@ >> grub_size_t real_size, mmap_size; >> grub_size_t cl_offset; >> >> + 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; >> + } >> + >> +#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 >> + >> + 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 >> + } >> + >> + /* Initialize these last, because terminal position could be >> affected >> +by printfs above. */ #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; >> + } >> + } >> + >> +#ifdef GRUB_MACHINE_IEEE1275 >> + { >> + 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 >> + >> 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); @@ - >> 466,20 +563,6 @@ >> 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 +605,6 @@ >> 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; >> >> > > Grub crashed with a GPF (13) when I tried to boot with that patch. >
There was a bug in that patch. Try this one please. > > _______________________________________________ > Bug-grub mailing list > Bug-grub@gnu.org > https://lists.gnu.org/mailman/listinfo/bug-grub > -- Regards Vladimir 'φ-coder/phcoder' Serbinenko
=== modified file 'grub-core/loader/i386/linux.c' --- grub-core/loader/i386/linux.c 2012-05-31 12:06:11 +0000 +++ grub-core/loader/i386/linux.c 2012-06-15 21:16:39 +0000 @@ -372,7 +372,6 @@ 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_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_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_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 @@ 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;
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Bug-grub mailing list Bug-grub@gnu.org https://lists.gnu.org/mailman/listinfo/bug-grub