grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Switch back to page 0 before loading kernel


From: Colin Watson
Subject: [PATCH] Switch back to page 0 before loading kernel
Date: Thu, 24 Mar 2011 16:27:27 +0000
User-agent: Mutt/1.5.20 (2009-06-14)

Felix Kuehling reported intermittent black-screen problems when
switching Linux VT on certain configurations.  This happens because in
the case where we're using double-buffering we pass a framebuffer base
to the kernel corresponding to whichever page we happened to be using as
the front target when we shut down the video subsystem, and not all
kernel drivers are happy with this.  It would be better to consistently
use page zero.

2011-03-24  Colin Watson  <address@hidden>

        * grub-core/video/fb/video_fb.c (grub_video_fb_get_info_and_fini):
        Switch back to page zero before loading a kernel, since some kernel
        drivers expect that.
        Thanks to: Felix Kuehling.

=== modified file 'grub-core/video/fb/video_fb.c'
--- grub-core/video/fb/video_fb.c       2010-05-16 13:01:54 +0000
+++ grub-core/video/fb/video_fb.c       2011-03-24 16:21:25 +0000
@@ -1505,6 +1505,20 @@ grub_video_fb_get_info_and_fini (struct
 {
   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 ();

-- 
Colin Watson                                       address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]