[SeaBIOS] [PATCH] qemu: avoid debug prints if debugcon is not enabled
Stefano Garzarella
sgarzare at redhat.com
Tue Dec 11 10:10:33 CET 2018
On Tue, Dec 11, 2018 at 4:08 AM Kevin O'Connor <kevin at koconnor.net> wrote:
>
> On Sun, Dec 02, 2018 at 02:10:13PM +0100, Stefano Garzarella wrote:
> > In order to speed up the boot phase, we can check the QEMU
> > debugcon device, and disable the writes if it is not recognized.
> >
> > This patch allow us to save around 10 msec (time measured
> > between SeaBIOS entry point and "linuxboot" entry point)
> > when CONFIG_DEBUG_LEVEL=1 and debugcon is not enabled.
>
> Thanks. In order to properly track reboots, the HaveRunPost variable
> must always be the first global variable to be modified. So, the qemu
> debug init must come later in the boot. How about the patch below
> instead?
Thanks for the explanation! It looks good!
Cheers,
Stefano
>
> -Kevin
>
>
> commit 75b42835134553c96f113e5014072c0caf99d092 (HEAD -> master)
> Author: Stefano Garzarella <sgarzare at redhat.com>
> Date: Sun Dec 2 14:10:13 2018 +0100
>
> qemu: avoid debug prints if debugcon is not enabled
>
> In order to speed up the boot phase, we can check the QEMU
> debugcon device, and disable the writes if it is not recognized.
>
> This patch allow us to save around 10 msec (time measured
> between SeaBIOS entry point and "linuxboot" entry point)
> when CONFIG_DEBUG_LEVEL=1 and debugcon is not enabled.
>
> Signed-off-by: Stefano Garzarella <sgarzare at redhat.com>
> Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
>
> diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c
> index 0770c47..4fcd8f5 100644
> --- a/src/fw/paravirt.c
> +++ b/src/fw/paravirt.c
> @@ -75,6 +75,9 @@ static void qemu_detect(void)
> if (!CONFIG_QEMU_HARDWARE)
> return;
>
> + // Setup QEMU debug output port
> + qemu_debug_preinit();
> +
> // check northbridge @ 00:00.0
> u16 v = pci_config_readw(0, PCI_VENDOR_ID);
> if (v == 0x0000 || v == 0xffff)
> 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..3163344 100644
> --- a/src/hw/serialio.c
> +++ b/src/hw/serialio.c
> @@ -103,11 +103,23 @@ serial_debug_flush(void)
>
> u16 DebugOutputPort VARFSEG = 0x402;
>
> +void
> +qemu_debug_preinit(void)
> +{
> + /* Check if the QEMU debug output port is active */
> + if (CONFIG_DEBUG_IO &&
> + inb(GET_GLOBAL(DebugOutputPort)) != QEMU_DEBUGCON_READBACK)
> + DebugOutputPort = 0;
> +}
> +
> // Write a character to the special debugging port.
> void
> qemu_debug_putc(char c)
> {
> - if (CONFIG_DEBUG_IO && runningOnQEMU())
> + if (!CONFIG_DEBUG_IO || !runningOnQEMU())
> + return;
> + u16 port = GET_GLOBAL(DebugOutputPort);
> + if (port)
> // Send character to debug port.
> - outb(c, GET_GLOBAL(DebugOutputPort));
> + outb(c, port);
> }
> diff --git a/src/hw/serialio.h b/src/hw/serialio.h
> index 88296fe..81fed30 100644
> --- a/src/hw/serialio.h
> +++ b/src/hw/serialio.h
> @@ -24,6 +24,7 @@ void serial_debug_preinit(void);
> void serial_debug_putc(char c);
> void serial_debug_flush(void);
> extern u16 DebugOutputPort;
> +void qemu_debug_preinit(void);
> void qemu_debug_putc(char c);
>
> #endif // serialio.h
--
Stefano Garzarella
Red Hat
More information about the SeaBIOS
mailing list