[SeaBIOS] [BROKEN RFC 0/5] can we enable the qemu debug port for real-mode code?
Kevin O'Connor
kevin at koconnor.net
Wed Feb 13 06:19:36 CET 2013
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 it's possible to get it working
with CONFIG_QEMU_HARDWARE with something like the patch below.
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.)
-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