[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 3/3] cmdline: parse multiple instances of the vga option
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@xxxxxxxxxx> --- 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. --- docs/misc/xen-command-line.pandoc | 3 ++ xen/arch/x86/boot/cmdline.c | 85 +++++++++++++++---------------- 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index e0b89b7d3319..8cf2f3423d47 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -2628,6 +2628,9 @@ with the specified width, height and depth. `ask` option. (N.B menu modes are displayed in hex, so `<mode>` should be a hexadecimal number) +Note that all the occurrences of the vga option in the command line are parsed, +and hence later occurrences can overwrite selections done by prior ones. + The optional `keep` parameter causes Xen to continue using the vga console even after dom0 has been started. The default behaviour is to relinquish control to dom0. diff --git a/xen/arch/x86/boot/cmdline.c b/xen/arch/x86/boot/cmdline.c index fc11c6d3c5c4..511e77e0c2b5 100644 --- a/xen/arch/x86/boot/cmdline.c +++ b/xen/arch/x86/boot/cmdline.c @@ -277,59 +277,58 @@ 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 ( vesa_width > U16_MAX ) - return; + 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); - /* - * 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_width > U16_MAX ) + return; - if ( vesa_height > 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); - vesa_depth = strtoui(++c, delim_chars_comma, NULL); + if ( vesa_height > U16_MAX ) + return; - if ( vesa_depth > U16_MAX ) - return; + vesa_depth = strtoui(++c, 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 ( vesa_depth > U16_MAX ) + return; - if ( tmp > 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->boot_vid_mode = tmp; + if ( tmp > U16_MAX ) + return; + + ebo->boot_vid_mode = tmp; + } + else if ( !strsubcmp(c, "ask") ) + ebo->boot_vid_mode = ASK_VGA; } } #endif -- 2.40.0
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |