[SeaBIOS] [RFC 0/2] QEMU fw_cfg dma interface
Kevin O'Connor
kevin at koconnor.net
Wed Jul 22 18:13:19 CEST 2015
On Wed, Jul 22, 2015 at 05:01:02PM +0200, Marc Marí wrote:
> On Tue, 21 Jul 2015 12:47:47 -0400
> "Kevin O'Connor" <kevin at koconnor.net> wrote:
> > On Tue, Jul 21, 2015 at 06:06:09PM +0200, Marc Marí wrote:
> > > These patches, with the support in QEMU (patches in the QEMU mailing
> > > list) make the Linux kernel setup and boot approximately 10x faster.
> >
> > Thanks. How do the timings with this support compare with the qboot
> > and seabios+cbfs runs?
>
> The boot time for a standard SeaBIOS (with the default configuration
> options) is this:
>
> QEMU startup time: .032
> BIOS startup time: .154
> fw_cfg setup time: .375
> Total time: .562
>
> The boot time for a standard SeaBIOS with the CBFS patch is this:
>
> QEMU startup time: .036
> BIOS startup time: .184
> Kernel setup time: .003
> Total time: .223
>
> The boot time for a standard SeaBIOS with the fw_cfg DMA interface patch
> is this:
>
> QEMU startup time: .036
> BIOS startup time: .140
> Kernel setup time: .026
> Total time: .202
Thanks. In case anyone is curious, if your runs are similar to my
runs then the standard SeaBIOS time is likely:
100ms - ps2port reset wait (see ugly patch below to get around it)
~18ms - vga init (can avoid by adding "-device VGA,romfile=" to qemu)
~12ms - shadow ram enable/lock
~10ms - debug writes (avoid with seabios CONFIG_DEBUG_LEVEL=0)
~4ms - pci init
2ms - cpu timestamp counter calibration
-Kevin
--- a/src/hw/ps2port.c
+++ b/src/hw/ps2port.c
@@ -6,6 +6,7 @@
// This file may be distributed under the terms of the GNU LGPLv3 license.
#include "biosvar.h" // GET_LOW
+#include "fw/paravirt.h" // runningOnQEMU
#include "output.h" // dprintf
#include "pic.h" // pic_eoi1
#include "ps2port.h" // ps2_kbd_command
@@ -481,7 +482,8 @@ ps2_keyboard_setup(void *data)
int spinupdelay = romfile_loadint("etc/ps2-keyboard-spinup", 0);
u32 end = timer_calc(spinupdelay);
for (;;) {
- ret = ps2_kbd_command(ATKBD_CMD_RESET_BAT, param);
+ int cmd = runningOnQEMU() ? ATKBD_CMD_RESET_BAT1 : ATKBD_CMD_RESET_BAT;
+ ret = ps2_kbd_command(cmd, param);
if (!ret)
break;
if (timer_check(end)) {
diff --git a/src/hw/ps2port.h b/src/hw/ps2port.h
index dc0e430..2748624 100644
--- a/src/hw/ps2port.h
+++ b/src/hw/ps2port.h
@@ -27,6 +27,7 @@
#define ATKBD_CMD_ENABLE 0x00f4
#define ATKBD_CMD_RESET_DIS 0x00f5
#define ATKBD_CMD_RESET_BAT 0x02ff
+#define ATKBD_CMD_RESET_BAT1 0x01ff
// Mouse commands
#define PSMOUSE_CMD_SETSCALE11 0x00e6
More information about the SeaBIOS
mailing list