kexec.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH kexec-tools] x86: use old screen_info if needed
@ 2018-01-28  5:52 Dave Young
  2018-01-29  7:21 ` Simon Horman
  0 siblings, 1 reply; 5+ messages in thread
From: Dave Young @ 2018-01-28  5:52 UTC (permalink / raw)
  To: Simon Horman; +Cc: kexec

With modern drm/kms graphic driver kexec-tools does not setup screen_info
correctly so one will only see screen output after those drm drivers
reinitializing after rebooting. Copying the old screen info from original
boot_params will help during my test, although it could not work for some
potential cases, but it is not worse than before.  This has been used in
the kernel kexec_file_load.

Signed-off-by: Dave Young <dyoung@redhat.com>
---
 kexec/arch/i386/x86-linux-setup.c |   21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

--- kexec-tools.orig/kexec/arch/i386/x86-linux-setup.c
+++ kexec-tools/kexec/arch/i386/x86-linux-setup.c
@@ -27,6 +27,7 @@
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <linux/fb.h>
+#include <linux/screen_info.h>
 #include <unistd.h>
 #include <dirent.h>
 #include <mntent.h>
@@ -122,7 +123,7 @@ void setup_linux_bootloader_parameters_h
 	cmdline_ptr[cmdline_len - 1] = '\0';
 }
 
-int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
+static int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
 {
 	struct fb_fix_screeninfo fix;
 	struct fb_var_screeninfo var;
@@ -826,6 +827,8 @@ out:
 void setup_linux_system_parameters(struct kexec_info *info,
 				   struct x86_linux_param_header *real_mode)
 {
+	int err;
+
 	/* get subarch from running kernel */
 	setup_subarch(real_mode);
 	if (bzImage_support_efi_boot && !arch_options.noefi)
@@ -841,8 +844,22 @@ void setup_linux_system_parameters(struc
 	real_mode->orig_video_ega_bx = 0;
 	real_mode->orig_video_isVGA = 1;
 	real_mode->orig_video_points = 16;
-	setup_linux_vesafb(real_mode);
 
+	/* setup vesa fb if possible, or just use original screen_info */
+	err = setup_linux_vesafb(real_mode);
+	if (err) {
+		uint16_t cl_magic, cl_offset;
+
+		/* save and restore the old cmdline param if needed */
+		cl_magic = real_mode->cl_magic;
+		cl_offset = real_mode->cl_offset;
+
+		err = get_bootparam(real_mode, 0, sizeof(struct screen_info));
+		if (!err) {
+			real_mode->cl_magic = cl_magic;
+			real_mode->cl_offset = cl_offset;
+		}
+	}
 	/* Fill in the memsize later */
 	real_mode->ext_mem_k = 0;
 	real_mode->alt_mem_k = 0;

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH kexec-tools] x86: use old screen_info if needed
  2018-01-28  5:52 [PATCH kexec-tools] x86: use old screen_info if needed Dave Young
@ 2018-01-29  7:21 ` Simon Horman
  2018-01-29  7:59   ` Dave Young
  0 siblings, 1 reply; 5+ messages in thread
From: Simon Horman @ 2018-01-29  7:21 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec

On Sun, Jan 28, 2018 at 01:52:31PM +0800, Dave Young wrote:
> With modern drm/kms graphic driver kexec-tools does not setup screen_info
> correctly so one will only see screen output after those drm drivers
> reinitializing after rebooting. Copying the old screen info from original
> boot_params will help during my test, although it could not work for some
> potential cases, but it is not worse than before.  This has been used in
> the kernel kexec_file_load.
> 
> Signed-off-by: Dave Young <dyoung@redhat.com>

Thanks, applied.

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH kexec-tools] x86: use old screen_info if needed
  2018-01-29  7:21 ` Simon Horman
@ 2018-01-29  7:59   ` Dave Young
  2018-01-29  9:04     ` Simon Horman
  0 siblings, 1 reply; 5+ messages in thread
From: Dave Young @ 2018-01-29  7:59 UTC (permalink / raw)
  To: Simon Horman; +Cc: kexec

On 01/29/18 at 08:21am, Simon Horman wrote:
> On Sun, Jan 28, 2018 at 01:52:31PM +0800, Dave Young wrote:
> > With modern drm/kms graphic driver kexec-tools does not setup screen_info
> > correctly so one will only see screen output after those drm drivers
> > reinitializing after rebooting. Copying the old screen info from original
> > boot_params will help during my test, although it could not work for some
> > potential cases, but it is not worse than before.  This has been used in
> > the kernel kexec_file_load.
> > 
> > Signed-off-by: Dave Young <dyoung@redhat.com>
> 
> Thanks, applied.

Hi Simon,

Thanks for taking it.  I tested the original version on my laptop with
efi boot.  either of below two changes work for me:

a) use the setup_linux_vesafb() detected values and change the orig_video_isVGA
to 0x70 (copy from boot params)

b) copy all screen_info from boot params.

I actually was hesitating which one is better and finally I sent the b).
But maybe a) + b) will be better, since my case is a framebuffer, I'm
not sure non-framebuffer case though it will be not worse with the
patch.  Could you consider an appending patch below?

---
In current kexec-tools we have already vesafb detecting code,
but in case unsupported vesa fb types it just return and do nothing
During my test copying the old boot time screen info works for me with
efi booted machine. And the vesa fb detected values also work even if the
fb fix.id is "inteldrmfb", thus change the code to use those values
detected with fb ioctl first for framebuffer systems.

Signed-off-by: Dave Young <dyoung@redhat.com>
---
 kexec/arch/i386/x86-linux-setup.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

--- kexec-tools.orig/kexec/arch/i386/x86-linux-setup.c
+++ kexec-tools/kexec/arch/i386/x86-linux-setup.c
@@ -123,6 +123,7 @@ void setup_linux_bootloader_parameters_h
 	cmdline_ptr[cmdline_len - 1] = '\0';
 }
 
+static int get_bootparam(void *buf, off_t offset, size_t size);
 static int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
 {
 	struct fb_fix_screeninfo fix;
@@ -144,8 +145,13 @@ static int setup_linux_vesafb(struct x86
 		/* VIDEO_TYPE_EFI */
 		real_mode->orig_video_isVGA = 0x70;
 	} else {
-		/* cannot handle and other types */
-		goto out;
+		int err;
+		off_t offset = offsetof(typeof(*real_mode), orig_video_isVGA);
+
+		/* blindly try old boot time video type */
+		err = get_bootparam(&real_mode->orig_video_isVGA, offset, 1);
+		if (err)
+			goto out;
 	}
 	close(fd);
 


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH kexec-tools] x86: use old screen_info if needed
  2018-01-29  7:59   ` Dave Young
@ 2018-01-29  9:04     ` Simon Horman
  2018-01-29  9:16       ` Dave Young
  0 siblings, 1 reply; 5+ messages in thread
From: Simon Horman @ 2018-01-29  9:04 UTC (permalink / raw)
  To: Dave Young; +Cc: kexec

On Mon, Jan 29, 2018 at 03:59:54PM +0800, Dave Young wrote:
> On 01/29/18 at 08:21am, Simon Horman wrote:
> > On Sun, Jan 28, 2018 at 01:52:31PM +0800, Dave Young wrote:
> > > With modern drm/kms graphic driver kexec-tools does not setup screen_info
> > > correctly so one will only see screen output after those drm drivers
> > > reinitializing after rebooting. Copying the old screen info from original
> > > boot_params will help during my test, although it could not work for some
> > > potential cases, but it is not worse than before.  This has been used in
> > > the kernel kexec_file_load.
> > > 
> > > Signed-off-by: Dave Young <dyoung@redhat.com>
> > 
> > Thanks, applied.
> 
> Hi Simon,
> 
> Thanks for taking it.  I tested the original version on my laptop with
> efi boot.  either of below two changes work for me:
> 
> a) use the setup_linux_vesafb() detected values and change the orig_video_isVGA
> to 0x70 (copy from boot params)
> 
> b) copy all screen_info from boot params.
> 
> I actually was hesitating which one is better and finally I sent the b).
> But maybe a) + b) will be better, since my case is a framebuffer, I'm
> not sure non-framebuffer case though it will be not worse with the
> patch.  Could you consider an appending patch below?

Sure, sorry for being a bit hasty.

I've appended the change below.
> 
> ---
> In current kexec-tools we have already vesafb detecting code,
> but in case unsupported vesa fb types it just return and do nothing
> During my test copying the old boot time screen info works for me with
> efi booted machine. And the vesa fb detected values also work even if the
> fb fix.id is "inteldrmfb", thus change the code to use those values
> detected with fb ioctl first for framebuffer systems.
> 
> Signed-off-by: Dave Young <dyoung@redhat.com>
> ---
>  kexec/arch/i386/x86-linux-setup.c |   10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> --- kexec-tools.orig/kexec/arch/i386/x86-linux-setup.c
> +++ kexec-tools/kexec/arch/i386/x86-linux-setup.c
> @@ -123,6 +123,7 @@ void setup_linux_bootloader_parameters_h
>  	cmdline_ptr[cmdline_len - 1] = '\0';
>  }
>  
> +static int get_bootparam(void *buf, off_t offset, size_t size);
>  static int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
>  {
>  	struct fb_fix_screeninfo fix;
> @@ -144,8 +145,13 @@ static int setup_linux_vesafb(struct x86
>  		/* VIDEO_TYPE_EFI */
>  		real_mode->orig_video_isVGA = 0x70;
>  	} else {
> -		/* cannot handle and other types */
> -		goto out;
> +		int err;
> +		off_t offset = offsetof(typeof(*real_mode), orig_video_isVGA);
> +
> +		/* blindly try old boot time video type */
> +		err = get_bootparam(&real_mode->orig_video_isVGA, offset, 1);
> +		if (err)
> +			goto out;
>  	}
>  	close(fd);
>  
> 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH kexec-tools] x86: use old screen_info if needed
  2018-01-29  9:04     ` Simon Horman
@ 2018-01-29  9:16       ` Dave Young
  0 siblings, 0 replies; 5+ messages in thread
From: Dave Young @ 2018-01-29  9:16 UTC (permalink / raw)
  To: Simon Horman; +Cc: kexec

On 01/29/18 at 10:04am, Simon Horman wrote:
> On Mon, Jan 29, 2018 at 03:59:54PM +0800, Dave Young wrote:
> > On 01/29/18 at 08:21am, Simon Horman wrote:
> > > On Sun, Jan 28, 2018 at 01:52:31PM +0800, Dave Young wrote:
> > > > With modern drm/kms graphic driver kexec-tools does not setup screen_info
> > > > correctly so one will only see screen output after those drm drivers
> > > > reinitializing after rebooting. Copying the old screen info from original
> > > > boot_params will help during my test, although it could not work for some
> > > > potential cases, but it is not worse than before.  This has been used in
> > > > the kernel kexec_file_load.
> > > > 
> > > > Signed-off-by: Dave Young <dyoung@redhat.com>
> > > 
> > > Thanks, applied.
> > 
> > Hi Simon,
> > 
> > Thanks for taking it.  I tested the original version on my laptop with
> > efi boot.  either of below two changes work for me:
> > 
> > a) use the setup_linux_vesafb() detected values and change the orig_video_isVGA
> > to 0x70 (copy from boot params)
> > 
> > b) copy all screen_info from boot params.
> > 
> > I actually was hesitating which one is better and finally I sent the b).
> > But maybe a) + b) will be better, since my case is a framebuffer, I'm
> > not sure non-framebuffer case though it will be not worse with the
> > patch.  Could you consider an appending patch below?
> 
> Sure, sorry for being a bit hasty.

Instead, I should say that..

> 
> I've appended the change below.

Simon, great, thank you! 

> > 
> > ---
> > In current kexec-tools we have already vesafb detecting code,
> > but in case unsupported vesa fb types it just return and do nothing
> > During my test copying the old boot time screen info works for me with
> > efi booted machine. And the vesa fb detected values also work even if the
> > fb fix.id is "inteldrmfb", thus change the code to use those values
> > detected with fb ioctl first for framebuffer systems.
> > 
> > Signed-off-by: Dave Young <dyoung@redhat.com>
> > ---
> >  kexec/arch/i386/x86-linux-setup.c |   10 ++++++++--
> >  1 file changed, 8 insertions(+), 2 deletions(-)
> > 
> > --- kexec-tools.orig/kexec/arch/i386/x86-linux-setup.c
> > +++ kexec-tools/kexec/arch/i386/x86-linux-setup.c
> > @@ -123,6 +123,7 @@ void setup_linux_bootloader_parameters_h
> >  	cmdline_ptr[cmdline_len - 1] = '\0';
> >  }
> >  
> > +static int get_bootparam(void *buf, off_t offset, size_t size);
> >  static int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
> >  {
> >  	struct fb_fix_screeninfo fix;
> > @@ -144,8 +145,13 @@ static int setup_linux_vesafb(struct x86
> >  		/* VIDEO_TYPE_EFI */
> >  		real_mode->orig_video_isVGA = 0x70;
> >  	} else {
> > -		/* cannot handle and other types */
> > -		goto out;
> > +		int err;
> > +		off_t offset = offsetof(typeof(*real_mode), orig_video_isVGA);
> > +
> > +		/* blindly try old boot time video type */
> > +		err = get_bootparam(&real_mode->orig_video_isVGA, offset, 1);
> > +		if (err)
> > +			goto out;
> >  	}
> >  	close(fd);
> >  
> > 

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-01-29  9:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-28  5:52 [PATCH kexec-tools] x86: use old screen_info if needed Dave Young
2018-01-29  7:21 ` Simon Horman
2018-01-29  7:59   ` Dave Young
2018-01-29  9:04     ` Simon Horman
2018-01-29  9:16       ` Dave Young

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).