[SeaBIOS] [BROKEN RFC 0/5] can we enable the qemu debug port for real-mode code?
Laszlo Ersek
lersek at redhat.com
Wed Feb 13 13:13:45 CET 2013
On 02/13/13 06:19, Kevin O'Connor wrote:
> On Wed, Feb 13, 2013 at 04:52:09AM +0100, Laszlo Ersek wrote:
>> This series bears witness to my extreme cluelessness. With it I'm only
>> asking if we can move the hypervisor/platform detection logic to SRCBOTH
>> code, so that it sets up "PlatformRunningOn" for all of CSM, vgabios,
>> and "normal" SeaBIOS.
>
> It's possible to do this, but it's not a great way of detecting the
> platform - it can only detect Xen/KVM and not raw QEMU. On coreboot,
> it's possible to determine if qemu (or its derivatives) launched
> SeaBIOS by looking for the qemu signature in the vendor/part
> identifiers in the coreboot tables. David suggested that something
> similar could be done for CSM by looking at the SMBIOS tables.
>
>> The motivation is that running on qemu is now a
>> requirement for logging to the qemu debug port, and logging to that port
>> would be nice in all flavors & parts.
>
> I recently pushed the "Improved multi-platform support" series, but I
> pulled out the CONFIG_DEBUG_IO change that allowed it to work with
> just CONFIG_QEMU_HARDWARE.
I think I understand. DEBUG_IO still depends on QEMU (from Gerd's commit
9600c800), and selecting CSM will not satisfy that.
> I think it's possible to get it working
> with CONFIG_QEMU_HARDWARE with something like the patch below.
Are two builds necessary with this change? One with CSM && QEMU_HARDWARE
(which will build a CSM-ized bios.bin that logs to the debug port, and a
vgabios.bin that doesn't), and another with QEMU (implying
QEMU_HARDWARE, from which build the bios.bin is to be ignored for CSM
purposes, and the vgabios.bin is to be installed, because it logs to the
debug port)?
> Also, the current SeaVGABIOS code is checking for "!COREBOOT" in its
> Kconfig file - that should be changed to "QEMU". With that fixed this
> will be even less of a concern. (It really only makes sense to build
> a cirrus/bochs vgabios for QEMU - which would always have the debug
> port available.)
Yes, I think it would eliminate the non-debugport-logging vgabios.bin
from the first (== CSM && QEMU_HARDWARE) build above.
... However, I think the (CSM && QEMU_HARDWARE) bios.bin would still not
log to the debug port. The (GET_GLOBAL(PlatformRunningOn) & PF_QEMU)
part would evaluate to false, for two reasons: first,
qemu_ramsize_preinit() will not set the flag when !CONFIG_QEMU (which is
implied by CONFIG_CSM); second, qemu_ramsize_preinit() is never even
invoked in the CSM build.
Anyway I've been beating this dead horse long enough; I guess I can
easily hack the DEBUG_IO dependency (and nothing else) in scratch builds.
Thanks for your help!
Laszlo
>
> -Kevin
>
>
> diff --git a/Makefile b/Makefile
> index e02803e..b9fed0f 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -36,14 +36,14 @@ COMMONCFLAGS += $(call cc-option,$(CC),-nopie,)
> COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
> COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
>
> -CFLAGS32FLAT := $(COMMONCFLAGS) -DMODE16=0 -DMODESEGMENT=0 -fomit-frame-pointer
> +CFLAGS32FLAT := $(COMMONCFLAGS) -DMODE16=0 -DMODESEGMENT=0 -fomit-frame-pointer -DMODEVGA=0
> CFLAGSSEG := $(COMMONCFLAGS) -DMODESEGMENT=1 -fno-defer-pop \
> $(call cc-option,$(CC),-fno-jump-tables,-DMANUAL_NO_JUMP_TABLE) \
> $(call cc-option,$(CC),-fno-tree-switch-conversion,)
> -CFLAGS32SEG := $(CFLAGSSEG) -DMODE16=0 -fomit-frame-pointer
> +CFLAGS32SEG := $(CFLAGSSEG) -DMODE16=0 -fomit-frame-pointer -DMODEVGA=0
> CFLAGS16INC := $(CFLAGSSEG) -DMODE16=1 -Wa,src/code16gcc.s \
> $(call cc-option,$(CC),--param large-stack-frame=4,-fno-inline)
> -CFLAGS16 := $(CFLAGS16INC) -fomit-frame-pointer
> +CFLAGS16 := $(CFLAGS16INC) -fomit-frame-pointer -DMODEVGA=0
>
> # Run with "make V=1" to see the actual compile commands
> ifdef V
> @@ -179,7 +179,7 @@ SRCVGA=src/output.c src/util.c src/pci.c \
> vgasrc/stdvga.c vgasrc/stdvgamodes.c vgasrc/stdvgaio.c \
> vgasrc/clext.c vgasrc/bochsvga.c vgasrc/geodevga.c
>
> -CFLAGS16VGA = $(CFLAGS16INC) -Isrc
> +CFLAGS16VGA = $(CFLAGS16INC) -Isrc -DMODEVGA=1
>
> $(OUT)vgaccode16.raw.s: $(OUT)autoconf.h ; $(call whole-compile, $(CFLAGS16VGA) -S, $(SRCVGA),$@)
>
> diff --git a/src/Kconfig b/src/Kconfig
> index 4ddf9da..7df6c67 100644
> --- a/src/Kconfig
> +++ b/src/Kconfig
> @@ -406,7 +406,7 @@ menu "Debugging"
> Base port for serial - generally 0x3f8, 0x2f8, 0x3e8, or 0x2e8.
>
> config DEBUG_IO
> - depends on QEMU && DEBUG_LEVEL != 0
> + depends on QEMU_HARDWARE && DEBUG_LEVEL != 0
> bool "Special IO port debugging"
> default y
> help
> diff --git a/src/output.c b/src/output.c
> index e623d37..27621f5 100644
> --- a/src/output.c
> +++ b/src/output.c
> @@ -11,6 +11,7 @@
> #include "bregs.h" // struct bregs
> #include "config.h" // CONFIG_*
> #include "biosvar.h" // GET_GLOBAL
> +#include "paravirt.h" // runningOnQEMU
>
> struct putcinfo {
> void (*func)(struct putcinfo *info, char c);
> @@ -77,7 +78,7 @@ putc_debug(struct putcinfo *action, char c)
> {
> if (! CONFIG_DEBUG_LEVEL)
> return;
> - if (CONFIG_DEBUG_IO)
> + if (CONFIG_DEBUG_IO && runningOnQEMU())
> // Send character to debug port.
> outb(c, GET_GLOBAL(DebugOutputPort));
> if (c == '\n')
> diff --git a/src/paravirt.h b/src/paravirt.h
> index 4438273..11343cd 100644
> --- a/src/paravirt.h
> +++ b/src/paravirt.h
> @@ -14,7 +14,7 @@ extern int PlatformRunningOn;
>
> static inline int runningOnQEMU(void) {
> return CONFIG_QEMU || (
> - CONFIG_QEMU_HARDWARE && GET_GLOBAL(PlatformRunningOn) & PF_QEMU);
> + !MODEVGA && CONFIG_QEMU_HARDWARE && GET_GLOBAL(PlatformRunningOn) & PF_QEMU);
> }
> static inline int runningOnXen(void) {
> return CONFIG_XEN && GET_GLOBAL(PlatformRunningOn) & PF_XEN;
More information about the SeaBIOS
mailing list