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

[PATCH v2 1/7] x86/boot: make "vga=current" work with graphics modes

  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Wed, 15 Sep 2021 15:24:16 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=vmvh23AF/QYwECie+A4cxpmvY3OAqvVGprF/crpbyog=; b=fAD8aYqNM8+WWnZWDcW9ZCBnDgwjUcCpvwP9m2wCkxswEABZJWgLHaoh/UjCuRzbyaYg0/rDBFlAXIVK/Fak1+t1Npdkb62LsGbsfg9Gyb7TZoYQnc53/OUid8Qa9Ea2q3+GAHFKDyoKJKYLjGH7TGT6dqXK25DEAwmtZteWYZKkD5bcJlCF8XL5fxJwBd6IGTmJEuZOFnCtUfe6jnPjNMTkCZQZkBPlZam5mn/1fkN/W6LyxOJ8e4emdvT5R1/JKNteA9mcgrqo70gL0Z45amJg1pM8kllhe2oNyWPfDvRaL0lDChJFFkt3oJMOGjmelEhlemvoR/raJkt3w8c/jA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ih1x9nB/MQE09L7Z/FeVoxuOL969/1TEiGBcgGI2OWNqRZ9c4dGf/3UiIcLbms+tddWrio5VnVwFy65g58h481xcvfBgQcBHdConT6PbSH9rN8hrtp/sbLCTthw1lZdk36IDto8Bqfw71JAg+lnKFzff1fRgCQF+XZ2Qp+c5JzMa1ZGwh8VhFN26m4TCfbUlg5O/ic0ZakuGkeQ+2ChZLde0MofFtJEo+/CCybtVIjCg9wzC+E8RoMhKBPUws9g8204aOVdQEXb1g/LYBASEUe9gnVk/yI06YuglsuO6Y7fG5mR9kS+C8B2ZOdUc6uZGrE1OHUzK3aWpGI8VcJYdug==
  • Authentication-results: citrix.com; dkim=none (message not signed) header.d=none;citrix.com; dmarc=none action=none header.from=suse.com;
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Wed, 15 Sep 2021 13:24:24 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

GrUB2 can be told to leave the screen in the graphics mode it has been
using (or any other one), via "set gfxpayload=keep" (or suitable
variants thereof). In this case we can avoid doing another mode switch
ourselves. This in particular avoids possibly setting the screen to a
less desirable mode: On one of my test systems the set of modes
reported available by the VESA BIOS depends on whether the interposed
KVM switch has that machine set as the active one. If it's not active,
only modes up to 1024x768 get reported, while when active 1280x1024
modes are also included. For things to always work with an explicitly
specified mode (via the "vga=" option), that mode therefore needs be a
1024x768 one.

For some reason this only works for me with "multiboot2" (and
"module2"); "multiboot" (and "module") still forces the screen into text
mode, despite my reading of the sources suggesting otherwise.

For starters I'm limiting this to graphics modes; I do think this ought
to also work for text modes, but
- I can't tell whether GrUB2 can set any text mode other than 80x25
  (I've only found plain "text" to be valid as a "gfxpayload" setting),
- I'm uncertain whether supporting that is worth it, since I'm uncertain
  how many people would be running their systems/screens in text mode,
- I'd like to limit the amount of code added to the realmode trampoline.

For starters I'm also limiting mode information retrieval to raw BIOS
accesses. This will allow things to work (in principle) also with other
boot environments where a graphics mode can be left in place. The
downside is that this then still is dependent upon switching back to
real mode, so retrieving the needed information from multiboot info is
likely going to be desirable down the road.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
I'm not convinced boot_vid_mode really needs setting here; I'm doing so
mainly because setvesabysize also does.
v2: Use 0x9b instead of 0x99 for attributes check: I think the value
    used by check_vesa also wants to be converted, to match vesa2's.
    (Perhaps the value wants to become a #define, albeit before doing so
    I'd question the requirement of the mode being a color one.)

--- a/xen/arch/x86/boot/video.S
+++ b/xen/arch/x86/boot/video.S
@@ -575,7 +575,6 @@ set14:  movw    $0x1111, %ax
         movb    $0x01, %ah              # Define cursor scan lines 11-12
         movw    $0x0b0c, %cx
         int     $0x10
@@ -693,6 +692,39 @@ vga_modes:
         .word   VIDEO_80x60, 0x50,0x3c,0        # 80x60
+# If the current mode is a VESA graphics one, obtain its parameters.
+        leaw    vesa_glob_info, %di
+        movw    $0x4f00, %ax
+        int     $0x10
+        cmpw    $0x004f, %ax
+        jne     .Lsetc_done
+        movw    $0x4f03, %ax
+        int     $0x10
+        cmpw    $0x004f, %ax
+        jne     .Lsetc_done
+        leaw    vesa_mode_info, %di     # Get mode information structure
+        movw    %bx, %cx
+        movw    $0x4f01, %ax
+        int     $0x10
+        cmpw    $0x004f, %ax
+        jne     .Lsetc_done
+        movb    (%di), %al              # Check mode attributes
+        andb    $0x9b, %al
+        cmpb    $0x9b, %al
+        jne     .Lsetc_done             # Doh! No linear frame buffer
+        movb    $1, bootsym(graphic_mode)
+        movw    %bx, bootsym(boot_vid_mode)
+        movw    %bx, bootsym(video_mode)
+        stc
+        ret
 # Detect VESA modes.
         movw    %di, %bp                # BP=original mode table end



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.