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

Re: [PATCH v4 1/8] x86/boot: make "vga=current" work with graphics modes


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Tue, 5 Apr 2022 10:24:48 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.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:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GMZQmSJH2ZVsEMbRbL5QK2unD0ejft3PjP6FCyAko0c=; b=AVsLvPrLLPtIgC5o894bOvuiN8ZvzqcZjp4gU1wXISC0/4JSVMCphvQrpq9iH2py6LYAPh7V/Rk69ZAWUe7XMOX1McYfZh0u4vBuufwF/dx0vMmlz5gBMyL1+oPlSTYb8y0oLq8IiflFwGgShRO/fdJkrL6loZjS8Oq302p1eXw1hvi6M+u0A+Zrd2c3Fce+7SHeUM8FcfjInj6DC6v0XdclYUlHfeR+PZUIfx7qJsJx64YMyNXXmGuY6a+GkrKvQHvSiRowOVSXHHxXiHybWwiwat1tv/5F49FiadeCaaQpKKOhtDOgwHdnOpCweN5w7T9d8FkTIJNX66SzszSWrg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mM+/vituZEfmKatiNkPCbygLjIiYT+tgeHHpNHzsrOYIxdfciYe7zVf1a2SlcqFBD5ahIUoMALhVvGQi+41TcIOp6kWfn2AOQMz4Xl8b2n82qCKLoYfLqRa2tl+OVuDTc0EB/mAR4uoPsc2FkLx+57LHrDXDyOxlkAIoZSH7tltmVCVGAFeAfY166QNBTa4jNbYK+fv/mjXJv9vtTK6zBbXphCebp1eYTQZCeF1y6EUMJGjBghzLX9CUVNchMbad45wcJgEKc2lmFJ5jc4DOByNVH38i0jeTjYcXTWQX0JumQz9tKBIypAEZzu2Y8vOu2NCBdNyoLjL8Odr27AV8cw==
  • Authentication-results: esa3.hc3370-68.iphmx.com; dkim=pass (signature verified) header.i=@citrix.onmicrosoft.com
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, "Andrew Cooper" <andrew.cooper3@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Tue, 05 Apr 2022 08:25:06 +0000
  • Ironport-data: A9a23:bSYuYKoL8+sOz7zjd7UTdoMM/aFeBmIPZRIvgKrLsJaIsI4StFCzt garIBnXaavZMzbwKosjb9i09R8CvcWGxt9lGgtsrC0wEC0X8puZCYyVIHmrMnLJJKUvbq7GA +byyDXkBJppJpMJjk71atANlVEliefQAOCU5NfsYkidfyc9IMsaoU8lyrZRbrJA24DjWVvR4 Y6q+qUzBXf+s9JKGjNMg068gEsHUMTa4Fv0aXRnOJinFHeH/5UkJMp3yZOZdhMUcaENdgKOf M7RzanRw4/s10xF5uVJMFrMWhZirrb6ZWBig5fNMkSoqkAqSicais7XOBeAAKv+Zvrgc91Zk b1wWZKMpQgBL4z33+JFdxNkVBpTNrR/5bD2CiDlmJnGp6HGWyOEL/RGCUg3OcsT+/ptAHEI/ vsdQNwPRknd3aTsmuv9E7QywJR4RCXoFNp3VnVI1zbWAOxgWZnea67L+cVZzHE7gcUm8fP2O ZpBM2IyPEiojxtnPGsWVJZlsd+UlFrASCZTr3K4iPdt/D2GpOB2+Oe0a4eEEjCQfu1Kmm6Iq 2SA+H72ajkKOdraxTeb/3aEgu7UgTi9SI8UDKe/9PNhnBuU3GN7IB8cWEa/oPK5olWjQN8ZI EsRkhfCtoBrqhbtFIOkGUTl/jjU5XbwRua8DcUryTrKzPLw6TrePUUPVwdcZ+0N7JUfEGlCO kCyo/vlAjlmsbuwQH2b96uJoT7aBRX5PVPudgdfE1JbvoCLTJUby0uWE409SPLdYsjdQ2mY/ tyckMQpa1z/Z+Yv3r7zw13IiinESnPhHl9svVW/so5IA2pEiG+Zi26AtAOzARVodt/xory9U J4swZX2AAcmV8zlqcB1aL9RdIxFHt7cWNEmvXZhHoM66xOm8GO5cIZb7VlWfRk1Y55eIWO0P BSP5Wu9AaO/2lPwMMebhKrrVawXIVXIT4y5Bpg4kPIQCnSOSON31H43PhPBt4wcuEMtjbs+K f+mnTWEVh4n5VBc5GPuHY81iOZzrghnnD+7bc2rnnyPjOvFDFbIGOhtDbd7Rr1ghE9yiF6Oq Ig32grj40g3bdASlQGMqNRJcA9TcSZgbX00wuQOHtO+zsNdMDhJI9fawK87epwjmKJQl+zS+ Wq6VFMew1367UAr4y3TApy/QNsDhapCkE8=
  • Ironport-hdrordr: A9a23:0T7lXakknsgvvqp8Lrh9jcdhMFnpDfJP3DAbv31ZSRFFG/Fw9v rPoB1/73TJYVkqNU3I9errBEDiexLhHOBOjrX5VI3KNDUO01HFEGgN1+Xf/wE=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Mon, Apr 04, 2022 at 05:50:57PM +0200, Jan Beulich wrote:
> (reducing Cc list some)
> 
> On 04.04.2022 16:49, Roger Pau Monné wrote:
> > On Thu, Mar 31, 2022 at 11:44:10AM +0200, Jan Beulich wrote:
> >> 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.

So this patch helps you by not having to set a mode and just relying
on the mode set by GrUB?

> >>
> >> 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.
> > 
> > I'm unsure, what's the benefit from retrieving this information from
> > the VESA blob rather than from multiboot(2) structures?
> 
> As said - it allows things to work even when that data isn't provided.
> Note also how I say "for starters" - patch 2 adds logic to retrieve
> the information from MB.
> 
> > Is it because we require a VESA mode to be set before we parse the
> > multiboot information?
> 
> No, I don't think so.
> 
> >> --- 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
> >> -set_current:
> >>          stc
> >>          ret
> >>  
> >> @@ -693,6 +692,39 @@ vga_modes:
> >>          .word   VIDEO_80x60, 0x50,0x3c,0        # 80x60
> >>  vga_modes_end:
> >>  
> >> +# If the current mode is a VESA graphics one, obtain its parameters.
> >> +set_current:
> >> +        leaw    vesa_glob_info, %di
> >> +        movw    $0x4f00, %ax
> >> +        int     $0x10
> >> +        cmpw    $0x004f, %ax
> >> +        jne     .Lsetc_done
> > 
> > You don't seem to make use of the information fetched here? I guess
> > this is somehow required to access the other functions?
> 
> See the similar logic at check_vesa. The information is used later, by
> mode_params (half way into mopar_gr). Quite likely this could be done
> just in a single place, but that would require some restructuring of
> the code, which I'd like to avoid doing here.

I didn't realize check_vesa and set_current where mutually
exclusive.

> >> +        movw    $0x4f03, %ax
> > 
> > It would help readability to have defines for those values, ie:
> > VESA_GET_CURRENT_MODE or some such (not that you need to do it here,
> > just a comment).
> 
> Right - this applies to all of our BIOS interfacing code, I guess.
> 
> >> +        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
> > 
> > So you also check that the reserved D1 bit is set to 1 as mandated by
> > the spec. This is slightly different than what's done in check_vesa,
> > would you mind adding a define for this an unifying with check_vesa?
> 
> Well, see the v2 changelog comment. I'm somewhat hesitant to do that
> here; I'd prefer to consolidate this in a separate patch.

Sorry, didn't notice that v2 comment before.

It's my understanding that the main difference this patch introduces
is that set_current now fetches the currently set mode, so that we
avoid further mode changes if the mode set already matches the
selected one, or if Xen is to use the already set mode?

Thanks, Roger.



 


Rackspace

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