From: Anthony Liguori <anthony@codemonkey.ws>
To: joy zhao <yanhwizhao@gmail.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] set vidmode in linux kernel header when boot x86 using qemu bootloader
Date: Tue, 26 May 2009 08:29:41 -0500 [thread overview]
Message-ID: <4A1BEEC5.8050406@codemonkey.ws> (raw)
In-Reply-To: <162800e10905260322r39594e35y4fd7f7afb52ef29@mail.gmail.com>
Hi Joy,
joy zhao wrote:
> hi,
> I made a patch to have qemu parse vga field in kernel command line and
> set the vid_mode field of real-mode kernel header.
> This patch is necessary because vga is one of the special command line
> options that should be parsed in bootloader, as in linux kernel
> Documentation/x86/i386/boot.txt. After bootloader write the passed vga
> value into the vid_mode field of linux real-mode kernel header, this
> vid_mode will be handled by linux/x86/boot/video.c in linux kernel to
> select vesa graphics mode, and only in this mode can vesafb be
> registered(in vesafb_probe()).
> So, if we decide to launch linux directly from qemu command line as
> "qemu -kernel ... -initrd... -append "..." ", (use qemu bootloader)
> and use vesafb as framebuffer driver, this patch to qemu is required,
> otherwise, the screen should just blank since the vesafb fails to
> register itself.
> Joy.
>
>
Need a Signed-off-by: to apply this.
> diff --git a/qemu/hw/pc.c b/qemu-new/hw/pc.c
> index 66cc780..5615db8 100644
> --- a/qemu/hw/pc.c
> +++ b/qemu-new/hw/pc.c
> @@ -593,6 +593,77 @@ static long get_file_size(FILE *f)
> return size;
> }
>
> +static uint16_t hato16i(char *hex)
> +{
> + uint16_t integer = 0;
> + if(hex[1] == 'x')
> + hex += 2;
> +
> + while(*hex != '\0'){
> + integer = (integer<<4);
> +
> + if(*hex >= 0x30 && *hex <= 0x39){ /*0~9*/
> + integer += *hex - 0x30;
> + }else if(*hex >= 0x61 && *hex <= 0x66){ /*a~f*/
> + integer += *hex - 0x61 + 0xa;
> + }else if(*hex >= 0x41 && *hex <= 0x46){ /*A~F*/
> + integer += *hex - 0x41 + 0xa;
> + }else
> + break;
> +
> + hex++;
> + }
> + return integer;
> +}
Make sure you format according to CodingStyle. Also, this function
isn't needed as strtoul(hex, NULL, 16) provides the same functionality.
> +static uint16_t ato16i(char *dec)
> +{
> + uint16_t integer = 0;
> +
> + while(*dec != '\0'){
> + integer *= 10;
> +
> + if(*dec >= 0x30 && *dec <= 0x39){ /*0~9*/
> + integer += *dec - 0x30;
> + }else
> + break;
> +
> + dec++;
> + }
> + return integer;
> +}
> +static int get_vga_mode(const char* kernel_cmdline, uint16_t *vga_mode)
> +{
> + char mode[6];
> + int i = 0;
> + char *p = strstr(kernel_cmdline, "vga=");
> + if(p == NULL)
> + return 1;
> +
> + p += 4;
> +
> + while(*p != ' ' && *p != '\0' && i < 6) {
> + mode[i] = *p;
> + i++;
> + p++;
> + }
> +
> + if(!strncmp(mode, "ask", 3)){
> + *vga_mode = 0xfffd;
> + }else if(!strncmp(mode, "normal",6)){
> + *vga_mode = 0xffff;
> + }else if(!strncmp(mode, "ext", 3)){
> + *vga_mode = 0xfffe;
> + }else if(!strncmp(mode, "0x", 2)){//in hexdecimal
> + *vga_mode = hato16i(mode);
> + }else //in decimal
> + *vga_mode = ato16i(mode);
strtoul(mode, NULL, 0) will cover both hex and decimal. You can check
the value afterword to enforce u16 if you really want to.
Regards,
Anthony Liguori
next prev parent reply other threads:[~2009-05-26 13:29 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-26 10:22 [Qemu-devel] [PATCH] set vidmode in linux kernel header when boot x86 using qemu bootloader joy zhao
2009-05-26 13:29 ` Anthony Liguori [this message]
2009-05-27 6:01 ` joy zhao
2009-05-26 14:26 ` Mark McLoughlin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A1BEEC5.8050406@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
--cc=yanhwizhao@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.