kvm: libkvm/qemu: Support in-kernel PIT model
PATCH 2/2 kvm: libkvm/qemu: Support in-kernel PIT model
From 953edae7758f8414cc8de7edfc21699e6edc39cf Mon Sep 17 00:00:00 2001
From: Sheng Yang <[email protected]>
Date: Sun, 27 Jan 2008 11:25:29 +0800
Subject: [PATCH] kvm: libkvm/qemu: Support in-kernel PIT model
Add QEMU parameter for in-kernel PIT. Also disable userspace PIT when we using the in-kernel one.
--- kernel/Kbuild | 2 +- libkvm/kvm-common.h | 2 ++ libkvm/libkvm.c | 20 ++++++++++++++++++++ qemu/hw/pc.c | 6 ++++++ qemu/qemu-kvm.c | 4 ++++ qemu/qemu-kvm.h | 1 + qemu/vl.c | 6 ++++++ 7 files changed, 40 insertions(+), 1 deletions(-)
kernel/Kbuild +1 -1
@@ -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
libkvm/kvm-common.h +2 -0
@@ -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 );
libkvm/libkvm.c +19 -0
@@ -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;
qemu/hw/pc.c +0 -0
@@ -986,8 +986,14 @@ static void pc_init1(ram_addr_t ram_size, int
vga_ram_size,
if (pci_enabled) {
ioapic = ioapic_init();
}
+#ifdef USE_KVM
+ if (!kvm_allowed || !kvm_pit) {
+#endif
pit = pit_init(0x40, i8259[0]);
pcspk_init(pit);
+#ifdef USE_KVM
+ }
+#endif
if (pci_enabled) {
pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
}qemu/qemu-kvm.c +4 -0
@@ -10,6 +10,7 @@int kvm_allowed =KVM_ALLOWED_DEFAULT ;int kvm_irqchip =1 ; +int kvm_pit =1 ;#ifdef USE_KVM
@@ -535,6 +536,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 ;
qemu/qemu-kvm.h +1 -0
@@ -46,6 +46,7 @@ void qemu_kvm_aio_wait_end(void);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);
qemu/vl.c +1 -0
@@ -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 953edae7758f8414cc8de7edfc21699e6edc39cf Mon Sep 17 00:00:00 2001
From: Sheng Yang <[email protected]>
Date: Sun, 27 Jan 2008 11:25:29 +0800
Subject: [PATCH] kvm: libkvm/qemu: Support in-kernel PIT model
Add QEMU parameter for in-kernel PIT. Also disable userspace PIT when we using the in-kernel one.
--- kernel/Kbuild | 2 +- libkvm/kvm-common.h | 2 ++ libkvm/libkvm.c | 20 ++++++++++++++++++++ qemu/hw/pc.c | 6 ++++++ qemu/qemu-kvm.c | 4 ++++ qemu/qemu-kvm.h | 1 + qemu/vl.c | 6 ++++++ 7 files changed, 40 insertions(+), 1 deletions(-)
kernel/Kbuild +1 -1
@@ -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
libkvm/kvm-common.h +2 -0
@@ -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 );
libkvm/libkvm.c +20 -0
@@ -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;
qemu/hw/pc.c +6 -0
@@ -986,8 +986,14 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,if (pci_enabled) { ioapic =ioapic_init (); } +#ifdef USE_KVM +if (!kvm_allowed || !kvm_pit) { +#endif pit =pit_init (0x40 , i8259[0 ]);pcspk_init (pit); +#ifdef USE_KVM + } +#endif if (pci_enabled) {pic_set_alt_irq_func (isa_pic, ioapic_set_irq, ioapic); }
qemu/qemu-kvm.c +4 -0
@@ -10,6 +10,7 @@int kvm_allowed =KVM_ALLOWED_DEFAULT ;int kvm_irqchip =1 ; +int kvm_pit =1 ;#ifdef USE_KVM
@@ -535,6 +536,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 ;
qemu/qemu-kvm.h +1 -0
@@ -46,6 +46,7 @@ void qemu_kvm_aio_wait_end(void);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);
qemu/vl.c +6 -0
@@ -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 ;
Signature · 1 line
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 [email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel
A message that is not in the archive (sent off-list or not yet received): 200801281446.30147.sheng.yang-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org
Quoted 5 lines · Sheng
libkvm/libkvm.c +3
-0+void kvm_create_pit (kvm_context_t kvm) +{ +int r;
libkvm/libkvm.c void kvm_create_irqchip(kvm_context_t kvm) · line 388
Quoted 10 lines
libkvm/libkvm.c +10
-0+ +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" ); + } + } +}
Need to protect this with #ifdef KVM_CAP_PIT to support compilation with older kernels. If support is not available, qemu should fall back to userspace pit.
Please separate the qemu and libkvm parts.
Signature · 7 lines
error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- 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/