Switch back to framebuffer page zero before loading the kernel

(thanks, Felix Kuehling).
This commit is contained in:
Colin Watson 2011-03-25 10:53:35 +00:00
parent 70e4d5f34f
commit 24bf5498ad
3 changed files with 35 additions and 0 deletions

2
debian/changelog vendored
View File

@ -4,6 +4,8 @@ grub2 (1.99~rc1-6) UNRELEASED; urgency=low
- Fix crash when extending menu entry line beyond 79 characters (closes:
#615893).
- Account for FreeBSD module headers when calculating allocation size.
- Switch back to framebuffer page zero before loading the kernel
(thanks, Felix Kuehling).
* Merge from Ubuntu:
- If we're upgrading and /boot/grub/core.img doesn't exist, then don't
ask where to install GRUB, since it probably means we're in some kind

View File

@ -21,3 +21,4 @@ btrfs_rootflags.patch
lnxboot_grub.patch
normal_menu_line_alloc.patch
freebsd_module_header_alloc.patch
video_fb_pageflip.patch

32
debian/patches/video_fb_pageflip.patch vendored Normal file
View File

@ -0,0 +1,32 @@
Description: Switch back to framebuffer page zero before loading kernel
Thanks to Felix Kuehling.
Author: Colin Watson <cjwatson@ubuntu.com>
Forwarded: http://lists.gnu.org/archive/html/grub-devel/2011-03/msg00057.html
Applied-Upstream: http://bazaar.launchpad.net/~vcs-imports/grub/grub2-bzr/revision/3116
Last-Update: 2011-03-25
Index: b/grub-core/video/fb/video_fb.c
===================================================================
--- a/grub-core/video/fb/video_fb.c
+++ b/grub-core/video/fb/video_fb.c
@@ -1505,6 +1505,20 @@
{
grub_memcpy (mode_info, &(framebuffer.front_target->mode_info),
sizeof (*mode_info));
+
+ /* We are about to load a kernel. Switch back to page zero, since some
+ kernel drivers expect that. */
+ if ((mode_info->mode_type & GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED)
+ && framebuffer.set_page && framebuffer.displayed_page != 0)
+ {
+ /* Ensure both pages are exactly in sync. */
+ grub_memcpy (framebuffer.back_target->data,
+ framebuffer.front_target->data,
+ framebuffer.back_target->mode_info.pitch
+ * framebuffer.back_target->mode_info.height);
+ grub_video_swap_buffers ();
+ }
+
*framebuf = framebuffer.front_target->data;
grub_video_fb_fini ();