@@ -277,59 +277,60 @@ static u16 rows2vmode(unsigned int rows)
static void vga_parse(const char *cmdline, early_boot_opts_t *ebo)
{
- const char *c;
- unsigned int tmp, vesa_depth, vesa_height, vesa_width;
-
- c = find_opt(cmdline, "vga=", true);
-
- if ( !c )
- return;
+ const char *c = cmdline;
ebo->boot_vid_mode = ASK_VGA;
- if ( !strmaxcmp(c, "current", delim_chars_comma) )
- ebo->boot_vid_mode = VIDEO_CURRENT_MODE;
- else if ( !strsubcmp(c, "text-80x") )
- {
- c += strlen("text-80x");
- ebo->boot_vid_mode = rows2vmode(strtoui(c, delim_chars_comma, NULL));
- }
- else if ( !strsubcmp(c, "gfx-") )
+ while ( (c = find_opt(c, "vga=", true)) != NULL )
{
- vesa_width = strtoui(c + strlen("gfx-"), "x", &c);
+ unsigned int tmp, vesa_depth, vesa_height, vesa_width;
+
+ if ( !strmaxcmp(c, "current", delim_chars_comma) )
+ ebo->boot_vid_mode = VIDEO_CURRENT_MODE;
+ else if ( !strsubcmp(c, "text-80x") )
+ {
+ c += strlen("text-80x");
+ ebo->boot_vid_mode = rows2vmode(strtoui(c, delim_chars_comma, NULL));
+ }
+ else if ( !strsubcmp(c, "gfx-") )
+ {
+ vesa_width = strtoui(c + strlen("gfx-"), "x", &c);
- if ( vesa_width > U16_MAX )
- return;
+ if ( vesa_width > U16_MAX )
+ return;
- /*
- * Increment c outside of strtoui() because otherwise some
- * compiler may complain with following message:
- * warning: operation on 'c' may be undefined.
- */
- ++c;
- vesa_height = strtoui(c, "x", &c);
+ /*
+ * Increment c outside of strtoui() because otherwise some
+ * compiler may complain with following message:
+ * warning: operation on 'c' may be undefined.
+ */
+ ++c;
+ vesa_height = strtoui(c, "x", &c);
- if ( vesa_height > U16_MAX )
- return;
+ if ( vesa_height > U16_MAX )
+ return;
- vesa_depth = strtoui(++c, delim_chars_comma, NULL);
+ vesa_depth = strtoui(++c, delim_chars_comma, NULL);
- if ( vesa_depth > U16_MAX )
- return;
+ if ( vesa_depth > U16_MAX )
+ return;
- ebo->vesa_width = vesa_width;
- ebo->vesa_height = vesa_height;
- ebo->vesa_depth = vesa_depth;
- ebo->boot_vid_mode = VIDEO_VESA_BY_SIZE;
- }
- else if ( !strsubcmp(c, "mode-") )
- {
- tmp = strtoui(c + strlen("mode-"), delim_chars_comma, NULL);
+ ebo->vesa_width = vesa_width;
+ ebo->vesa_height = vesa_height;
+ ebo->vesa_depth = vesa_depth;
+ ebo->boot_vid_mode = VIDEO_VESA_BY_SIZE;
+ }
+ else if ( !strsubcmp(c, "mode-") )
+ {
+ tmp = strtoui(c + strlen("mode-"), delim_chars_comma, NULL);
- if ( tmp > U16_MAX )
- return;
+ if ( tmp > U16_MAX )
+ return;
- ebo->boot_vid_mode = tmp;
+ ebo->boot_vid_mode = tmp;
+ }
+ else if ( !strmaxcmp(c, "ask", delim_chars_comma) )
+ ebo->boot_vid_mode = ASK_VGA;
}
}
#endif
Parse all instances of the vga= option on the command line, in order to always enforce the last selection on the command line. Note that it's not safe to parse just the last occurrence of the vga= option, as then a command line with `vga=current vga=keep` would result in current being ignored. Adjust the command line documentation to describe the new behavior. Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> --- Changes since v3: - Remove xen-command-line doc addition. - Set mode to 'ask' by default. Changes since v2: - New in this version. --- Build tested only, as I don't have a system that does legacy boot and has VGA output I can check. It's mostly encapsulating the current code inside of a while loop and adding an extra else if for the "ask" option, there's a lot of indentation changes. --- xen/arch/x86/boot/cmdline.c | 83 +++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 41 deletions(-)