[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