qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] Where is vga-rom mapped in guest system memory?


From: Laszlo Ersek
Subject: Re: [Qemu-devel] Where is vga-rom mapped in guest system memory?
Date: Thu, 15 May 2014 16:04:43 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

On 05/15/14 15:25, Jaeyong Yoo wrote:
>> I rely on the qemu debug port rather than on serial:
>>
>>   -debugcon file:debug.log -global isa-debugcon.iobase=0x402
>>
>> Check the DEBUG_IO and DEBUG_LEVEL settings in the SeaBIOS config as well.
> 
> Thanks Laszlo! Now I can see the log message in VirtualBox vgabios with qemu
> debug port.
> 
> By the way, I've got one more question, which is very strange for me.
> 
> I tried to print a string and the values read by the string address do not 
> look
> correct. More specifically, I wrote the following code in VirtualBox vga-bios:
> 
> char *msg = "Start Vgabios\n";
> 
> for (i = msg; ++i; *i != 0)
> {
>     outb(0x402, *i);
> }
> 
> And, I expect to see the message "Start Vgabios" in the debug port, but it 
> doesn't
> work. If I object-dump the related parts in VirtualBox vga-bios, I can see 
> that the
> msg (msg = 0x7eea) properly contains "Start Vgabios". And, if I print the 
> value of i
> in vga-bios, it gives 0x7eea (which is correct address). Then I expect that 
> *i should
> be 'S' but *I gives zero. I checked the vga-rom size field and it properly 
> covers the
> actual size of vgarom. Then, I think qemu properly map the entire vgarom in 
> the proper,
> so it won't be an issue.
> 
> Is there some issues with memory addressing that I'm missing?

You are probably in real mode. The above outb() loop probably translates
to something like this:

00000000  3E8A04            mov al,[ds:si]
00000003  BA0204            mov dx,0x402
00000006  EE                out dx,al
00000007  46                inc si

(objdump -S will allow you to see it exactly.)

My take is that ds is not set correctly. You might have to set ds
manually, or at least decorate the definition of the string with some
gcc section attribute so that the compiler places the string in a
section that will be "automatically" matched by ds.

Or, you might be able to test it like this:
- first, change the type of "msg" from "pointer to character" to "array
of characters":

  char msg[] = "Start Vgabios\n"

- second, give it automatic storage duration, rather than static storage
duration. In English, make it local to the function containing the loop.
Hopefully the compiler will generate code that places the string on the
stack then, and then your loop body will (hopefully) look something like

00000000  368A02            mov al,[ss:bp+si]
00000003  BA0204            mov dx,0x402
00000006  EE                out dx,al
00000007  46                inc si

(Ie. work off your stack, where ss and bp should be "just right".)

I'm just guessing of course.

Laszlo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]