From 5f7e9bf8856602cf8ffcb50ff744ee1d0058a850 Mon Sep 17 00:00:00 2001
From: Sheng Yang <[EMAIL PROTECTED]>
Date: Mon, 21 Jan 2008 16:41:47 +0800
Subject: [PATCH] kvm: libkvm: In-kernel PIT model


Signed-off-by: Sheng Yang <[EMAIL PROTECTED]>
---
 kernel/Kbuild       |    2 +-
 libkvm/kvm-common.h |    2 ++
 libkvm/libkvm.c     |   20 ++++++++++++++++++++
 qemu/qemu-kvm.c     |    4 ++++
 qemu/qemu-kvm.h     |    1 +
 qemu/vl.c           |    6 ++++++
 6 files changed, 34 insertions(+), 1 deletions(-)

diff --git a/kernel/Kbuild b/kernel/Kbuild
index ed02f5a..014cc17 100644
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -1,7 +1,7 @@
 EXTRA_CFLAGS := -I$(src)/include -include $(src)/external-module-compat.h
 obj-m := kvm.o kvm-intel.o kvm-amd.o
 kvm-objs := kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o i8259.o 
\
-        lapic.o ioapic.o preempt.o
+        lapic.o ioapic.o preempt.o i8254.o
 kvm-intel-objs := vmx.o vmx-debug.o
 kvm-amd-objs := svm.o
 
diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h
index f4040be..bd9f1de 100644
--- a/libkvm/kvm-common.h
+++ b/libkvm/kvm-common.h
@@ -47,6 +47,8 @@ struct kvm_context {
        int no_irqchip_creation;
        /// in-kernel irqchip status
        int irqchip_in_kernel;
+       /// do not create in-kernel pit if set
+       int no_pit_creation;
 };
 
 void init_slots(void);
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 45f58d6..15e7c0d 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -271,6 +271,11 @@ void kvm_disable_irqchip_creation(kvm_context_t kvm)
        kvm->no_irqchip_creation = 1;
 }
 
+void kvm_disable_pit_creation(kvm_context_t kvm)
+{
+       kvm->no_pit_creation = 1;
+}
+
 int kvm_create_vcpu(kvm_context_t kvm, int slot)
 {
        long mmap_size;
@@ -368,6 +373,20 @@ void kvm_create_irqchip(kvm_context_t kvm)
 #endif
 }
 
+void kvm_create_pit(kvm_context_t kvm)
+{
+       int r;
+
+       if (!kvm->no_pit_creation) {
+               r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT);
+               if (r > 0) {
+                       r = ioctl(kvm->vm_fd, KVM_CREATE_PIT);
+                       if (r < 0)
+                               printf("Create kernel PIC irqchip failed\n");
+               }
+       }
+}
+
 int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void 
**vm_mem)
 {
        int r;
@@ -383,6 +402,7 @@ int kvm_create(kvm_context_t kvm, unsigned long 
phys_mem_bytes, void **vm_mem)
        if (r < 0)
                return r;
        kvm_create_irqchip(kvm);
+       kvm_create_pit(kvm);
        r = kvm_create_vcpu(kvm, 0);
        if (r < 0)
                return r;
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index fddbbd6..a4f4761 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -10,6 +10,7 @@
 
 int kvm_allowed = KVM_ALLOWED_DEFAULT;
 int kvm_irqchip = 1;
+int kvm_pit = 1;
 
 #ifdef USE_KVM
 
@@ -556,6 +557,9 @@ int kvm_qemu_create_context(void)
     if (!kvm_irqchip) {
         kvm_disable_irqchip_creation(kvm_context);
     }
+    if (!kvm_pit) {
+        kvm_disable_pit_creation(kvm_context);
+    }
     if (kvm_create(kvm_context, phys_ram_size, (void**)&phys_ram_base) < 0) {
        kvm_qemu_destroy();
        return -1;
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
index c4514bb..883a4da 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -42,6 +42,7 @@ void kvm_arch_update_regs_for_sipi(CPUState *env);
 
 extern int kvm_allowed;
 extern int kvm_irqchip;
+extern int kvm_pit;
 
 void kvm_tpr_opt_setup(CPUState *env);
 void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write);
diff --git a/qemu/vl.c b/qemu/vl.c
index 756e13d..5b76c8d 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -8015,6 +8015,7 @@ static void help(int exitcode)
 #ifdef USE_KVM
           "-no-kvm         disable KVM hardware virtualization\n"
           "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n"
+          "-no-kvm-pit     disable KVM kernel mode PIT\n"
 #endif
 #ifdef TARGET_I386
            "-std-vga        simulate a standard VGA card with VESA Bochs 
Extensions\n"
@@ -8131,6 +8132,7 @@ enum {
     QEMU_OPTION_no_acpi,
     QEMU_OPTION_no_kvm,
     QEMU_OPTION_no_kvm_irqchip,
+    QEMU_OPTION_no_kvm_pit,
     QEMU_OPTION_no_reboot,
     QEMU_OPTION_show_cursor,
     QEMU_OPTION_daemonize,
@@ -8213,6 +8215,7 @@ const QEMUOption qemu_options[] = {
 #ifdef USE_KVM
     { "no-kvm", 0, QEMU_OPTION_no_kvm },
     { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip },
+    { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit },
 #endif
 #if defined(TARGET_PPC) || defined(TARGET_SPARC)
     { "g", 1, QEMU_OPTION_g },
@@ -9046,6 +9049,9 @@ int main(int argc, char **argv)
            case QEMU_OPTION_no_kvm_irqchip:
                kvm_irqchip = 0;
                break;
+           case QEMU_OPTION_no_kvm_pit:
+               kvm_pit = 0;
+               break;
 #endif
             case QEMU_OPTION_usb:
                 usb_enabled = 1;
-- 
debian.1.5.3.7.1-dirty

From 5f7e9bf8856602cf8ffcb50ff744ee1d0058a850 Mon Sep 17 00:00:00 2001
From: Sheng Yang <[EMAIL PROTECTED]>
Date: Mon, 21 Jan 2008 16:41:47 +0800
Subject: [PATCH] kvm: libkvm: In-kernel PIT model


Signed-off-by: Sheng Yang <[EMAIL PROTECTED]>
---
 kernel/Kbuild       |    2 +-
 libkvm/kvm-common.h |    2 ++
 libkvm/libkvm.c     |   20 ++++++++++++++++++++
 qemu/qemu-kvm.c     |    4 ++++
 qemu/qemu-kvm.h     |    1 +
 qemu/vl.c           |    6 ++++++
 6 files changed, 34 insertions(+), 1 deletions(-)

diff --git a/kernel/Kbuild b/kernel/Kbuild
index ed02f5a..014cc17 100644
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -1,7 +1,7 @@
 EXTRA_CFLAGS := -I$(src)/include -include $(src)/external-module-compat.h
 obj-m := kvm.o kvm-intel.o kvm-amd.o
 kvm-objs := kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o i8259.o \
-	 lapic.o ioapic.o preempt.o
+	 lapic.o ioapic.o preempt.o i8254.o
 kvm-intel-objs := vmx.o vmx-debug.o
 kvm-amd-objs := svm.o
 
diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h
index f4040be..bd9f1de 100644
--- a/libkvm/kvm-common.h
+++ b/libkvm/kvm-common.h
@@ -47,6 +47,8 @@ struct kvm_context {
 	int no_irqchip_creation;
 	/// in-kernel irqchip status
 	int irqchip_in_kernel;
+	/// do not create in-kernel pit if set
+	int no_pit_creation;
 };
 
 void init_slots(void);
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 45f58d6..15e7c0d 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -271,6 +271,11 @@ void kvm_disable_irqchip_creation(kvm_context_t kvm)
 	kvm->no_irqchip_creation = 1;
 }
 
+void kvm_disable_pit_creation(kvm_context_t kvm)
+{
+	kvm->no_pit_creation = 1;
+}
+
 int kvm_create_vcpu(kvm_context_t kvm, int slot)
 {
 	long mmap_size;
@@ -368,6 +373,20 @@ void kvm_create_irqchip(kvm_context_t kvm)
 #endif
 }
 
+void kvm_create_pit(kvm_context_t kvm)
+{
+	int r;
+
+	if (!kvm->no_pit_creation) {
+		r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT);
+		if (r > 0) {
+			r = ioctl(kvm->vm_fd, KVM_CREATE_PIT);
+			if (r < 0)
+				printf("Create kernel PIC irqchip failed\n");
+		}
+	}
+}
+
 int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
 {
 	int r;
@@ -383,6 +402,7 @@ int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
 	if (r < 0)
 	        return r;
 	kvm_create_irqchip(kvm);
+	kvm_create_pit(kvm);
 	r = kvm_create_vcpu(kvm, 0);
 	if (r < 0)
 		return r;
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index fddbbd6..a4f4761 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -10,6 +10,7 @@
 
 int kvm_allowed = KVM_ALLOWED_DEFAULT;
 int kvm_irqchip = 1;
+int kvm_pit = 1;
 
 #ifdef USE_KVM
 
@@ -556,6 +557,9 @@ int kvm_qemu_create_context(void)
     if (!kvm_irqchip) {
         kvm_disable_irqchip_creation(kvm_context);
     }
+    if (!kvm_pit) {
+        kvm_disable_pit_creation(kvm_context);
+    }
     if (kvm_create(kvm_context, phys_ram_size, (void**)&phys_ram_base) < 0) {
 	kvm_qemu_destroy();
 	return -1;
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
index c4514bb..883a4da 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -42,6 +42,7 @@ void kvm_arch_update_regs_for_sipi(CPUState *env);
 
 extern int kvm_allowed;
 extern int kvm_irqchip;
+extern int kvm_pit;
 
 void kvm_tpr_opt_setup(CPUState *env);
 void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write);
diff --git a/qemu/vl.c b/qemu/vl.c
index 756e13d..5b76c8d 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -8015,6 +8015,7 @@ static void help(int exitcode)
 #ifdef USE_KVM
 	   "-no-kvm         disable KVM hardware virtualization\n"
 	   "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n"
+	   "-no-kvm-pit	    disable KVM kernel mode PIT\n"
 #endif
 #ifdef TARGET_I386
            "-std-vga        simulate a standard VGA card with VESA Bochs Extensions\n"
@@ -8131,6 +8132,7 @@ enum {
     QEMU_OPTION_no_acpi,
     QEMU_OPTION_no_kvm,
     QEMU_OPTION_no_kvm_irqchip,
+    QEMU_OPTION_no_kvm_pit,
     QEMU_OPTION_no_reboot,
     QEMU_OPTION_show_cursor,
     QEMU_OPTION_daemonize,
@@ -8213,6 +8215,7 @@ const QEMUOption qemu_options[] = {
 #ifdef USE_KVM
     { "no-kvm", 0, QEMU_OPTION_no_kvm },
     { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip },
+    { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit },
 #endif
 #if defined(TARGET_PPC) || defined(TARGET_SPARC)
     { "g", 1, QEMU_OPTION_g },
@@ -9046,6 +9049,9 @@ int main(int argc, char **argv)
 	    case QEMU_OPTION_no_kvm_irqchip:
 		kvm_irqchip = 0;
 		break;
+	    case QEMU_OPTION_no_kvm_pit:
+		kvm_pit = 0;
+		break;
 #endif
             case QEMU_OPTION_usb:
                 usb_enabled = 1;
-- 
debian.1.5.3.7.1-dirty

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to