* [PATCH 0/6] in-kernel APIC v5 (usermode side)
@ 2007-05-15 14:59 Gregory Haskins
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
0 siblings, 1 reply; 8+ messages in thread
From: Gregory Haskins @ 2007-05-15 14:59 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Changelog:
1) Incorporated Anthony's feedback regarding the missed use_kernel_apic()
2) Added a new patch to allow new userspace on old kernels
Regards,
-Greg
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/6] KVM: Updates for compiling in-kernel APIC support with external-modules
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
@ 2007-05-15 14:59 ` Gregory Haskins
2007-05-15 14:59 ` [PATCH 2/6] KVM-USER: Make the kvm_allowed flag always defined so we dont need #ifdefs Gregory Haskins
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gregory Haskins @ 2007-05-15 14:59 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Signed-off-by: Gregory Haskins <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
---
kernel/Kbuild | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/kernel/Kbuild b/kernel/Kbuild
index e9bcda7..103a179 100644
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -1,5 +1,5 @@
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 mmu.o x86_emulate.o
+kvm-objs := kvm_main.o mmu.o x86_emulate.o userint.o kernint.o lapic.o
kvm-intel-objs := vmx.o vmx-debug.o
kvm-amd-objs := svm.o
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/6] KVM-USER: Make the kvm_allowed flag always defined so we dont need #ifdefs
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
2007-05-15 14:59 ` [PATCH 1/6] KVM: Updates for compiling in-kernel APIC support with external-modules Gregory Haskins
@ 2007-05-15 14:59 ` Gregory Haskins
2007-05-15 14:59 ` [PATCH 3/6] KVM-USER: Add ability to specify APIC emulation type from the command-line Gregory Haskins
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gregory Haskins @ 2007-05-15 14:59 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Non-performance critical code is made more awkward by having to always define
both "#ifdef KVM" and "if (kvm_allowed)". Define "kvm_allowed = 0" by
default. Anthony Ligouri is credited with the idea.
Signed-off-by: Gregory Haskins <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
---
qemu/qemu-kvm.c | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index 212570a..d4419a3 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -3,6 +3,14 @@
#include "config-host.h"
#ifdef USE_KVM
+ #define KVM_ALLOWED_DEFAULT 1
+#else
+ #define KVM_ALLOWED_DEFAULT 0
+#endif
+
+int kvm_allowed = KVM_ALLOWED_DEFAULT;
+
+#ifdef USE_KVM
#include "exec.h"
@@ -14,7 +22,6 @@
extern void perror(const char *s);
-int kvm_allowed = 1;
kvm_context_t kvm_context;
static struct kvm_msr_list *kvm_msr_list;
static int kvm_has_msr_star;
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/6] KVM-USER: Add ability to specify APIC emulation type from the command-line
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
2007-05-15 14:59 ` [PATCH 1/6] KVM: Updates for compiling in-kernel APIC support with external-modules Gregory Haskins
2007-05-15 14:59 ` [PATCH 2/6] KVM-USER: Make the kvm_allowed flag always defined so we dont need #ifdefs Gregory Haskins
@ 2007-05-15 14:59 ` Gregory Haskins
2007-05-15 15:00 ` [PATCH 4/6] KVM: in-kernel-apic modification to QEMU Gregory Haskins
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gregory Haskins @ 2007-05-15 14:59 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Signed-off-by: Gregory Haskins <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
---
qemu/qemu-kvm.c | 1 +
qemu/vl.c | 5 +++++
qemu/vl.h | 1 +
3 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index d4419a3..faa4684 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -9,6 +9,7 @@
#endif
int kvm_allowed = KVM_ALLOWED_DEFAULT;
+int kvm_apic_level = 1;
#ifdef USE_KVM
diff --git a/qemu/vl.c b/qemu/vl.c
index 7df1c80..986cea4 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -6531,6 +6531,7 @@ enum {
QEMU_OPTION_vnc,
QEMU_OPTION_no_acpi,
QEMU_OPTION_no_kvm,
+ QEMU_OPTION_kvm_apic,
QEMU_OPTION_no_reboot,
QEMU_OPTION_daemonize,
QEMU_OPTION_option_rom,
@@ -6600,6 +6601,7 @@ const QEMUOption qemu_options[] = {
#endif
#ifdef USE_KVM
{ "no-kvm", 0, QEMU_OPTION_no_kvm },
+ { "kvm_apic", HAS_ARG, QEMU_OPTION_kvm_apic },
#endif
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
{ "g", 1, QEMU_OPTION_g },
@@ -7309,6 +7311,9 @@ int main(int argc, char **argv)
case QEMU_OPTION_no_kvm:
kvm_allowed = 0;
break;
+ case QEMU_OPTION_kvm_apic:
+ kvm_apic_level = atoi(optarg);
+ break;
#endif
case QEMU_OPTION_usb:
usb_enabled = 1;
diff --git a/qemu/vl.h b/qemu/vl.h
index debd17c..dec410e 100644
--- a/qemu/vl.h
+++ b/qemu/vl.h
@@ -158,6 +158,7 @@ extern int graphic_depth;
extern const char *keyboard_layout;
extern int kqemu_allowed;
extern int kvm_allowed;
+extern int kvm_apic_level;
extern int win2k_install_hack;
extern int usb_enabled;
extern int smp_cpus;
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/6] KVM: in-kernel-apic modification to QEMU
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
` (2 preceding siblings ...)
2007-05-15 14:59 ` [PATCH 3/6] KVM-USER: Add ability to specify APIC emulation type from the command-line Gregory Haskins
@ 2007-05-15 15:00 ` Gregory Haskins
2007-05-15 15:00 ` [PATCH 5/6] KVM-USER: Add support for listening for kernel-based interrupts Gregory Haskins
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Gregory Haskins @ 2007-05-15 15:00 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Signed-off-by: Gregory Haskins <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
---
qemu/hw/apic.c | 20 +++++++++++++++-----
qemu/hw/pc.c | 29 ++++++++++++++++-------------
qemu/qemu-kvm.c | 49 +++++++++++++++++++++++++++++++++++++++----------
qemu/qemu-kvm.h | 2 ++
qemu/vl.h | 7 ++++++-
user/kvmctl.c | 33 ++++++++++++++++++++++++++++++++-
user/kvmctl.h | 31 ++++++++++++++++++++++++++++++-
user/main.c | 2 +-
8 files changed, 141 insertions(+), 32 deletions(-)
diff --git a/qemu/hw/apic.c b/qemu/hw/apic.c
index 0b73233..998f0f8 100644
--- a/qemu/hw/apic.c
+++ b/qemu/hw/apic.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "vl.h"
+#include "qemu-kvm.h"
//#define DEBUG_APIC
//#define DEBUG_IOAPIC
@@ -87,6 +88,7 @@ typedef struct APICState {
} APICState;
struct IOAPICState {
+ CPUState *cpu_env;
uint8_t id;
uint8_t ioregsel;
@@ -888,10 +890,17 @@ static void ioapic_service(IOAPICState *s)
vector = pic_read_irq(isa_pic);
else
vector = entry & 0xff;
-
- apic_get_delivery_bitmask(deliver_bitmask, dest, dest_mode);
- apic_bus_deliver(deliver_bitmask, delivery_mode,
- vector, polarity, trig_mode);
+
+ if (use_kernel_apic()) {
+ ext_apic_bus_deliver(dest, trig_mode, dest_mode,
+ delivery_mode, vector);
+ cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD);
+ } else {
+ apic_get_delivery_bitmask(deliver_bitmask, dest,
+ dest_mode);
+ apic_bus_deliver(deliver_bitmask, delivery_mode,
+ vector, polarity, trig_mode);
+ }
}
}
}
@@ -1045,7 +1054,7 @@ static CPUWriteMemoryFunc *ioapic_mem_write[3] = {
ioapic_mem_writel,
};
-IOAPICState *ioapic_init(void)
+IOAPICState *ioapic_init(CPUState *env)
{
IOAPICState *s;
int io_memory;
@@ -1054,6 +1063,7 @@ IOAPICState *ioapic_init(void)
if (!s)
return NULL;
ioapic_reset(s);
+ s->cpu_env = env;
s->id = last_apic_id++;
io_memory = cpu_register_io_memory(0, ioapic_mem_read,
diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c
index eda49cf..df51539 100644
--- a/qemu/hw/pc.c
+++ b/qemu/hw/pc.c
@@ -91,16 +91,19 @@ int cpu_get_pic_interrupt(CPUState *env)
{
int intno;
- intno = apic_get_interrupt(env);
- if (intno >= 0) {
- /* set irq request if a PIC irq is still pending */
- /* XXX: improve that */
- pic_update_irq(isa_pic);
- return intno;
+ if (!use_kernel_apic()) {
+ intno = apic_get_interrupt(env);
+ if (intno >= 0) {
+ /* set irq request if a PIC irq is still pending */
+ /* XXX: improve that */
+ pic_update_irq(isa_pic);
+ return intno;
+ }
+
+ /* read the irq from the PIC */
+ if (!apic_accept_pic_intr(env))
+ return -1;
}
- /* read the irq from the PIC */
- if (!apic_accept_pic_intr(env))
- return -1;
intno = pic_read_irq(isa_pic);
return intno;
@@ -483,9 +486,9 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device,
}
register_savevm("cpu", i, 4, cpu_save, cpu_load, env);
qemu_register_reset(main_cpu_reset, env);
- if (pci_enabled) {
- apic_init(env);
- }
+ if (!use_kernel_apic() && pci_enabled) {
+ apic_init(env);
+ }
}
/* allocate RAM */
@@ -671,7 +674,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device,
register_ioport_write(0x92, 1, 1, ioport92_write, NULL);
if (pci_enabled) {
- ioapic = ioapic_init();
+ ioapic = ioapic_init(env);
}
isa_pic = pic_init(pic_irq_request, first_cpu);
pit = pit_init(0x40, 0);
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index faa4684..59e79bf 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -235,9 +235,16 @@ static void load_regs(CPUState *env)
sregs.cr3 = env->cr[3];
sregs.cr4 = env->cr[4];
- sregs.apic_base = cpu_get_apic_base(env);
+ if (!kvm_apic_level) {
+ /* These two are no longer used once the in-kernel APIC is enabled */
+ sregs.apic_base = 0;
+ sregs.cr8 = 0;
+ } else {
+ sregs.apic_base = cpu_get_apic_base(env);
+ sregs.cr8 = cpu_get_apic_tpr(env);
+ }
+
sregs.efer = env->efer;
- sregs.cr8 = cpu_get_apic_tpr(env);
kvm_set_sregs(kvm_context, 0, &sregs);
@@ -329,10 +336,12 @@ static void save_regs(CPUState *env)
env->cr[3] = sregs.cr3;
env->cr[4] = sregs.cr4;
- cpu_set_apic_base(env, sregs.apic_base);
+ if (!kvm_apic_level) {
+ cpu_set_apic_base(env, sregs.apic_base);
+ //cpu_set_apic_tpr(env, sregs.cr8);
+ }
env->efer = sregs.efer;
- //cpu_set_apic_tpr(env, sregs.cr8);
#define HFLAG_COPY_MASK ~( \
HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
@@ -418,9 +427,17 @@ static int try_push_interrupts(void *opaque)
if (env->ready_for_interrupt_injection &&
(env->interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK)) {
+ int irq = cpu_get_pic_interrupt(env);
+
+ if (irq != -1) {
+ if (kvm_apic_level)
+ kvm_inject_isa_irq(kvm_context, irq);
+ else
+ // for now using cpu 0
+ kvm_inject_irq(kvm_context, 0, irq);
+ }
+
env->interrupt_request &= ~CPU_INTERRUPT_HARD;
- // for now using cpu 0
- kvm_inject_irq(kvm_context, 0, cpu_get_pic_interrupt(env));
}
return (env->interrupt_request & CPU_INTERRUPT_HARD) != 0;
@@ -433,8 +450,11 @@ static void post_kvm_run(void *opaque, struct kvm_run *kvm_run)
env->eflags = (kvm_run->if_flag) ? env->eflags | IF_MASK:env->eflags & ~IF_MASK;
env->ready_for_interrupt_injection = kvm_run->ready_for_interrupt_injection;
- //cpu_set_apic_tpr(env, kvm_run->cr8);
- cpu_set_apic_base(env, kvm_run->apic_base);
+
+ if (!kvm_apic_level) {
+ //cpu_set_apic_tpr(env, kvm_run->cr8);
+ cpu_set_apic_base(env, kvm_run->apic_base);
+ }
}
static void pre_kvm_run(void *opaque, struct kvm_run *kvm_run)
@@ -442,7 +462,15 @@ static void pre_kvm_run(void *opaque, struct kvm_run *kvm_run)
CPUState **envs = opaque, *env;
env = envs[0];
- kvm_run->cr8 = cpu_get_apic_tpr(env);
+ if (!kvm_apic_level)
+ kvm_run->cr8 = cpu_get_apic_tpr(env);
+}
+
+int ext_apic_bus_deliver(int dest, int trig_mode, int dest_mode,
+ int delivery_mode, int vector)
+{
+ return kvm_apic_bus_deliver(kvm_context, dest, trig_mode, dest_mode,
+ delivery_mode, vector);
}
void kvm_load_registers(CPUState *env)
@@ -670,7 +698,8 @@ int kvm_qemu_create_context(void)
{
int i;
- if (kvm_create(kvm_context, phys_ram_size, (void**)&phys_ram_base) < 0) {
+ if (kvm_create(kvm_context, phys_ram_size, kvm_apic_level,
+ (void**)&phys_ram_base) < 0) {
kvm_qemu_destroy();
return -1;
}
diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h
index 8a1c25d..7bfdf62 100644
--- a/qemu/qemu-kvm.h
+++ b/qemu/qemu-kvm.h
@@ -6,6 +6,8 @@
int kvm_qemu_init(void);
int kvm_qemu_create_context(void);
void kvm_qemu_destroy(void);
+int ext_apic_bus_deliver(int dest, int trig_mode, int dest_mode,
+ int delivery_mode, int vector);
void kvm_load_registers(CPUState *env);
void kvm_save_registers(CPUState *env);
int kvm_cpu_exec(CPUState *env);
diff --git a/qemu/vl.h b/qemu/vl.h
index dec410e..d532117 100644
--- a/qemu/vl.h
+++ b/qemu/vl.h
@@ -167,6 +167,11 @@ extern int semihosting_enabled;
extern int autostart;
extern int time_drift_fix;
+static inline int use_kernel_apic()
+{
+ return kvm_allowed && kvm_apic_level;
+}
+
#define MAX_OPTION_ROMS 16
extern const char *option_rom[MAX_OPTION_ROMS];
extern int nb_option_roms;
@@ -1060,7 +1065,7 @@ typedef struct IOAPICState IOAPICState;
int apic_init(CPUState *env);
int apic_get_interrupt(CPUState *env);
int apic_accept_pic_intr(CPUState *env);
-IOAPICState *ioapic_init(void);
+IOAPICState *ioapic_init(CPUState *env);
void ioapic_set_irq(void *opaque, int vector, int level);
/* i8254.c */
diff --git a/user/kvmctl.c b/user/kvmctl.c
index dcdffbf..bc6e238 100644
--- a/user/kvmctl.c
+++ b/user/kvmctl.c
@@ -225,7 +225,8 @@ void kvm_finalize(kvm_context_t kvm)
free(kvm);
}
-int kvm_create(kvm_context_t kvm, unsigned long memory, void **vm_mem)
+int kvm_create(kvm_context_t kvm, unsigned long memory, int apic_level,
+ void **vm_mem)
{
unsigned long dosmem = 0xa0000;
unsigned long exmem = 0xc0000;
@@ -282,6 +283,14 @@ int kvm_create(kvm_context_t kvm, unsigned long memory, void **vm_mem)
MAP_PRIVATE|MAP_FIXED, zfd, 0);
close(zfd);
+ if (apic_level) {
+ r = ioctl(fd, KVM_ENABLE_KERNEL_PIC, &apic_level);
+ if (r == -1) {
+ fprintf(stderr, "kvm_enable_kernel_pic: %m\n");
+ return -1;
+ }
+ }
+
r = ioctl(fd, KVM_CREATE_VCPU, 0);
if (r == -1) {
fprintf(stderr, "kvm_create_vcpu: %m\n");
@@ -780,6 +789,28 @@ int kvm_inject_irq(kvm_context_t kvm, int vcpu, unsigned irq)
return ioctl(kvm->vcpu_fd[vcpu], KVM_INTERRUPT, &intr);
}
+int kvm_inject_isa_irq(kvm_context_t kvm, unsigned irq)
+{
+ struct kvm_interrupt intr;
+
+ intr.irq = irq;
+ return ioctl(kvm->vm_fd, KVM_ISA_INTERRUPT, &intr);
+}
+
+int kvm_apic_bus_deliver(kvm_context_t kvm, int dest, int trig_mode,
+ int dest_mode, int delivery_mode, int vector)
+{
+ struct kvm_apic_msg msg;
+
+ msg.dest = dest;
+ msg.trig_mode = trig_mode;
+ msg.dest_mode = dest_mode;
+ msg.delivery_mode = delivery_mode;
+ msg.vector = vector;
+
+ return ioctl(kvm->vm_fd, KVM_APIC_MSG, &msg);
+}
+
int kvm_guest_debug(kvm_context_t kvm, int vcpu, struct kvm_debug_guest *dbg)
{
return ioctl(kvm->vcpu_fd[vcpu], KVM_DEBUG_GUEST, dbg);
diff --git a/user/kvmctl.h b/user/kvmctl.h
index 27c010c..b775347 100644
--- a/user/kvmctl.h
+++ b/user/kvmctl.h
@@ -100,12 +100,14 @@ void kvm_finalize(kvm_context_t kvm);
*
* \param kvm Pointer to the current kvm_context
* \param phys_mem_bytes The amount of physical ram you want the VM to have
+ * \param apic_level The APIC emulation level (0=QEMU, 1=KVM)
* \param phys_mem This pointer will be set to point to the memory that
* kvm_create allocates for physical RAM
* \return 0 on success
*/
int kvm_create(kvm_context_t kvm,
unsigned long phys_mem_bytes,
+ int apic_level,
void **phys_mem);
/*!
@@ -236,11 +238,38 @@ int kvm_set_msrs(kvm_context_t, int vcpu, struct kvm_msr_entry *msrs, int n);
* This allows you to simulate an external vectored interrupt.
*
* \param kvm Pointer to the current kvm_context
- * \param vcpu Which virtual CPU should get dumped
+ * \param vcpu Which virtual CPU should handle interrupt
* \param irq Vector number
* \return 0 on success
*/
int kvm_inject_irq(kvm_context_t kvm, int vcpu, unsigned irq);
+
+/*!
+ * \brief Simulate an external vectored interrupt to the ISA bus
+ *
+ * This allows you to simulate an external vectored interrupt.
+ *
+ * \param kvm Pointer to the current kvm_context
+ * \param irq Vector number
+ * \return 0 on success
+ */
+int kvm_inject_isa_irq(kvm_context_t kvm, unsigned irq);
+
+/*!
+ * \brief Simulate an external vectored interrupt to the APIC bus
+ *
+ * This allows you to simulate a vectored interrupt via the LAPIC mechanism.
+ *
+ * \param kvm Pointer to the current kvm_context
+ * \param dest Encoded destination
+ * \param trig_mode 0=edge-trigger, 1=level-trigger
+ * \param dest_mode Destination mode encoding
+ * \param delivery_mode Delivery_mode encoding
+ * \param vector The vector number
+ * \return 0 on success
+ */
+int kvm_apic_bus_deliver(kvm_context_t kvm, int dest, int trig_mode,
+ int dest_mode, int delivery_mode, int vector);
int kvm_guest_debug(kvm_context_t, int vcpu, struct kvm_debug_guest *dbg);
/*!
diff --git a/user/main.c b/user/main.c
index 83fd752..add5eef 100644
--- a/user/main.c
+++ b/user/main.c
@@ -180,7 +180,7 @@ int main(int ac, char **av)
fprintf(stderr, "kvm_init failed\n");
return 1;
}
- if (kvm_create(kvm, 128 * 1024 * 1024, &vm_mem) < 0) {
+ if (kvm_create(kvm, 128 * 1024 * 1024, 1, &vm_mem) < 0) {
kvm_finalize(kvm);
fprintf(stderr, "kvm_create failed\n");
return 1;
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/6] KVM-USER: Add support for listening for kernel-based interrupts
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
` (3 preceding siblings ...)
2007-05-15 15:00 ` [PATCH 4/6] KVM: in-kernel-apic modification to QEMU Gregory Haskins
@ 2007-05-15 15:00 ` Gregory Haskins
2007-05-15 15:00 ` [PATCH 6/6] KVM-USER: Check kvm extensions at runtime Gregory Haskins
2007-05-16 12:03 ` [PATCH 0/6] in-kernel APIC v5 (usermode side) Avi Kivity
6 siblings, 0 replies; 8+ messages in thread
From: Gregory Haskins @ 2007-05-15 15:00 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Signed-off-by: Gregory Haskins <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
---
user/kvmctl.c | 32 ++++++++++++++++++++++++++++++++
user/kvmctl.h | 2 ++
2 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/user/kvmctl.c b/user/kvmctl.c
index bc6e238..ea86426 100644
--- a/user/kvmctl.c
+++ b/user/kvmctl.c
@@ -22,6 +22,8 @@
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
+#include <sys/syscall.h>
+
#include "kvmctl.h"
#define EXPECTED_KVM_API_VERSION 12
@@ -398,6 +400,36 @@ int kvm_get_dirty_pages(kvm_context_t kvm, int slot, void *buf)
return kvm_get_map(kvm, KVM_GET_DIRTY_LOG, slot, buf);
}
+#ifndef __NR_eventfd
+#if defined(__x86_64__)
+#define __NR_eventfd 283
+#elif defined(__i386__)
+#define __NR_eventfd 323
+#else
+#error Cannot detect your architecture!
+#endif
+#endif
+
+int kvm_vcpu_create_eventfd(kvm_context_t kvm, int vcpu)
+{
+ int r;
+ /*
+ * Replace this once the updated glibc comes out
+ */
+ int fd = syscall(__NR_eventfd, 0);
+
+ if (fd < 0)
+ return fd;
+
+ r = ioctl(kvm->vcpu_fd[vcpu], KVM_SET_EVENTFD, fd);
+ if (r < 0) {
+ close(fd);
+ return r;
+ }
+
+ return fd;
+}
+
int kvm_get_mem_map(kvm_context_t kvm, int slot, void *buf)
{
#ifdef KVM_GET_MEM_MAP
diff --git a/user/kvmctl.h b/user/kvmctl.h
index b775347..07cbc08 100644
--- a/user/kvmctl.h
+++ b/user/kvmctl.h
@@ -337,6 +337,8 @@ void kvm_destroy_phys_mem(kvm_context_t, unsigned long phys_start,
unsigned long len);
int kvm_get_dirty_pages(kvm_context_t, int slot, void *buf);
+int kvm_vcpu_create_eventfd(kvm_context_t, int vcpu);
+
/*
* \brief Create a memory alias
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 6/6] KVM-USER: Check kvm extensions at runtime
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
` (4 preceding siblings ...)
2007-05-15 15:00 ` [PATCH 5/6] KVM-USER: Add support for listening for kernel-based interrupts Gregory Haskins
@ 2007-05-15 15:00 ` Gregory Haskins
2007-05-16 12:03 ` [PATCH 0/6] in-kernel APIC v5 (usermode side) Avi Kivity
6 siblings, 0 replies; 8+ messages in thread
From: Gregory Haskins @ 2007-05-15 15:00 UTC (permalink / raw)
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Newer userspace may run on an older kernel. Therefore we need a way to
check the capabilities of the kernel so that we can downgrade userspace
dynamically if necessary
Signed-off-by: Gregory Haskins <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
---
qemu/qemu-kvm.c | 19 +++++++++++++++++++
user/kvmctl.c | 14 ++++++++++++++
user/kvmctl.h | 5 +++++
3 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index 59e79bf..6096f21 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -697,6 +697,25 @@ int kvm_qemu_init()
int kvm_qemu_create_context(void)
{
int i;
+ uint64_t ext;
+
+ if (kvm_check_extension(kvm_context, &ext) < 0) {
+ kvm_qemu_destroy();
+ return -1;
+ }
+
+ if (!(ext & KVM_EXTENSION_LAPIC) && kvm_apic_level) {
+ /*
+ * Opps... the kernel doesnt support apic-emulation even though
+ * the user wants it. We must turn this off and warn the user
+ */
+ kvm_apic_level = 0;
+
+ /* FIXME: We should log this officially */
+ printf("WARNING: older kernel does not support apic " \
+ "emulation. Falling back to userspace emulation. Upgrade " \
+ "your kernel/modules\n");
+ }
if (kvm_create(kvm_context, phys_ram_size, kvm_apic_level,
(void**)&phys_ram_base) < 0) {
diff --git a/user/kvmctl.c b/user/kvmctl.c
index ea86426..fcabc1a 100644
--- a/user/kvmctl.c
+++ b/user/kvmctl.c
@@ -889,3 +889,17 @@ int kvm_set_signal_mask(kvm_context_t kvm, int vcpu, const sigset_t *sigset)
free(sigmask);
return r;
}
+
+int kvm_check_extension(kvm_context_t kvm, uint64_t *ext)
+{
+ *ext = 0;
+
+ int r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_APIC_MSG);
+ if (r < 0)
+ return r;
+
+ if (r)
+ *ext |= KVM_EXTENSION_LAPIC;
+
+ return 0;
+}
diff --git a/user/kvmctl.h b/user/kvmctl.h
index 07cbc08..5371d71 100644
--- a/user/kvmctl.h
+++ b/user/kvmctl.h
@@ -384,4 +384,9 @@ int kvm_dirty_pages_log_enable_all(kvm_context_t kvm);
*/
int kvm_dirty_pages_log_reset(kvm_context_t kvm);
+#define KVM_EXTENSION_LAPIC (1<<0)
+
+int kvm_check_extension(kvm_context_t kvm, uint64_t *ext);
+
+
#endif
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/6] in-kernel APIC v5 (usermode side)
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
` (5 preceding siblings ...)
2007-05-15 15:00 ` [PATCH 6/6] KVM-USER: Check kvm extensions at runtime Gregory Haskins
@ 2007-05-16 12:03 ` Avi Kivity
6 siblings, 0 replies; 8+ messages in thread
From: Avi Kivity @ 2007-05-16 12:03 UTC (permalink / raw)
To: Gregory Haskins; +Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Gregory Haskins wrote:
> Changelog:
>
> 1) Incorporated Anthony's feedback regarding the missed use_kernel_apic()
> 2) Added a new patch to allow new userspace on old kernels
>
>
All good.
--
error compiling committee.c: too many arguments to function
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2007-05-16 12:03 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-15 14:59 [PATCH 0/6] in-kernel APIC v5 (usermode side) Gregory Haskins
[not found] ` <20070515145843.15674.23622.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
2007-05-15 14:59 ` [PATCH 1/6] KVM: Updates for compiling in-kernel APIC support with external-modules Gregory Haskins
2007-05-15 14:59 ` [PATCH 2/6] KVM-USER: Make the kvm_allowed flag always defined so we dont need #ifdefs Gregory Haskins
2007-05-15 14:59 ` [PATCH 3/6] KVM-USER: Add ability to specify APIC emulation type from the command-line Gregory Haskins
2007-05-15 15:00 ` [PATCH 4/6] KVM: in-kernel-apic modification to QEMU Gregory Haskins
2007-05-15 15:00 ` [PATCH 5/6] KVM-USER: Add support for listening for kernel-based interrupts Gregory Haskins
2007-05-15 15:00 ` [PATCH 6/6] KVM-USER: Check kvm extensions at runtime Gregory Haskins
2007-05-16 12:03 ` [PATCH 0/6] in-kernel APIC v5 (usermode side) Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox