On Fri, Nov 30, 2018 at 2:06 PM Gerd Hoffmann <kra...@redhat.com> wrote: > > Hi, > > > > Note: All these tests are done with CONFIG_DEBUG_LEVEL=0, using > > > CONFIG_DEBUG_LEVEL=1 the boot time grows up to 24 ms, maybe we should > > > put CONFIG_DEBUG_LEVEL=0 in the SeaBIOS configuration used in QEMU. > > > > I think the main seabios binary should have CONFIG_DEBUG_LEVEL=1 as it > > helps with debug reports. I suppose an additional binary could be > > made for those looking for the fastest possible speed. (The sole cost > > of the debugging is the additional hardware accesses that results from > > those debug messages.) > > The qemu debugcon (CONFIG_DEBUG_IO) is detecable at runtime, it returns > 0xe9 on port reads. So we should be able to skip that too. IIRC it > isn't *that* straightforward as seabios is initially mapped read/only so > a simple probe-on-first-putchar, then cache the result in a variable > doesn't work. We could probe after make_bios_writable though which > should still avoid printing most of the messages.
Great! I just tried the patch below and it works as you said. If I don't have debugcon in QEMU the outs are avoided and the speed is not bad (11.4 ms). If I have debugcon (iobase=0x402), I can see the output. Do you think can be an acceptable trade-off? Thanks. Stefano diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c index 0770c47..31c080e 100644 --- a/src/fw/paravirt.c +++ b/src/fw/paravirt.c @@ -121,6 +121,10 @@ qemu_preinit(void) kvm_detect(); } + // Detect qemu debugcon + if (inb(GET_GLOBAL(DebugOutputPort)) != QEMU_DEBUGCON_READBACK) + DebugOutputPort = 0; + // On emulators, get memory size from nvram. u32 rs = ((rtc_read(CMOS_MEM_EXTMEM2_LOW) << 16) | (rtc_read(CMOS_MEM_EXTMEM2_HIGH) << 24)); diff --git a/src/fw/paravirt.h b/src/fw/paravirt.h index a14d83e..f7e1d4c 100644 --- a/src/fw/paravirt.h +++ b/src/fw/paravirt.h @@ -49,6 +49,9 @@ static inline int runningOnKVM(void) { // QEMU_CFG_DMA ID bit #define QEMU_CFG_VERSION_DMA 2 +// QEMU debugcon read value +#define QEMU_DEBUGCON_READBACK 0xe9 + int qemu_cfg_enabled(void); int qemu_cfg_dma_enabled(void); void qemu_preinit(void); diff --git a/src/hw/serialio.c b/src/hw/serialio.c index 319a85c..4e0f2ac 100644 --- a/src/hw/serialio.c +++ b/src/hw/serialio.c @@ -107,7 +107,7 @@ u16 DebugOutputPort VARFSEG = 0x402; void qemu_debug_putc(char c) { - if (CONFIG_DEBUG_IO && runningOnQEMU()) + if (CONFIG_DEBUG_IO && runningOnQEMU() && GET_GLOBAL(DebugOutputPort)) // Send character to debug port. outb(c, GET_GLOBAL(DebugOutputPort)); } > > cheers, > Gerd > -- Stefano Garzarella Red Hat _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios