Hi,
Background: The drivers in seabios work on both virtual and physical hardware (you can run seabios as coreboot payload on physical hardware). There are quite a few places where are delays and timeouts which are required to work properly on physical hardware. But typically virtual hardware is alot faster. There is -- for example -- no time needed to establish a sata link. Link detection in ahci is instant on qemu.
I'll investigate also other timeouts.
I'd focus on legacy lpc/isa hardware here. PCI-ish hardware which has such timeouts (sata, usb, ...) typically isn't present in the virtual machine if you care about performance. Or, in other words, the best way to handle the sata link detection delay is to use "qemu -M q35,sata=off".
cheers, Gerd
Hi, I continued to investigate how to reduce the boot time with SeaBIOS and QEMU when it used with linuxboot_dma.bin (-kernel parameter). I reached ~12ms with a SeaBIOS configuration (attached) where I disabled debug output, all Hardware support (except SMM & MTRRs) and I applied a small patch to disable VGA setup and console (attached).
Samuel, I put also the total time to userspace (linux_start_user) adding a probe in the kernel_init() and when I disabled the VGA in the SeaBIOS I noticed also a speed up in the kernel boot phase.
Another approach that I tried, obtaining similar results, is to recognize the linuxboot_dma.bin at runtime, then skip device_hardware_setup(), enable_vga_console(), and vgarom_setup(). In this case, I used the default configuration without disabling anything.
Gerd, Kevin do you think these approaches can be acceptable in SeaBIOS?
Thanks, Stefano
Booting times with several configurations: - SeaBIOS default config + Stephen's TPM patch qemu_init_end: 40.342836 fw_start: 40.528355 (+0.185519) fw_do_boot: 108.679648 (+68.151293) linux_start_boot: 110.961394 (+2.281746) linux_start_user: 647.981995 (+537.020601) - SeaBIOS config (CONFIG_DEBUG_LEVEL=0) + Stephen's TPM patch qemu_init_end: 44.533900 fw_start: 44.763200 (+0.229300) fw_do_boot: 98.881728 (+54.118528) linux_start_boot: 100.925424 (+2.043696) linux_start_user: 638.000481 (+537.075057) - SeaBIOS config (CONFIG_DEBUG_LEVEL=0, disable all HW support except SMM & MTRRs) + Stephen's TPM patch qemu_init_end: 42.705257 fw_start: 42.915464 (+0.210207) fw_do_boot: 91.982749 (+49.067285) linux_start_boot: 93.970654 (+1.987905) linux_start_user: 632.916320 (+538.945666) - SeaBIOS config (CONFIG_DEBUG_LEVEL=0, disable all HW support except SMM & MTRRs, CONFIG_DISABLE_VGA=y) + Stephen's TPM patch qemu_init_end: 42.968648 fw_start: 43.154598 (+0.185950) fw_do_boot: 55.808438 (+12.653840) linux_start_boot: 57.170154 (+1.361716) linux_start_user: 529.189856 (+472.019702)
Disable VGA patch: From: Stefano Garzarella sgarzare@redhat.com Date: Thu, 22 Nov 2018 10:55:23 +0100 Subject: [PATCH] qemu: Add CONFIG_DISABLE_VGA to disable VGA setup and console
Allow users to disable VGA setup and console. Useful to speed up the boot with QEMU when -kernel parameter is used. Linux kernel will also initialize the VGA during the boot phase.
Signed-off-by: Stefano Garzarella sgarzare@redhat.com --- src/Kconfig | 7 +++++++ src/bootsplash.c | 2 ++ src/optionroms.c | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/Kconfig b/src/Kconfig index daf8222..b1f0ce6 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -364,6 +364,13 @@ menu "Hardware support" help Support for using the CPU timestamp counter as an internal timing source. + config DISABLE_VGA + depends on QEMU + bool "Disable VGA setup" + default n + help + Skip VGA setup and console (useful to speed up the boot with QEMU + when -kernel parameter is used). endmenu
menu "BIOS interfaces" diff --git a/src/bootsplash.c b/src/bootsplash.c index 165c98d..dde3314 100644 --- a/src/bootsplash.c +++ b/src/bootsplash.c @@ -39,6 +39,8 @@ call16_int10(struct bregs *br) void enable_vga_console(void) { + if (CONFIG_DISABLE_VGA) + return; dprintf(1, "Turning on vga text mode console\n"); struct bregs br;
diff --git a/src/optionroms.c b/src/optionroms.c index fc992f6..a3b5a16 100644 --- a/src/optionroms.c +++ b/src/optionroms.c @@ -428,7 +428,7 @@ vgarom_setup(void) { int have_vga = 0;
- if (! CONFIG_OPTIONROMS) + if (!CONFIG_OPTIONROMS || CONFIG_DISABLE_VGA) return;
dprintf(1, "Scan for VGA option rom\n"); -- 2.19.1
SeaBIOS final configuration: # # Automatically generated file; DO NOT EDIT. # SeaBIOS Configuration #
# # General Features # # CONFIG_COREBOOT is not set CONFIG_QEMU=y # CONFIG_CSM is not set CONFIG_QEMU_HARDWARE=y CONFIG_XEN=y CONFIG_THREADS=y CONFIG_RELOCATE_INIT=y CONFIG_BOOTMENU=y CONFIG_BOOTSPLASH=y CONFIG_BOOTORDER=y CONFIG_ENTRY_EXTRASTACK=y CONFIG_MALLOC_UPPERMEMORY=y CONFIG_ROM_SIZE=0
# # Hardware support # # CONFIG_ATA is not set # CONFIG_AHCI is not set # CONFIG_SDCARD is not set # CONFIG_VIRTIO_BLK is not set # CONFIG_VIRTIO_SCSI is not set # CONFIG_PVSCSI is not set # CONFIG_ESP_SCSI is not set # CONFIG_LSI_SCSI is not set # CONFIG_MEGASAS is not set # CONFIG_MPT_SCSI is not set # CONFIG_FLASH_FLOPPY is not set # CONFIG_NVME is not set # CONFIG_PS2PORT is not set # CONFIG_USB is not set # CONFIG_SERIAL is not set # CONFIG_SERCON is not set # CONFIG_LPT is not set # CONFIG_HARDWARE_IRQ is not set CONFIG_USE_SMM=y CONFIG_CALL32_SMM=y CONFIG_MTRR_INIT=y # CONFIG_PMTIMER is not set # CONFIG_TSC_TIMER is not set CONFIG_DISABLE_VGA=y
# # BIOS interfaces # CONFIG_DRIVES=y CONFIG_CDROM_BOOT=y CONFIG_CDROM_EMU=y CONFIG_PCIBIOS=y CONFIG_APMBIOS=y CONFIG_PNPBIOS=y CONFIG_OPTIONROMS=y CONFIG_PMM=y CONFIG_BOOT=y CONFIG_KEYBOARD=y CONFIG_KBD_CALL_INT15_4F=y CONFIG_MOUSE=y CONFIG_S3_RESUME=y CONFIG_VGAHOOKS=y # CONFIG_DISABLE_A20 is not set # CONFIG_WRITABLE_UPPERMEMORY is not set CONFIG_TCGBIOS=y
# # BIOS Tables # CONFIG_PIRTABLE=y CONFIG_MPTABLE=y CONFIG_SMBIOS=y CONFIG_ACPI=y CONFIG_ACPI_DSDT=y CONFIG_FW_ROMFILE_LOAD=y
# # VGA ROM # CONFIG_NO_VGABIOS=y # CONFIG_VGA_STANDARD_VGA is not set # CONFIG_VGA_CIRRUS is not set # CONFIG_VGA_BOCHS is not set # CONFIG_VGA_GEODEGX2 is not set # CONFIG_VGA_GEODELX is not set # CONFIG_DISPLAY_BOCHS is not set # CONFIG_VGA_RAMFB is not set # CONFIG_BUILD_VGABIOS is not set CONFIG_VGA_EXTRA_STACK_SIZE=512
# # Debugging # CONFIG_DEBUG_LEVEL=0
On Tue, Nov 20, 2018 at 12:22 PM Gerd Hoffmann kraxel@redhat.com wrote:
Hi,
Background: The drivers in seabios work on both virtual and physical hardware (you can run seabios as coreboot payload on physical hardware). There are quite a few places where are delays and timeouts which are required to work properly on physical hardware. But typically virtual hardware is alot faster. There is -- for example -- no time needed to establish a sata link. Link detection in ahci is instant on qemu.
I'll investigate also other timeouts.
I'd focus on legacy lpc/isa hardware here. PCI-ish hardware which has such timeouts (sata, usb, ...) typically isn't present in the virtual machine if you care about performance. Or, in other words, the best way to handle the sata link detection delay is to use "qemu -M q35,sata=off".
cheers, Gerd
-- Stefano Garzarella Red Hat