[SeaBIOS] [PATCH 1/3] Add generic qemu detection

Gleb Natapov gleb at redhat.com
Mon Sep 16 13:10:04 CEST 2013


On Mon, Sep 16, 2013 at 12:36:28PM +0200, Gerd Hoffmann wrote:
> This patch adds support for detecting whenever SeaBIOS runs on qemu
> or not.  This is done by looking at the northbridge (pci device 00:00.0)
> and check the subsystem id.  Most pci devices emulated by qemu -- the
> two northbridges i440fx and q35 included -- have a subsystem id of
> "1af4:1100".
> 
> In case the subsystem ID matches set PF_QEMU, log a message (including
> the northbridge found while being at it) and also check for kvm.
> 
What if other userspace will want to write enough support to run Seabios
as a guest? Why kvm detection depends on QEMU?

> Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
> ---
>  src/fw/paravirt.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 41 insertions(+), 5 deletions(-)
> 
> diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c
> index 2524b7b..357de56 100644
> --- a/src/fw/paravirt.c
> +++ b/src/fw/paravirt.c
> @@ -12,6 +12,7 @@
>  #include "config.h" // CONFIG_QEMU
>  #include "hw/cmos.h" // CMOS_*
>  #include "hw/pci.h" // create_pirtable
> +#include "hw/pci_regs.h" // PCI_DEVICE_ID
>  #include "ioport.h" // outw
>  #include "malloc.h" // malloc_tmp
>  #include "memmap.h" // add_e820
> @@ -35,10 +36,8 @@ int PlatformRunningOn VARFSEG;
>   */
>  #define KVM_CPUID_SIGNATURE     0x40000000
>  
> -static void kvm_preinit(void)
> +static void kvm_detect(void)
>  {
> -    if (!CONFIG_QEMU)
> -        return;
>      unsigned int eax, ebx, ecx, edx;
>      char signature[13];
>  
> @@ -54,9 +53,43 @@ static void kvm_preinit(void)
>      }
>  }
>  
> +static void qemu_detect(void)
> +{
> +    if (!CONFIG_QEMU_HARDWARE)
> +        return;
> +
> +    // check northbridge @ 00:00.0
> +    u16 v = pci_config_readw(0, PCI_VENDOR_ID);
> +    if (v == 0x0000 || v == 0xffff)
> +        return;
> +    u16 d = pci_config_readw(0, PCI_DEVICE_ID);
> +    u16 sv = pci_config_readw(0, PCI_SUBSYSTEM_VENDOR_ID);
> +    u16 sd = pci_config_readw(0, PCI_SUBSYSTEM_ID);
> +
> +    if (sv != 0x1af4 || /* Red Hat, Inc */
> +        sd != 0x1100)   /* Qemu virtual machine */
> +        return;
> +
> +    PlatformRunningOn |= PF_QEMU;
> +    switch (d) {
> +    case 0x1237:
> +        dprintf(1, "Running on QEMU (i440fx)\n");
> +        break;
> +    case 0x29c0:
> +        dprintf(1, "Running on QEMU (q35)\n");
> +        break;
> +    default:
> +        dprintf(1, "Running on QEMU (unknown nb: %04x:%04x)\n", v, d);
> +        break;
> +    }
> +    kvm_detect();
> +}
> +
>  void
>  qemu_preinit(void)
>  {
> +    qemu_detect();
> +
>      if (!CONFIG_QEMU)
>          return;
>  
> @@ -65,8 +98,11 @@ qemu_preinit(void)
>          return;
>      }
>  
> -    PlatformRunningOn = PF_QEMU;
> -    kvm_preinit();
> +    if (!runningOnQEMU()) {
> +        dprintf(1, "Warning: No QEMU Northbridge found (isapc?)\n");
> +        PlatformRunningOn |= PF_QEMU;
> +        kvm_detect();
> +    }
>  
>      // On emulators, get memory size from nvram.
>      u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16)
> -- 
> 1.8.3.1
> 
> 
> _______________________________________________
> SeaBIOS mailing list
> SeaBIOS at seabios.org
> http://www.seabios.org/mailman/listinfo/seabios

--
			Gleb.



More information about the SeaBIOS mailing list