* [Qemu-devel] [PATCH v2][SEABIOS] Move qemu config port access functions into separate file.
@ 2009-10-04 9:09 Gleb Natapov
2009-10-04 13:01 ` [Qemu-devel] " Kevin O'Connor
0 siblings, 1 reply; 3+ messages in thread
From: Gleb Natapov @ 2009-10-04 9:09 UTC (permalink / raw)
To: Kevin O'Connor; +Cc: qemu-devel
Move qemu config code from smbios.c to its own files. Add support for
-boot menu=on|off qemu option.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
--
v1->v2:
- move qemu_cfg_show_boot_menu() into interactive_bootmenu()
- don't check for qemu config port if coreboot enabled to prevent
problems on real HW.
diff --git a/Makefile b/Makefile
index c4016e8..18c59b4 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ OUT=out/
SRCBOTH=output.c util.c block.c floppy.c ata.c misc.c mouse.c kbd.c pci.c \
serial.c clock.c pic.c cdrom.c ps2port.c smp.c resume.c \
pnpbios.c pirtable.c vgahooks.c pmm.c ramdisk.c \
- usb.c usb-uhci.c usb-hid.c
+ usb.c usb-uhci.c usb-hid.c pv.c
SRC16=$(SRCBOTH) system.c disk.c apm.c pcibios.c font.c
SRC32=$(SRCBOTH) post.c shadow.c memmap.c coreboot.c boot.c \
acpi.c smm.c mptable.c smbios.c pciinit.c optionroms.c mtrr.c \
diff --git a/src/boot.c b/src/boot.c
index 7b74007..266283a 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -12,6 +12,7 @@
#include "bregs.h" // struct bregs
#include "boot.h" // struct ipl_s
#include "cmos.h" // inb_cmos
+#include "pv.h"
struct ipl_s IPL;
@@ -206,7 +207,7 @@ menu_show_cbfs(struct ipl_entry_s *ie, int menupos)
static void
interactive_bootmenu()
{
- if (! CONFIG_BOOTMENU)
+ if (! CONFIG_BOOTMENU || ! qemu_cfg_show_boot_menu())
return;
while (get_keystroke(0) >= 0)
diff --git a/src/post.c b/src/post.c
index f72e134..e8ae3f0 100644
--- a/src/post.c
+++ b/src/post.c
@@ -20,6 +20,7 @@
#include "mptable.h" // mptable_init
#include "boot.h" // IPL
#include "usb.h" // usb_setup
+#include "pv.h"
void
__set_irq(int vector, void *loc)
@@ -184,6 +185,8 @@ post()
serial_setup();
mouse_setup();
+ qemu_cfg_port_probe();
+
init_bios_tables();
boot_setup();
diff --git a/src/pv.c b/src/pv.c
new file mode 100644
index 0000000..687244e
--- /dev/null
+++ b/src/pv.c
@@ -0,0 +1,65 @@
+#include "config.h"
+#include "ioport.h"
+#include "pv.h"
+
+int qemu_cfg_present;
+
+static void
+qemu_cfg_select(u16 f)
+{
+ outw(f, PORT_QEMU_CFG_CTL);
+}
+
+static void
+qemu_cfg_read(u8 *buf, int len)
+{
+ while (len--)
+ *(buf++) = inb(PORT_QEMU_CFG_DATA);
+}
+
+static void
+qemu_cfg_read_entry(void *buf, int e, int len)
+{
+ qemu_cfg_select(e);
+ qemu_cfg_read(buf, len);
+}
+
+void qemu_cfg_port_probe(void)
+{
+ char *sig = "QEMU";
+ int i;
+
+ if (CONFIG_COREBOOT)
+ return;
+
+ qemu_cfg_present = 1;
+
+ qemu_cfg_select(QEMU_CFG_SIGNATURE);
+
+ for (i = 0; i < 4; i++)
+ if (inb(PORT_QEMU_CFG_DATA) != sig[i]) {
+ qemu_cfg_present = 0;
+ break;
+ }
+ dprintf(4, "qemu_cfg_present=%d\n", qemu_cfg_present);
+}
+
+void qemu_cfg_get_uuid(u8 *uuid)
+{
+ if (!qemu_cfg_present)
+ return;
+
+ qemu_cfg_read_entry(uuid, QEMU_CFG_UUID, 16);
+}
+
+int qemu_cfg_show_boot_menu(void)
+{
+ u16 v;
+ if (!qemu_cfg_present)
+ return 1;
+
+ qemu_cfg_read_entry(&v, QEMU_CFG_BOOT_MENU, sizeof(v));
+
+ return v;
+}
+
diff --git a/src/pv.h b/src/pv.h
new file mode 100644
index 0000000..6997cff
--- /dev/null
+++ b/src/pv.h
@@ -0,0 +1,44 @@
+#ifndef __PV_H
+#define __PV_H
+
+#include "util.h"
+
+/* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx. It
+ * should be used to determine that a VM is running under KVM.
+ */
+#define KVM_CPUID_SIGNATURE 0x40000000
+
+static inline int kvm_para_available(void)
+{
+ unsigned int eax, ebx, ecx, edx;
+ char signature[13];
+
+ cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx);
+ memcpy(signature + 0, &ebx, 4);
+ memcpy(signature + 4, &ecx, 4);
+ memcpy(signature + 8, &edx, 4);
+ signature[12] = 0;
+
+ if (strcmp(signature, "KVMKVMKVM") == 0)
+ return 1;
+
+ return 0;
+}
+
+#define QEMU_CFG_SIGNATURE 0x00
+#define QEMU_CFG_ID 0x01
+#define QEMU_CFG_UUID 0x02
+#define QEMU_CFG_NUMA 0x0d
+#define QEMU_CFG_BOOT_MENU 0x0e
+#define QEMU_CFG_MAX_CPUS 0x0f
+#define QEMU_CFG_ARCH_LOCAL 0x8000
+#define QEMU_CFG_ACPI_TABLES (QEMU_CFG_ARCH_LOCAL + 0)
+#define QEMU_CFG_SMBIOS_ENTRIES (QEMU_CFG_ARCH_LOCAL + 1)
+
+extern int qemu_cfg_present;
+
+void qemu_cfg_port_probe(void);
+int qemu_cfg_show_boot_menu(void);
+void qemu_cfg_get_uuid(u8 *uuid);
+
+#endif
diff --git a/src/smbios.c b/src/smbios.c
index 6fbddd9..b205352 100644
--- a/src/smbios.c
+++ b/src/smbios.c
@@ -7,33 +7,12 @@
#include "util.h" // dprintf
#include "biosvar.h" // GET_EBDA
-
+#include "pv.h"
/****************************************************************
* UUID probe
****************************************************************/
-#define QEMU_CFG_SIGNATURE 0x00
-#define QEMU_CFG_ID 0x01
-#define QEMU_CFG_UUID 0x02
-
-static void
-qemu_cfg_read(u8 *buf, u16 f, int len)
-{
- outw(f, PORT_QEMU_CFG_CTL);
- while (len--)
- *(buf++) = inb(PORT_QEMU_CFG_DATA);
-}
-
-static int
-qemu_cfg_port_probe()
-{
- u8 sig[4] = "QEMU";
- u8 buf[4];
- qemu_cfg_read(buf, QEMU_CFG_SIGNATURE, 4);
- return *(u32*)buf == *(u32*)sig;
-}
-
static void
uuid_probe(u8 *bios_uuid)
{
@@ -44,11 +23,8 @@ uuid_probe(u8 *bios_uuid)
return;
if (CONFIG_COREBOOT)
return;
- if (! qemu_cfg_port_probe())
- // Feature not available
- return;
- qemu_cfg_read(bios_uuid, QEMU_CFG_UUID, 16);
+ qemu_cfg_get_uuid(bios_uuid);
}
--
Gleb.
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [Qemu-devel] Re: [PATCH v2][SEABIOS] Move qemu config port access functions into separate file.
2009-10-04 9:09 [Qemu-devel] [PATCH v2][SEABIOS] Move qemu config port access functions into separate file Gleb Natapov
@ 2009-10-04 13:01 ` Kevin O'Connor
2009-10-04 13:06 ` Gleb Natapov
0 siblings, 1 reply; 3+ messages in thread
From: Kevin O'Connor @ 2009-10-04 13:01 UTC (permalink / raw)
To: Gleb Natapov; +Cc: qemu-devel
On Sun, Oct 04, 2009 at 11:09:07AM +0200, Gleb Natapov wrote:
>
> Move qemu config code from smbios.c to its own files. Add support for
> -boot menu=on|off qemu option.
Thanks Gleb.
Please rename the "pv" files - at a minimum to "paravirt", although I
think "qemucfg" or "emucfg" is more appropriate.
The other thing is new ".c" files need a one line description and a
copyright at the top. If you don't care about the copyright then just
reuse Fabrice's from smbios.c.
If you wish, I can make these changes.
-Kevin
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Qemu-devel] Re: [PATCH v2][SEABIOS] Move qemu config port access functions into separate file.
2009-10-04 13:01 ` [Qemu-devel] " Kevin O'Connor
@ 2009-10-04 13:06 ` Gleb Natapov
0 siblings, 0 replies; 3+ messages in thread
From: Gleb Natapov @ 2009-10-04 13:06 UTC (permalink / raw)
To: Kevin O'Connor; +Cc: qemu-devel
On Sun, Oct 04, 2009 at 09:01:09AM -0400, Kevin O'Connor wrote:
> On Sun, Oct 04, 2009 at 11:09:07AM +0200, Gleb Natapov wrote:
> >
> > Move qemu config code from smbios.c to its own files. Add support for
> > -boot menu=on|off qemu option.
>
> Thanks Gleb.
>
> Please rename the "pv" files - at a minimum to "paravirt", although I
> think "qemucfg" or "emucfg" is more appropriate.
>
I want to put things like kvm_para_available() there too. qemucfg naming
suggest that this is only qemu fw_cfg driver, but I want it to be more.
I'll rename it to paravirt.[ch]
> The other thing is new ".c" files need a one line description and a
> copyright at the top. If you don't care about the copyright then just
> reuse Fabrice's from smbios.c.
>
> If you wish, I can make these changes.
>
I'll resend.
--
Gleb.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-10-04 13:06 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-04 9:09 [Qemu-devel] [PATCH v2][SEABIOS] Move qemu config port access functions into separate file Gleb Natapov
2009-10-04 13:01 ` [Qemu-devel] " Kevin O'Connor
2009-10-04 13:06 ` Gleb Natapov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).