[PATCH kexec-tools] x86: use old screen_info if needed

Dave Young dyoung at redhat.com
Mon Jan 29 01:16:09 PST 2018


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 at 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 at 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);
> >  
> > 



More information about the kexec mailing list