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