From fb5a8792e6e4ee7de7ae3e06d193ea5beaaececc Mon Sep 17 00:00:00 2001 From: Kairui Song Date: Tue, 5 Mar 2019 19:34:33 +0800 Subject: x86: Introduce a new option --reuse-video-type After commit 060eee58 "x86: use old screen_info if needed", kexec-tools will force use old screen_info and vga type if failed to determine current vga type. But it is not always a good idea. Currently kernel hanging is inspected on some hyper-v VMs after this commit, because hyperv_fb will mimic EFI (or VESA) VGA on first boot up, but after the real driver is loaded, it will switch to new mode and no longer compatible with EFI/VESA VGA. Keep setting orig_video_isVGA to EFI/VESA VGA flag will get wrong driver loaded and try to manipulate the framebuffer in a wrong way. We can't ensure this won't happen on other framebuffer drivers, But it's a helpful feature if the framebuffer drivers just work. So this patch introduce a --reuse-video-type options to let user decide if the old screen_info hould be used unconditional or not. Signed-off-by: Kairui Song Reviewed-by: Dave Young Signed-off-by: Simon Horman --- kexec/arch/i386/x86-linux-setup.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'kexec/arch/i386/x86-linux-setup.c') diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c index 1bd408b..8fad115 100644 --- a/kexec/arch/i386/x86-linux-setup.c +++ b/kexec/arch/i386/x86-linux-setup.c @@ -144,7 +144,7 @@ static int setup_linux_vesafb(struct x86_linux_param_header *real_mode) } else if (0 == strcmp(fix.id, "EFI VGA")) { /* VIDEO_TYPE_EFI */ real_mode->orig_video_isVGA = 0x70; - } else { + } else if (arch_options.reuse_video_type) { int err; off_t offset = offsetof(typeof(*real_mode), orig_video_isVGA); @@ -152,6 +152,10 @@ static int setup_linux_vesafb(struct x86_linux_param_header *real_mode) err = get_bootparam(&real_mode->orig_video_isVGA, offset, 1); if (err) goto out; + } else { + real_mode->orig_video_isVGA = 0; + close(fd); + return 0; } close(fd); @@ -844,7 +848,7 @@ void setup_linux_system_parameters(struct kexec_info *info, setup_subarch(real_mode); if (bzImage_support_efi_boot && !arch_options.noefi) setup_efi_info(info, real_mode); - + /* Default screen size */ real_mode->orig_x = 0; real_mode->orig_y = 0; -- cgit