* [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
2011-05-13 12:13 ` [PATCH 02/16] qemu-kvm: Drop kvm_inject_interrupt Jan Kiszka
` (16 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
kvm-all.c | 5 -----
kvm.h | 2 --
qemu-kvm.c | 2 +-
3 files changed, 1 insertions(+), 8 deletions(-)
diff --git a/kvm-all.c b/kvm-all.c
index c1be056..d744cb2 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -675,11 +675,6 @@ static CPUPhysMemoryClient kvm_cpu_phys_memory_client = {
.log_stop = kvm_log_stop,
};
-void kvm_cpu_register_phys_memory_client(void)
-{
- cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
-}
-
#ifdef OBSOLETE_KVM_IMPL
static void kvm_handle_interrupt(CPUState *env, int mask)
{
diff --git a/kvm.h b/kvm.h
index 179eb7e..2445d40 100644
--- a/kvm.h
+++ b/kvm.h
@@ -63,8 +63,6 @@ int kvm_init_vcpu(CPUState *env);
int kvm_cpu_exec(CPUState *env);
#if !defined(CONFIG_USER_ONLY)
-void kvm_cpu_register_phys_memory_client(void);
-
void kvm_setup_guest_memory(void *start, size_t size);
int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size);
diff --git a/qemu-kvm.c b/qemu-kvm.c
index cf02ceb..628653b 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -192,7 +192,7 @@ int kvm_init(void)
}
}
- kvm_cpu_register_phys_memory_client();
+ cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
pthread_mutex_lock(&qemu_mutex);
return kvm_create_context();
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 02/16] qemu-kvm: Drop kvm_inject_interrupt
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
2011-05-13 12:13 ` [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
2011-05-13 12:13 ` [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing" Jan Kiszka
` (15 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Not required, do_inject_nmi runs under the global mutex and can
therefore safely invoke cpu_interrupt (like in upstream).
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
monitor.c | 5 +----
qemu-kvm.c | 10 ----------
qemu-kvm.h | 1 -
3 files changed, 1 insertions(+), 15 deletions(-)
diff --git a/monitor.c b/monitor.c
index a9c2850..3abc7e1 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2572,10 +2572,7 @@ static void do_inject_nmi(Monitor *mon, const QDict *qdict)
for (env = first_cpu; env != NULL; env = env->next_cpu)
if (env->cpu_index == cpu_index) {
- if (kvm_enabled())
- kvm_inject_interrupt(env, CPU_INTERRUPT_NMI);
- else
- cpu_interrupt(env, CPU_INTERRUPT_NMI);
+ cpu_interrupt(env, CPU_INTERRUPT_NMI);
break;
}
}
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 628653b..1f9ddea 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -931,16 +931,6 @@ void on_vcpu(CPUState *env, void (*func)(void *data), void *data)
}
}
-static void inject_interrupt(void *data)
-{
- cpu_interrupt(current_env, (long) data);
-}
-
-void kvm_inject_interrupt(CPUState *env, int mask)
-{
- on_vcpu(env, inject_interrupt, (void *) (long) mask);
-}
-
void kvm_update_interrupt_request(CPUState *env)
{
int signal = 0;
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 8b3ce9c..bf03be8 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -407,7 +407,6 @@ void kvm_hpet_enable_kpit(void);
void kvm_hpet_disable_kpit(void);
void on_vcpu(CPUState *env, void (*func)(void *data), void *data);
-void kvm_inject_interrupt(CPUState *env, int mask);
void kvm_update_interrupt_request(CPUState *env);
int kvm_arch_has_work(CPUState *env);
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing"
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
2011-05-13 12:13 ` [PATCH 01/16] qemu-kvm: Drop kvm_cpu_register_phys_memory_client wrapper Jan Kiszka
2011-05-13 12:13 ` [PATCH 02/16] qemu-kvm: Drop kvm_inject_interrupt Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
2011-05-16 10:24 ` Avi Kivity
2011-05-13 12:13 ` [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq Jan Kiszka
` (14 subsequent siblings)
17 siblings, 1 reply; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
This reverts commit fd6bfef3d49a62b36092f131690de3e34f84662d.
It is a nop, and it always was a nop:
irq0override = !kvm_irqchip || kvm_has_gsi_routing
But this code is only executed when gsi routing is available.
Conflicts:
qemu-kvm-x86.c
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
qemu-kvm-x86.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 6c3a0a9..c039e16 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -317,9 +317,9 @@ int kvm_arch_init_irq_routing(void)
}
}
for (i = 0; i < 24; ++i) {
- if (i == 0 && irq0override) {
+ if (i == 0) {
r = kvm_add_irq_route(i, KVM_IRQCHIP_IOAPIC, 2);
- } else if (i != 2 || !irq0override) {
+ } else if (i != 2) {
r = kvm_add_irq_route(i, KVM_IRQCHIP_IOAPIC, i);
}
if (r < 0) {
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing"
2011-05-13 12:13 ` [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing" Jan Kiszka
@ 2011-05-16 10:24 ` Avi Kivity
2011-05-16 10:33 ` Avi Kivity
0 siblings, 1 reply; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:24 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm
On 05/13/2011 03:13 PM, Jan Kiszka wrote:
> This reverts commit fd6bfef3d49a62b36092f131690de3e34f84662d.
>
> It is a nop, and it always was a nop:
>
> irq0override = !kvm_irqchip || kvm_has_gsi_routing
>
> But this code is only executed when gsi routing is available.
That means that if kvm_has_gsi_routing, then irq0override = true, and
this code is executed?
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing"
2011-05-16 10:24 ` Avi Kivity
@ 2011-05-16 10:33 ` Avi Kivity
0 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:33 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm
On 05/16/2011 01:24 PM, Avi Kivity wrote:
> On 05/13/2011 03:13 PM, Jan Kiszka wrote:
>> This reverts commit fd6bfef3d49a62b36092f131690de3e34f84662d.
>>
>> It is a nop, and it always was a nop:
>>
>> irq0override = !kvm_irqchip || kvm_has_gsi_routing
>>
>> But this code is only executed when gsi routing is available.
>
> That means that if kvm_has_gsi_routing, then irq0override = true, and
> this code is executed?
>
Ah, sorry, you did constant propagation here. Patch is fine.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (2 preceding siblings ...)
2011-05-13 12:13 ` [PATCH 03/16] Revert "qemu-kvm-x86: consider the irq0override flag in kvm_arch_init_irq_routing" Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
2011-05-16 10:29 ` Avi Kivity
2011-05-13 12:13 ` [PATCH 05/16] qemu-kvm: Clean up IRQ0 override configuration Jan Kiszka
` (13 subsequent siblings)
17 siblings, 1 reply; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
The IRQ0 override is not configurable while using the user space IOAPIC.
When the in-kernel irqchip is active, ioapic_set_irq is never called. So
drop this useless test.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/ioapic.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/hw/ioapic.c b/hw/ioapic.c
index 2ac6127..084d37a 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -22,7 +22,6 @@
#include "hw.h"
#include "pc.h"
-#include "sysemu.h"
#include "apic.h"
#include "ioapic.h"
#include "qemu-timer.h"
@@ -146,7 +145,7 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
* the cleanest way of doing it but it should work. */
DPRINTF("%s: %s vec %x\n", __func__, level ? "raise" : "lower", vector);
- if (vector == 0 && irq0override) {
+ if (vector == 0) {
vector = 2;
}
if (vector >= 0 && vector < IOAPIC_NUM_PINS) {
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq
2011-05-13 12:13 ` [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq Jan Kiszka
@ 2011-05-16 10:29 ` Avi Kivity
0 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:29 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm
On 05/13/2011 03:13 PM, Jan Kiszka wrote:
> The IRQ0 override is not configurable while using the user space IOAPIC.
> When the in-kernel irqchip is active, ioapic_set_irq is never called. So
> drop this useless test.
>
> @@ -146,7 +145,7 @@ static void ioapic_set_irq(void *opaque, int vector, int level)
> * the cleanest way of doing it but it should work. */
>
> DPRINTF("%s: %s vec %x\n", __func__, level ? "raise" : "lower", vector);
> - if (vector == 0&& irq0override) {
> + if (vector == 0) {
> vector = 2;
> }
> if (vector>= 0&& vector< IOAPIC_NUM_PINS) {
Incidentally, the variable should be called pin, not vector, and
gsi->ioapic/pic wiring should be done outside the ioapic code.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 05/16] qemu-kvm: Clean up IRQ0 override configuration
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (3 preceding siblings ...)
2011-05-13 12:13 ` [PATCH 04/16] qemu-kvm: Drop IRQ0 override test from ioapic_set_irq Jan Kiszka
@ 2011-05-13 12:13 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 06/16] qemu-kvm: Refactor irqchip and routing initialization Jan Kiszka
` (12 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:13 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Introduce kvm_allows_irq0_override to overcome the global irq0override
variable and convert the BIOS initialization.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/pc.c | 2 +-
kvm-all.c | 5 +++++
kvm-stub.c | 5 +++++
kvm.h | 1 +
qemu-kvm.c | 1 -
sysemu.h | 1 -
vl.c | 1 -
7 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index 944f766..73398eb 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -605,7 +605,7 @@ static void *bochs_bios_init(void)
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, (uint8_t *)acpi_tables,
acpi_tables_len);
- fw_cfg_add_bytes(fw_cfg, FW_CFG_IRQ0_OVERRIDE, &irq0override, 1);
+ fw_cfg_add_i32(fw_cfg, FW_CFG_IRQ0_OVERRIDE, kvm_allows_irq0_override());
smbios_table = smbios_get_table(&smbios_len);
if (smbios_table)
diff --git a/kvm-all.c b/kvm-all.c
index d744cb2..d936d35 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1121,6 +1121,11 @@ int kvm_has_many_ioeventfds(void)
return kvm_state->many_ioeventfds;
}
+int kvm_allows_irq0_override(void)
+{
+ return !kvm_enabled() || !kvm_irqchip_in_kernel() || kvm_has_gsi_routing();
+}
+
void kvm_setup_guest_memory(void *start, size_t size)
{
if (!kvm_has_sync_mmu()) {
diff --git a/kvm-stub.c b/kvm-stub.c
index 31bd77b..4f1f7d3 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -93,6 +93,11 @@ int kvm_has_many_ioeventfds(void)
return 0;
}
+int kvm_allows_irq0_override(void)
+{
+ return 1;
+}
+
void kvm_setup_guest_memory(void *start, size_t size)
{
}
diff --git a/kvm.h b/kvm.h
index 2445d40..4ba5465 100644
--- a/kvm.h
+++ b/kvm.h
@@ -220,6 +220,7 @@ typedef struct KVMMsiMessage {
} KVMMsiMessage;
int kvm_has_gsi_routing(void);
+int kvm_allows_irq0_override(void);
int kvm_get_irq_route_gsi(void);
int kvm_msi_message_add(KVMMsiMessage *msg);
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 1f9ddea..fee6cdf 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1426,7 +1426,6 @@ static int kvm_create_context(void)
kvm_init_ap();
if (kvm_irqchip) {
if (!qemu_kvm_has_gsi_routing()) {
- irq0override = 0;
#ifdef TARGET_I386
/* if kernel can't do irq routing, interrupt source
* override 0->2 can not be set up as required by hpet,
diff --git a/sysemu.h b/sysemu.h
index d58bec1..69e2e7e 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -102,7 +102,6 @@ extern int vga_interface_type;
extern int graphic_width;
extern int graphic_height;
extern int graphic_depth;
-extern uint8_t irq0override;
extern DisplayType display_type;
extern const char *keyboard_layout;
extern int win2k_install_hack;
diff --git a/vl.c b/vl.c
index a143250..501d52c 100644
--- a/vl.c
+++ b/vl.c
@@ -217,7 +217,6 @@ int no_reboot = 0;
int no_shutdown = 0;
int cursor_hide = 1;
int graphic_rotate = 0;
-uint8_t irq0override = 1;
const char *watchdog;
QEMUOptionRom option_rom[MAX_OPTION_ROMS];
int nb_option_roms;
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 06/16] qemu-kvm: Refactor irqchip and routing initialization
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (4 preceding siblings ...)
2011-05-13 12:13 ` [PATCH 05/16] qemu-kvm: Clean up IRQ0 override configuration Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 07/16] qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip Jan Kiszka
` (11 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Push all irq routing setup into kvm_init_irq_routing and move arch
dependent bits into kvm_arch_init_irq_routing. This will also help to
merge qemu-kvm's init into upstream kvm_init.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
qemu-kvm-x86.c | 13 ++++++-
qemu-kvm.c | 115 ++++++++++++++++++++++++++++----------------------------
qemu-kvm.h | 4 +-
3 files changed, 70 insertions(+), 62 deletions(-)
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index c039e16..53083bd 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -299,7 +299,7 @@ int kvm_arch_init_irq_routing(void)
{
int i, r;
- if (kvm_irqchip && kvm_has_gsi_routing()) {
+ if (kvm_has_gsi_routing()) {
kvm_clear_gsi_routes();
for (i = 0; i < 8; ++i) {
if (i == 2) {
@@ -327,7 +327,18 @@ int kvm_arch_init_irq_routing(void)
}
}
kvm_commit_irq_routes();
+
+ if (!qemu_kvm_has_pit_state2()) {
+ no_hpet = 1;
+ }
+ } else {
+ /* If kernel can't do irq routing, interrupt source
+ * override 0->2 can not be set up as required by HPET.
+ * so we have to disable it.
+ */
+ no_hpet = 1;
}
+
return 0;
}
diff --git a/qemu-kvm.c b/qemu-kvm.c
index fee6cdf..196c516 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -127,7 +127,7 @@ static int kvm_create_context(void);
int kvm_init(void)
{
int fd;
- int r, gsi_count, i;
+ int r, i;
fd = open("/dev/kvm", O_RDWR);
@@ -177,21 +177,6 @@ int kvm_init(void)
#error Hypervisor too old: KVM_CAP_USER_MEMORY extension not supported
#endif
- gsi_count = kvm_get_gsi_count(kvm_context);
- if (gsi_count > 0) {
- int gsi_bits, i;
-
- /* Round up so we can search ints using ffs */
- gsi_bits = ALIGN(gsi_count, 32);
- kvm_context->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
- kvm_context->max_gsi = gsi_bits;
-
- /* Mark any over-allocated bits as already in use */
- for (i = gsi_count; i < gsi_bits; i++) {
- set_gsi(kvm_context, i);
- }
- }
-
cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
pthread_mutex_lock(&qemu_mutex);
@@ -227,30 +212,68 @@ static int kvm_set_boot_vcpu_id(kvm_context_t kvm, uint32_t id)
#endif
}
-void kvm_create_irqchip(kvm_context_t kvm)
+static int kvm_init_irq_routing(kvm_context_t kvm)
{
- int r;
+#ifdef KVM_CAP_IRQ_ROUTING
+ int r, gsi_count;
+
+ gsi_count = kvm_get_gsi_count(kvm);
+ if (gsi_count > 0) {
+ int gsi_bits, i;
+
+ /* Round up so we can search ints using ffs */
+ gsi_bits = ALIGN(gsi_count, 32);
+ kvm->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
+ kvm->max_gsi = gsi_bits;
+
+ /* Mark any over-allocated bits as already in use */
+ for (i = gsi_count; i < gsi_bits; i++) {
+ set_gsi(kvm, i);
+ }
+ }
+
+ kvm->irq_routes = qemu_mallocz(sizeof(*kvm_context->irq_routes));
+ kvm->nr_allocated_irq_routes = 0;
+
+ r = kvm_arch_init_irq_routing();
+ if (r < 0) {
+ return r;
+ }
+#endif
+
+ return 0;
+}
+int kvm_create_irqchip(kvm_context_t kvm)
+{
#ifdef KVM_CAP_IRQCHIP
- if (kvm_irqchip) {
- r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_IRQCHIP);
- if (r > 0) { /* kernel irqchip supported */
- r = kvm_vm_ioctl(kvm_state, KVM_CREATE_IRQCHIP);
- if (r >= 0) {
- kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
+ int r;
+
+ if (!kvm_irqchip || !kvm_check_extension(kvm_state, KVM_CAP_IRQCHIP)) {
+ return 0;
+ }
+
+ r = kvm_vm_ioctl(kvm_state, KVM_CREATE_IRQCHIP);
+ if (r < 0) {
+ fprintf(stderr, "Create kernel PIC irqchip failed\n");
+ return r;
+ }
+
+ kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
#if defined(KVM_CAP_IRQ_INJECT_STATUS) && defined(KVM_IRQ_LINE_STATUS)
- r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION,
- KVM_CAP_IRQ_INJECT_STATUS);
- if (r > 0) {
- kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
- }
+ if (kvm_check_extension(kvm_state, KVM_CAP_IRQ_INJECT_STATUS)) {
+ kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
+ }
#endif
- kvm_state->irqchip_in_kernel = 1;
- } else
- fprintf(stderr, "Create kernel PIC irqchip failed\n");
- }
+ kvm_state->irqchip_in_kernel = 1;
+
+ r = kvm_init_irq_routing(kvm);
+ if (r < 0) {
+ return r;
}
#endif
+
+ return 0;
}
#ifdef KVM_CAP_IRQCHIP
@@ -1348,8 +1371,6 @@ int kvm_arch_init_irq_routing(void)
}
#endif
-extern int no_hpet;
-
static int kvm_create_context(void)
{
static const char upgrade_note[] =
@@ -1360,11 +1381,6 @@ static int kvm_create_context(void)
kvm_state->pit_in_kernel = kvm_pit;
-#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context->irq_routes = qemu_mallocz(sizeof(*kvm_context->irq_routes));
- kvm_context->nr_allocated_irq_routes = 0;
-#endif
-
kvm_state->vmfd = kvm_ioctl(kvm_state, KVM_CREATE_VM, 0);
if (kvm_state->vmfd < 0) {
fprintf(stderr, "kvm_create_vm: %m\n");
@@ -1378,8 +1394,6 @@ static int kvm_create_context(void)
return r;
}
- kvm_create_irqchip(kvm_context);
-
/* There was a nasty bug in < kvm-80 that prevents memory slots from being
* destroyed properly. Since we rely on this capability, refuse to work
* with any kernel without this capability. */
@@ -1390,7 +1404,7 @@ static int kvm_create_context(void)
return -EINVAL;
}
- r = kvm_arch_init_irq_routing();
+ r = kvm_create_irqchip(kvm_context);
if (r < 0) {
return r;
}
@@ -1424,21 +1438,6 @@ static int kvm_create_context(void)
kvm_state->many_ioeventfds = kvm_check_many_ioeventfds();
kvm_init_ap();
- if (kvm_irqchip) {
- if (!qemu_kvm_has_gsi_routing()) {
-#ifdef TARGET_I386
- /* if kernel can't do irq routing, interrupt source
- * override 0->2 can not be set up as required by hpet,
- * so disable hpet.
- */
- no_hpet = 1;
- } else if (!qemu_kvm_has_pit_state2()) {
- no_hpet = 1;
- }
-#else
- }
-#endif
- }
return 0;
}
diff --git a/qemu-kvm.h b/qemu-kvm.h
index bf03be8..40d607b 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -74,7 +74,7 @@ int pre_kvm_run(kvm_context_t kvm, CPUState *env);
int handle_io_window(kvm_context_t kvm);
int try_push_interrupts(kvm_context_t kvm);
-void kvm_create_irqchip(kvm_context_t kvm);
+int kvm_create_irqchip(kvm_context_t kvm);
/*!
* \brief Start the VCPU
@@ -449,13 +449,11 @@ int kvm_arch_halt(CPUState *env);
int handle_tpr_access(void *opaque, CPUState *env, uint64_t rip,
int is_write);
-#define qemu_kvm_has_gsi_routing() kvm_has_gsi_routing()
#ifdef TARGET_I386
#define qemu_kvm_has_pit_state2() kvm_has_pit_state2(kvm_context)
#endif
#else
#define kvm_nested 0
-#define qemu_kvm_has_gsi_routing() (0)
#ifdef TARGET_I386
#define qemu_kvm_has_pit_state2() (0)
#endif
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 07/16] qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (5 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 06/16] qemu-kvm: Refactor irqchip and routing initialization Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 08/16] qemu-kvm: Make some private functions static Jan Kiszka
` (10 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
qemu-kvm.c | 11 +----------
qemu-kvm.h | 11 -----------
2 files changed, 1 insertions(+), 21 deletions(-)
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 196c516..8b98ec8 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -217,7 +217,7 @@ static int kvm_init_irq_routing(kvm_context_t kvm)
#ifdef KVM_CAP_IRQ_ROUTING
int r, gsi_count;
- gsi_count = kvm_get_gsi_count(kvm);
+ gsi_count = kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING);
if (gsi_count > 0) {
int gsi_bits, i;
@@ -590,15 +590,6 @@ int kvm_has_gsi_routing(void)
return r;
}
-int kvm_get_gsi_count(kvm_context_t kvm)
-{
-#ifdef KVM_CAP_IRQ_ROUTING
- return kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING);
-#else
- return -EINVAL;
-#endif
-}
-
int kvm_clear_gsi_routes(void)
{
#ifdef KVM_CAP_IRQ_ROUTING
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 40d607b..693d554 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -306,17 +306,6 @@ int kvm_deassign_pci_device(kvm_context_t kvm,
#endif
/*!
- * \brief Determines the number of gsis that can be routed
- *
- * Returns the number of distinct gsis that can be routed by kvm. This is
- * also the number of distinct routes (if a gsi has two routes, than another
- * gsi cannot be used...)
- *
- * \param kvm Pointer to the current kvm_context
- */
-int kvm_get_gsi_count(kvm_context_t kvm);
-
-/*!
* \brief Clears the temporary irq routing table
*
* Clears the temporary irq routing table. Nothing is committed to the
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 08/16] qemu-kvm: Make some private functions static
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (6 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 07/16] qemu-kvm: Fold kvm_get_gsi_count into kvm_create_irqchip Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 09/16] qemu-kvm: Implement kvm_has_pit_state2 in upstream style Jan Kiszka
` (9 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
qemu-kvm.c | 12 ++++++------
qemu-kvm.h | 32 --------------------------------
2 files changed, 6 insertions(+), 38 deletions(-)
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 8b98ec8..48c92e6 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -350,12 +350,12 @@ static int handle_mmio(CPUState *env)
return 0;
}
-int handle_io_window(kvm_context_t kvm)
+static int handle_io_window(kvm_context_t kvm)
{
return 1;
}
-int handle_shutdown(kvm_context_t kvm, CPUState *env)
+static int handle_shutdown(kvm_context_t kvm, CPUState *env)
{
/* stop the current vcpu from going back to guest mode */
env->stopped = 1;
@@ -371,14 +371,14 @@ static inline void push_nmi(kvm_context_t kvm)
#endif /* KVM_CAP_USER_NMI */
}
-void post_kvm_run(kvm_context_t kvm, CPUState *env)
+static void post_kvm_run(kvm_context_t kvm, CPUState *env)
{
pthread_mutex_lock(&qemu_mutex);
kvm_arch_post_run(env, env->kvm_run);
cpu_single_env = env;
}
-int pre_kvm_run(kvm_context_t kvm, CPUState *env)
+static int pre_kvm_run(kvm_context_t kvm, CPUState *env)
{
kvm_arch_pre_run(env, env->kvm_run);
@@ -391,7 +391,7 @@ int kvm_is_ready_for_interrupt_injection(CPUState *env)
return env->kvm_run->ready_for_interrupt_injection;
}
-int kvm_run(CPUState *env)
+static int kvm_run(CPUState *env)
{
int r;
kvm_context_t kvm = &env->kvm_state->kvm_context;
@@ -984,7 +984,7 @@ int kvm_cpu_exec(CPUState *env)
return 0;
}
-int kvm_cpu_is_stopped(CPUState *env)
+static int kvm_cpu_is_stopped(CPUState *env)
{
return !vm_running || env->stopped;
}
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 693d554..cd9bb37 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -66,40 +66,9 @@ typedef struct kvm_context *kvm_context_t;
int kvm_arch_run(CPUState *env);
-int handle_halt(CPUState *env);
-
-int handle_shutdown(kvm_context_t kvm, CPUState *env);
-void post_kvm_run(kvm_context_t kvm, CPUState *env);
-int pre_kvm_run(kvm_context_t kvm, CPUState *env);
-int handle_io_window(kvm_context_t kvm);
-int try_push_interrupts(kvm_context_t kvm);
-
int kvm_create_irqchip(kvm_context_t kvm);
/*!
- * \brief Start the VCPU
- *
- * This starts the VCPU and virtualization is started.\n
- * \n
- * This function will not return until any of these conditions are met:
- * - An IO/MMIO handler does not return "0"
- * - An exception that neither the guest OS, nor KVM can handle occurs
- *
- * \note This function will call the callbacks registered in kvm_init()
- * to emulate those functions
- * \note If you at any point want to interrupt the VCPU, kvm_run() will
- * listen to the EINTR signal. This allows you to simulate external interrupts
- * and asyncronous IO.
- *
- * \param kvm Pointer to the current kvm_context
- * \param vcpu Which virtual CPU should be started
- * \return 0 on success, but you really shouldn't expect this function to
- * return except for when an error has occured, or when you have sent it
- * an EINTR signal.
- */
-int kvm_run(CPUState *env);
-
-/*!
* \brief Check if a vcpu is ready for interrupt injection
*
* This checks if vcpu interrupts are not masked by mov ss or sti.
@@ -487,7 +456,6 @@ struct KVMState {
int kvm_tpr_enable_vapic(CPUState *env);
unsigned long kvm_get_thread_id(void);
-int kvm_cpu_is_stopped(CPUState *env);
#endif
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 09/16] qemu-kvm: Implement kvm_has_pit_state2 in upstream style
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (7 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 08/16] qemu-kvm: Make some private functions static Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 10/16] qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq Jan Kiszka
` (8 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/i8254-kvm.c | 4 ++--
hw/i8254.c | 4 ++--
kvm-all.c | 11 +++++++++++
kvm-stub.c | 5 +++++
kvm.h | 1 +
qemu-kvm-x86.c | 12 +-----------
qemu-kvm.c | 5 +++++
qemu-kvm.h | 15 +--------------
8 files changed, 28 insertions(+), 29 deletions(-)
diff --git a/hw/i8254-kvm.c b/hw/i8254-kvm.c
index b495dc1..44ed86c 100644
--- a/hw/i8254-kvm.c
+++ b/hw/i8254-kvm.c
@@ -38,7 +38,7 @@ static void kvm_pit_pre_save(void *opaque)
struct PITChannelState *sc;
int i;
- if(qemu_kvm_has_pit_state2()) {
+ if (kvm_has_pit_state2()) {
kvm_get_pit2(kvm_context, &pit2);
s->flags = pit2.flags;
} else {
@@ -91,7 +91,7 @@ static int kvm_pit_post_load(void *opaque, int version_id)
c->count_load_time = sc->count_load_time;
}
- if(qemu_kvm_has_pit_state2()) {
+ if (kvm_has_pit_state2()) {
kvm_set_pit2(kvm_context, &pit2);
} else {
kvm_set_pit(kvm_context, (struct kvm_pit_state *)&pit2);
diff --git a/hw/i8254.c b/hw/i8254.c
index 43ac106..33974db 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -497,7 +497,7 @@ void hpet_pit_disable(void)
PITChannelState *s = &pit_state.channels[0];
if (kvm_enabled() && kvm_pit_in_kernel()) {
- if (qemu_kvm_has_pit_state2()) {
+ if (kvm_has_pit_state2()) {
kvm_hpet_disable_kpit();
} else {
fprintf(stderr, "%s: kvm does not support pit_state2!\n", __FUNCTION__);
@@ -521,7 +521,7 @@ void hpet_pit_enable(void)
PITChannelState *s = &pit->channels[0];
if (kvm_enabled() && kvm_pit_in_kernel()) {
- if (qemu_kvm_has_pit_state2()) {
+ if (kvm_has_pit_state2()) {
kvm_hpet_enable_kpit();
} else {
fprintf(stderr, "%s: kvm does not support pit_state2!\n", __FUNCTION__);
diff --git a/kvm-all.c b/kvm-all.c
index d936d35..9463341 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -82,6 +82,7 @@ struct KVMState
int pit_in_kernel;
int xsave, xcrs;
int many_ioeventfds;
+ int pit_state2;
};
KVMState *kvm_state;
@@ -783,6 +784,11 @@ int kvm_init(void)
s->xcrs = kvm_check_extension(s, KVM_CAP_XCRS);
#endif
+ s->pit_state2 = 0;
+#ifdef KVM_CAP_PIT_STATE2
+ s->pit_state2 = kvm_check_extension(s, KVM_CAP_PIT_STATE2);
+#endif
+
ret = kvm_arch_init(s);
if (ret < 0) {
goto err;
@@ -1113,6 +1119,11 @@ int kvm_has_xcrs(void)
return kvm_state->xcrs;
}
+int kvm_has_pit_state2(void)
+{
+ return kvm_state->pit_state2;
+}
+
int kvm_has_many_ioeventfds(void)
{
if (!kvm_enabled()) {
diff --git a/kvm-stub.c b/kvm-stub.c
index 4f1f7d3..90fed66 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -98,6 +98,11 @@ int kvm_allows_irq0_override(void)
return 1;
}
+int kvm_has_pit_state2(void)
+{
+ return 0;
+}
+
void kvm_setup_guest_memory(void *start, size_t size)
{
}
diff --git a/kvm.h b/kvm.h
index 4ba5465..7d548ed 100644
--- a/kvm.h
+++ b/kvm.h
@@ -56,6 +56,7 @@ int kvm_has_debugregs(void);
int kvm_has_xsave(void);
int kvm_has_xcrs(void);
int kvm_has_many_ioeventfds(void);
+int kvm_has_pit_state2(void);
#ifdef NEED_CPU_H
int kvm_init_vcpu(CPUState *env);
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 53083bd..bbdf218 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -178,16 +178,6 @@ int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2)
#endif
#endif
-int kvm_has_pit_state2(kvm_context_t kvm)
-{
- int r = 0;
-
-#ifdef KVM_CAP_PIT_STATE2
- r = kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2);
-#endif
- return r;
-}
-
static void kvm_set_cr8(CPUState *env, uint64_t cr8)
{
env->kvm_run->cr8 = cr8;
@@ -328,7 +318,7 @@ int kvm_arch_init_irq_routing(void)
}
kvm_commit_irq_routes();
- if (!qemu_kvm_has_pit_state2()) {
+ if (!kvm_has_pit_state2()) {
no_hpet = 1;
}
} else {
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 48c92e6..98bb765 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1428,6 +1428,11 @@ static int kvm_create_context(void)
kvm_state->many_ioeventfds = kvm_check_many_ioeventfds();
+ kvm_state->pit_state2 = 0;
+#ifdef KVM_CAP_PIT_STATE2
+ kvm_state->pit_state2 = kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2);
+#endif
+
kvm_init_ap();
return 0;
diff --git a/qemu-kvm.h b/qemu-kvm.h
index cd9bb37..b101c03 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -185,14 +185,6 @@ int kvm_reinject_control(kvm_context_t kvm, int pit_reinject);
#ifdef KVM_CAP_PIT_STATE2
/*!
- * \brief Check for kvm support of kvm_pit_state2
- *
- * \param kvm Pointer to the current kvm_context
- * \return 0 on success
- */
-int kvm_has_pit_state2(kvm_context_t kvm);
-
-/*!
* \brief Set in kernel PIT state2 of the virtual domain
*
*
@@ -407,14 +399,8 @@ int kvm_arch_halt(CPUState *env);
int handle_tpr_access(void *opaque, CPUState *env, uint64_t rip,
int is_write);
-#ifdef TARGET_I386
-#define qemu_kvm_has_pit_state2() kvm_has_pit_state2(kvm_context)
-#endif
#else
#define kvm_nested 0
-#ifdef TARGET_I386
-#define qemu_kvm_has_pit_state2() (0)
-#endif
#endif
#ifdef CONFIG_KVM
@@ -449,6 +435,7 @@ struct KVMState {
int pit_in_kernel;
int xsave, xcrs;
int many_ioeventfds;
+ int pit_state2;
struct kvm_context kvm_context;
};
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 10/16] qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (8 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 09/16] qemu-kvm: Implement kvm_has_pit_state2 in upstream style Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 11/16] qemu-kvm: Remove kvm_context from public interfaces Jan Kiszka
` (7 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
qemu-kvm.c | 19 ++++++-------------
qemu-kvm.h | 2 --
2 files changed, 6 insertions(+), 15 deletions(-)
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 98bb765..4aa6b0f 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -278,7 +278,7 @@ int kvm_create_irqchip(kvm_context_t kvm)
#ifdef KVM_CAP_IRQCHIP
-int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status)
+int kvm_set_irq(int irq, int level, int *status)
{
struct kvm_irq_level event;
int r;
@@ -288,15 +288,17 @@ int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status)
}
event.level = level;
event.irq = irq;
- r = kvm_vm_ioctl(kvm_state, kvm->irqchip_inject_ioctl, &event);
+ r = kvm_vm_ioctl(kvm_state, kvm_state->kvm_context.irqchip_inject_ioctl,
+ &event);
if (r < 0) {
- perror("kvm_set_irq_level");
+ perror("kvm_set_irq");
}
if (status) {
#ifdef KVM_CAP_IRQ_INJECT_STATUS
*status =
- (kvm->irqchip_inject_ioctl == KVM_IRQ_LINE) ? 1 : event.status;
+ (kvm_state->kvm_context.irqchip_inject_ioctl == KVM_IRQ_LINE) ?
+ 1 : event.status;
#else
*status = 1;
#endif
@@ -1438,15 +1440,6 @@ static int kvm_create_context(void)
return 0;
}
-#ifdef KVM_CAP_IRQCHIP
-
-int kvm_set_irq(int irq, int level, int *status)
-{
- return kvm_set_irq_level(kvm_context, irq, level, status);
-}
-
-#endif
-
static void kvm_mutex_unlock(void)
{
assert(!cpu_single_env);
diff --git a/qemu-kvm.h b/qemu-kvm.h
index b101c03..dd11e32 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -93,8 +93,6 @@ int kvm_is_ready_for_interrupt_injection(CPUState *env);
int kvm_inject_irq(CPUState *env, unsigned irq);
#endif
-int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status);
-
#ifdef KVM_CAP_IRQCHIP
/*!
* \brief Dump in kernel IRQCHIP contents
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 11/16] qemu-kvm: Remove kvm_context from public interfaces
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (9 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 10/16] qemu-kvm: Fold kvm_set_irq_level into kvm_set_irq Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 12/16] qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id Jan Kiszka
` (6 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
The goal is to remove kvm_context (and also kvm_state one day). For the
few cases we currently still need kvm_context, we can perfectly derive
it from kvm_state.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/device-assignment.c | 21 +++++-----
hw/i8254-kvm.c | 8 ++--
hw/i8259.c | 4 +-
hw/ioapic.c | 4 +-
hw/pcspk.c | 4 +-
kvm.h | 9 +++-
qemu-kvm-x86.c | 22 +++++-----
qemu-kvm.c | 101 ++++++++++++++++++++++++------------------------
qemu-kvm.h | 32 +++++++--------
target-i386/kvm.c | 4 +-
10 files changed, 104 insertions(+), 105 deletions(-)
diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index 0f7f5aa..abc38f8 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -967,7 +967,7 @@ static int assign_device(AssignedDevice *dev)
"requests!\n");
}
- r = kvm_assign_pci_device(kvm_context, &assigned_dev_data);
+ r = kvm_assign_pci_device(kvm_state, &assigned_dev_data);
if (r < 0) {
fprintf(stderr, "Failed to assign device \"%s\" : %s\n",
dev->dev.qdev.id, strerror(-r));
@@ -1010,7 +1010,7 @@ static int assign_irq(AssignedDevice *dev)
#ifdef KVM_CAP_ASSIGN_DEV_IRQ
if (dev->irq_requested_type) {
assigned_irq_data.flags = dev->irq_requested_type;
- r = kvm_deassign_irq(kvm_context, &assigned_irq_data);
+ r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
/* -ENXIO means no assigned irq */
if (r && r != -ENXIO)
perror("assign_irq: deassign");
@@ -1024,7 +1024,7 @@ static int assign_irq(AssignedDevice *dev)
assigned_irq_data.flags |= KVM_DEV_IRQ_HOST_INTX;
#endif
- r = kvm_assign_irq(kvm_context, &assigned_irq_data);
+ r = kvm_assign_irq(kvm_state, &assigned_irq_data);
if (r < 0) {
fprintf(stderr, "Failed to assign irq for \"%s\": %s\n",
dev->dev.qdev.id, strerror(-r));
@@ -1048,7 +1048,7 @@ static void deassign_device(AssignedDevice *dev)
assigned_dev_data.assigned_dev_id =
calc_assigned_dev_id(dev->h_segnr, dev->h_busnr, dev->h_devfn);
- r = kvm_deassign_pci_device(kvm_context, &assigned_dev_data);
+ r = kvm_deassign_pci_device(kvm_state, &assigned_dev_data);
if (r < 0)
fprintf(stderr, "Failed to deassign device \"%s\" : %s\n",
dev->dev.qdev.id, strerror(-r));
@@ -1113,7 +1113,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev, unsigned int ctrl_pos)
assigned_irq_data.flags = assigned_dev->irq_requested_type;
free_dev_irq_entries(assigned_dev);
- r = kvm_deassign_irq(kvm_context, &assigned_irq_data);
+ r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
/* -ENXIO means no assigned irq */
if (r && r != -ENXIO)
perror("assigned_dev_update_msi: deassign irq");
@@ -1147,8 +1147,9 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev, unsigned int ctrl_pos)
assigned_irq_data.guest_irq = assigned_dev->entry->gsi;
assigned_irq_data.flags = KVM_DEV_IRQ_HOST_MSI | KVM_DEV_IRQ_GUEST_MSI;
- if (kvm_assign_irq(kvm_context, &assigned_irq_data) < 0)
+ if (kvm_assign_irq(kvm_state, &assigned_irq_data) < 0) {
perror("assigned_dev_enable_msi: assign irq");
+ }
assigned_dev->girq = -1;
assigned_dev->irq_requested_type = assigned_irq_data.flags;
@@ -1192,7 +1193,7 @@ static int assigned_dev_update_msix_mmio(PCIDevice *pci_dev)
msix_nr.assigned_dev_id = calc_assigned_dev_id(adev->h_segnr, adev->h_busnr,
(uint8_t)adev->h_devfn);
msix_nr.entry_nr = entries_nr;
- r = kvm_assign_set_msix_nr(kvm_context, &msix_nr);
+ r = kvm_assign_set_msix_nr(kvm_state, &msix_nr);
if (r != 0) {
fprintf(stderr, "fail to set MSI-X entry number for MSIX! %s\n",
strerror(-r));
@@ -1231,7 +1232,7 @@ static int assigned_dev_update_msix_mmio(PCIDevice *pci_dev)
msix_entry.gsi = adev->entry[entries_nr].gsi;
msix_entry.entry = i;
- r = kvm_assign_set_msix_entry(kvm_context, &msix_entry);
+ r = kvm_assign_set_msix_entry(kvm_state, &msix_entry);
if (r) {
fprintf(stderr, "fail to set MSI-X entry! %s\n", strerror(-r));
break;
@@ -1269,7 +1270,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev, unsigned int ctrl_pos)
assigned_irq_data.flags = assigned_dev->irq_requested_type;
free_dev_irq_entries(assigned_dev);
- r = kvm_deassign_irq(kvm_context, &assigned_irq_data);
+ r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
/* -ENXIO means no assigned irq */
if (r && r != -ENXIO)
perror("assigned_dev_update_msix: deassign irq");
@@ -1285,7 +1286,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev, unsigned int ctrl_pos)
perror("assigned_dev_update_msix_mmio");
return;
}
- if (kvm_assign_irq(kvm_context, &assigned_irq_data) < 0) {
+ if (kvm_assign_irq(kvm_state, &assigned_irq_data) < 0) {
perror("assigned_dev_enable_msix: assign irq");
return;
}
diff --git a/hw/i8254-kvm.c b/hw/i8254-kvm.c
index 44ed86c..8b494d0 100644
--- a/hw/i8254-kvm.c
+++ b/hw/i8254-kvm.c
@@ -39,11 +39,11 @@ static void kvm_pit_pre_save(void *opaque)
int i;
if (kvm_has_pit_state2()) {
- kvm_get_pit2(kvm_context, &pit2);
+ kvm_get_pit2(kvm_state, &pit2);
s->flags = pit2.flags;
} else {
/* pit2 is superset of pit struct so just cast it and use it */
- kvm_get_pit(kvm_context, (struct kvm_pit_state *)&pit2);
+ kvm_get_pit(kvm_state, (struct kvm_pit_state *)&pit2);
}
for (i = 0; i < 3; i++) {
c = &pit2.channels[i];
@@ -92,9 +92,9 @@ static int kvm_pit_post_load(void *opaque, int version_id)
}
if (kvm_has_pit_state2()) {
- kvm_set_pit2(kvm_context, &pit2);
+ kvm_set_pit2(kvm_state, &pit2);
} else {
- kvm_set_pit(kvm_context, (struct kvm_pit_state *)&pit2);
+ kvm_set_pit(kvm_state, (struct kvm_pit_state *)&pit2);
}
return 0;
}
diff --git a/hw/i8259.c b/hw/i8259.c
index d710ada..b892cee 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -590,7 +590,7 @@ static void kvm_kernel_pic_save_to_user(PicState *s)
chip.chip_id = (&s->pics_state->pics[0] == s) ?
KVM_IRQCHIP_PIC_MASTER :
KVM_IRQCHIP_PIC_SLAVE;
- kvm_get_irqchip(kvm_context, &chip);
+ kvm_get_irqchip(kvm_state, &chip);
kpic = &chip.chip.pic;
s->last_irr = kpic->last_irr;
@@ -640,7 +640,7 @@ static int kvm_kernel_pic_load_from_user(PicState *s)
kpic->elcr = s->elcr;
kpic->elcr_mask = s->elcr_mask;
- kvm_set_irqchip(kvm_context, &chip);
+ kvm_set_irqchip(kvm_state, &chip);
#endif
return 0;
}
diff --git a/hw/ioapic.c b/hw/ioapic.c
index 084d37a..20dd8eb 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -278,7 +278,7 @@ static void kvm_kernel_ioapic_save_to_user(IOAPICState *s)
int i;
chip.chip_id = KVM_IRQCHIP_IOAPIC;
- kvm_get_irqchip(kvm_context, &chip);
+ kvm_get_irqchip(kvm_state, &chip);
kioapic = &chip.chip.ioapic;
s->id = kioapic->id;
@@ -308,7 +308,7 @@ static void kvm_kernel_ioapic_load_from_user(IOAPICState *s)
kioapic->redirtbl[i].bits = s->ioredtbl[i];
}
- kvm_set_irqchip(kvm_context, &chip);
+ kvm_set_irqchip(kvm_state, &chip);
#endif
}
diff --git a/hw/pcspk.c b/hw/pcspk.c
index e8b72c5..c70de53 100644
--- a/hw/pcspk.c
+++ b/hw/pcspk.c
@@ -58,7 +58,7 @@ static void kvm_get_pit_ch2(ISADevice *dev,
struct kvm_pit_state pit_state;
if (kvm_enabled() && kvm_pit_in_kernel()) {
- kvm_get_pit(kvm_context, &pit_state);
+ kvm_get_pit(kvm_state, &pit_state);
pit->channels[2].mode = pit_state.channels[2].mode;
pit->channels[2].count = pit_state.channels[2].count;
pit->channels[2].count_load_time = pit_state.channels[2].count_load_time;
@@ -80,7 +80,7 @@ static void kvm_set_pit_ch2(ISADevice *dev,
inkernel_state->channels[2].count_load_time =
pit->channels[2].count_load_time;
inkernel_state->channels[2].gate = pit->channels[2].gate;
- kvm_set_pit(kvm_context, inkernel_state);
+ kvm_set_pit(kvm_state, inkernel_state);
}
}
#else
diff --git a/kvm.h b/kvm.h
index 7d548ed..75dc7cf 100644
--- a/kvm.h
+++ b/kvm.h
@@ -17,9 +17,6 @@
#include <errno.h>
#include "config-host.h"
#include "qemu-queue.h"
-#ifdef NEED_CPU_H
-#include "qemu-kvm.h"
-#endif
#ifdef CONFIG_KVM
#include <linux/kvm.h>
@@ -85,6 +82,7 @@ int kvm_pit_in_kernel(void);
int kvm_on_sigbus_vcpu(CPUState *env, int code, void *addr);
int kvm_on_sigbus(int code, void *addr);
+#endif /* NEED_CPU_H */
/* internal API */
@@ -96,6 +94,7 @@ int kvm_ioctl(KVMState *s, int type, ...);
int kvm_vm_ioctl(KVMState *s, int type, ...);
+#ifdef NEED_CPU_H
int kvm_vcpu_ioctl(CPUState *env, int type, ...);
/* Arch specific hooks */
@@ -234,4 +233,8 @@ int kvm_irqchip_in_kernel(void);
int kvm_set_irq(int irq, int level, int *status);
+#ifdef NEED_CPU_H
+#include "qemu-kvm.h"
+#endif
+
#endif
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index bbdf218..2aa833f 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -23,19 +23,19 @@
#include "kvm.h"
#include "hw/apic.h"
-static int kvm_create_pit(kvm_context_t kvm)
+static int kvm_create_pit(KVMState *s)
{
#ifdef KVM_CAP_PIT
int r;
if (kvm_pit_in_kernel()) {
- r = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT);
+ r = kvm_vm_ioctl(s, KVM_CREATE_PIT);
if (r < 0) {
fprintf(stderr, "Create kernel PIC irqchip failed\n");
return r;
}
if (!kvm_pit_reinject) {
- r = kvm_reinject_control(kvm_context, 0);
+ r = kvm_reinject_control(s, 0);
if (r < 0) {
fprintf(stderr,
"failure to disable in-kernel PIT reinjection\n");
@@ -142,37 +142,37 @@ int kvm_set_lapic(CPUState *env, struct kvm_lapic_state *s)
#ifdef KVM_CAP_PIT
-int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s)
+int kvm_get_pit(KVMState *s, struct kvm_pit_state *pit_state)
{
if (!kvm_pit_in_kernel()) {
return 0;
}
- return kvm_vm_ioctl(kvm_state, KVM_GET_PIT, s);
+ return kvm_vm_ioctl(s, KVM_GET_PIT, pit_state);
}
-int kvm_set_pit(kvm_context_t kvm, struct kvm_pit_state *s)
+int kvm_set_pit(KVMState *s, struct kvm_pit_state *pit_state)
{
if (!kvm_pit_in_kernel()) {
return 0;
}
- return kvm_vm_ioctl(kvm_state, KVM_SET_PIT, s);
+ return kvm_vm_ioctl(s, KVM_SET_PIT, pit_state);
}
#ifdef KVM_CAP_PIT_STATE2
-int kvm_get_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2)
+int kvm_get_pit2(KVMState *s, struct kvm_pit_state2 *ps2)
{
if (!kvm_pit_in_kernel()) {
return 0;
}
- return kvm_vm_ioctl(kvm_state, KVM_GET_PIT2, ps2);
+ return kvm_vm_ioctl(s, KVM_GET_PIT2, ps2);
}
-int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2)
+int kvm_set_pit2(KVMState *s, struct kvm_pit_state2 *ps2)
{
if (!kvm_pit_in_kernel()) {
return 0;
}
- return kvm_vm_ioctl(kvm_state, KVM_SET_PIT2, ps2);
+ return kvm_vm_ioctl(s, KVM_SET_PIT2, ps2);
}
#endif
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 4aa6b0f..9406fcf 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -55,7 +55,6 @@ int kvm_nested = 0;
KVMState *kvm_state;
-kvm_context_t kvm_context;
pthread_mutex_t qemu_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t qemu_vcpu_cond = PTHREAD_COND_INITIALIZER;
@@ -153,7 +152,6 @@ int kvm_init(void)
goto out_close;
}
kvm_state = qemu_mallocz(sizeof(*kvm_state));
- kvm_context = &kvm_state->kvm_context;
kvm_state->fd = fd;
kvm_state->vmfd = -1;
@@ -212,12 +210,13 @@ static int kvm_set_boot_vcpu_id(kvm_context_t kvm, uint32_t id)
#endif
}
-static int kvm_init_irq_routing(kvm_context_t kvm)
+static int kvm_init_irq_routing(KVMState *s)
{
#ifdef KVM_CAP_IRQ_ROUTING
+ kvm_context_t kvm = &s->kvm_context;
int r, gsi_count;
- gsi_count = kvm_check_extension(kvm_state, KVM_CAP_IRQ_ROUTING);
+ gsi_count = kvm_check_extension(s, KVM_CAP_IRQ_ROUTING);
if (gsi_count > 0) {
int gsi_bits, i;
@@ -232,7 +231,7 @@ static int kvm_init_irq_routing(kvm_context_t kvm)
}
}
- kvm->irq_routes = qemu_mallocz(sizeof(*kvm_context->irq_routes));
+ kvm->irq_routes = qemu_mallocz(sizeof(*kvm->irq_routes));
kvm->nr_allocated_irq_routes = 0;
r = kvm_arch_init_irq_routing();
@@ -244,16 +243,17 @@ static int kvm_init_irq_routing(kvm_context_t kvm)
return 0;
}
-int kvm_create_irqchip(kvm_context_t kvm)
+int kvm_create_irqchip(KVMState *s)
{
#ifdef KVM_CAP_IRQCHIP
+ kvm_context_t kvm = &s->kvm_context;
int r;
- if (!kvm_irqchip || !kvm_check_extension(kvm_state, KVM_CAP_IRQCHIP)) {
+ if (!kvm_irqchip || !kvm_check_extension(s, KVM_CAP_IRQCHIP)) {
return 0;
}
- r = kvm_vm_ioctl(kvm_state, KVM_CREATE_IRQCHIP);
+ r = kvm_vm_ioctl(s, KVM_CREATE_IRQCHIP);
if (r < 0) {
fprintf(stderr, "Create kernel PIC irqchip failed\n");
return r;
@@ -261,13 +261,13 @@ int kvm_create_irqchip(kvm_context_t kvm)
kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
#if defined(KVM_CAP_IRQ_INJECT_STATUS) && defined(KVM_IRQ_LINE_STATUS)
- if (kvm_check_extension(kvm_state, KVM_CAP_IRQ_INJECT_STATUS)) {
+ if (kvm_check_extension(s, KVM_CAP_IRQ_INJECT_STATUS)) {
kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
}
#endif
- kvm_state->irqchip_in_kernel = 1;
+ s->irqchip_in_kernel = 1;
- r = kvm_init_irq_routing(kvm);
+ r = kvm_init_irq_routing(s);
if (r < 0) {
return r;
}
@@ -307,28 +307,28 @@ int kvm_set_irq(int irq, int level, int *status)
return 1;
}
-int kvm_get_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip)
+int kvm_get_irqchip(KVMState *s, struct kvm_irqchip *chip)
{
int r;
- if (!kvm_state->irqchip_in_kernel) {
+ if (!s->irqchip_in_kernel) {
return 0;
}
- r = kvm_vm_ioctl(kvm_state, KVM_GET_IRQCHIP, chip);
+ r = kvm_vm_ioctl(s, KVM_GET_IRQCHIP, chip);
if (r < 0) {
perror("kvm_get_irqchip\n");
}
return r;
}
-int kvm_set_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip)
+int kvm_set_irqchip(KVMState *s, struct kvm_irqchip *chip)
{
int r;
- if (!kvm_state->irqchip_in_kernel) {
+ if (!s->irqchip_in_kernel) {
return 0;
}
- r = kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, chip);
+ r = kvm_vm_ioctl(s, KVM_SET_IRQCHIP, chip);
if (r < 0) {
perror("kvm_set_irqchip\n");
}
@@ -521,52 +521,52 @@ int kvm_inject_nmi(CPUState *env)
}
#ifdef KVM_CAP_DEVICE_ASSIGNMENT
-int kvm_assign_pci_device(kvm_context_t kvm,
+int kvm_assign_pci_device(KVMState *s,
struct kvm_assigned_pci_dev *assigned_dev)
{
- return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_PCI_DEVICE, assigned_dev);
+ return kvm_vm_ioctl(s, KVM_ASSIGN_PCI_DEVICE, assigned_dev);
}
-static int kvm_old_assign_irq(kvm_context_t kvm,
+static int kvm_old_assign_irq(KVMState *s,
struct kvm_assigned_irq *assigned_irq)
{
- return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_IRQ, assigned_irq);
+ return kvm_vm_ioctl(s, KVM_ASSIGN_IRQ, assigned_irq);
}
#ifdef KVM_CAP_ASSIGN_DEV_IRQ
-int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq)
+int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
{
int ret;
- ret = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_ASSIGN_DEV_IRQ);
+ ret = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_ASSIGN_DEV_IRQ);
if (ret > 0) {
- return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_DEV_IRQ, assigned_irq);
+ return kvm_vm_ioctl(s, KVM_ASSIGN_DEV_IRQ, assigned_irq);
}
- return kvm_old_assign_irq(kvm, assigned_irq);
+ return kvm_old_assign_irq(s, assigned_irq);
}
-int kvm_deassign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq)
+int kvm_deassign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
{
- return kvm_vm_ioctl(kvm_state, KVM_DEASSIGN_DEV_IRQ, assigned_irq);
+ return kvm_vm_ioctl(s, KVM_DEASSIGN_DEV_IRQ, assigned_irq);
}
#else
-int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq)
+int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq)
{
- return kvm_old_assign_irq(kvm, assigned_irq);
+ return kvm_old_assign_irq(s, assigned_irq);
}
#endif
#endif
#ifdef KVM_CAP_DEVICE_DEASSIGNMENT
-int kvm_deassign_pci_device(kvm_context_t kvm,
+int kvm_deassign_pci_device(KVMState *s,
struct kvm_assigned_pci_dev *assigned_dev)
{
- return kvm_vm_ioctl(kvm_state, KVM_DEASSIGN_PCI_DEVICE, assigned_dev);
+ return kvm_vm_ioctl(s, KVM_DEASSIGN_PCI_DEVICE, assigned_dev);
}
#endif
-int kvm_reinject_control(kvm_context_t kvm, int pit_reinject)
+int kvm_reinject_control(KVMState *s, int pit_reinject)
{
#ifdef KVM_CAP_REINJECT_CONTROL
int r;
@@ -574,9 +574,9 @@ int kvm_reinject_control(kvm_context_t kvm, int pit_reinject)
control.pit_reinject = pit_reinject;
- r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_REINJECT_CONTROL);
+ r = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_REINJECT_CONTROL);
if (r > 0) {
- return kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control);
+ return kvm_vm_ioctl(s, KVM_REINJECT_CONTROL, &control);
}
#endif
return -ENOSYS;
@@ -595,7 +595,7 @@ int kvm_has_gsi_routing(void)
int kvm_clear_gsi_routes(void)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = kvm_context;
+ kvm_context_t kvm = &kvm_state->kvm_context;
kvm->irq_routes->nr = 0;
return 0;
@@ -607,7 +607,7 @@ int kvm_clear_gsi_routes(void)
int kvm_add_routing_entry(struct kvm_irq_routing_entry *entry)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = kvm_context;
+ kvm_context_t kvm = &kvm_state->kvm_context;
struct kvm_irq_routing *z;
struct kvm_irq_routing_entry *new;
int n, size;
@@ -661,7 +661,7 @@ int kvm_add_irq_route(int gsi, int irqchip, int pin)
int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = kvm_context;
+ kvm_context_t kvm = &kvm_state->kvm_context;
struct kvm_irq_routing_entry *e, *p;
int i, gsi, found = 0;
@@ -722,7 +722,7 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
struct kvm_irq_routing_entry *newentry)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = kvm_context;
+ kvm_context_t kvm = &kvm_state->kvm_context;
struct kvm_irq_routing_entry *e;
int i;
@@ -781,7 +781,7 @@ int kvm_del_irq_route(int gsi, int irqchip, int pin)
int kvm_commit_irq_routes(void)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = kvm_context;
+ kvm_context_t kvm = &kvm_state->kvm_context;
kvm->irq_routes->flags = 0;
return kvm_vm_ioctl(kvm_state, KVM_SET_GSI_ROUTING, kvm->irq_routes);
@@ -792,7 +792,7 @@ int kvm_commit_irq_routes(void)
int kvm_get_irq_route_gsi(void)
{
- kvm_context_t kvm = kvm_context;
+ kvm_context_t kvm = &kvm_state->kvm_context;
int i, bit;
uint32_t *buf = kvm->used_gsi_bitmap;
@@ -867,16 +867,15 @@ int kvm_msi_message_update(KVMMsiMessage *old, KVMMsiMessage *new)
#ifdef KVM_CAP_DEVICE_MSIX
-int kvm_assign_set_msix_nr(kvm_context_t kvm,
- struct kvm_assigned_msix_nr *msix_nr)
+int kvm_assign_set_msix_nr(KVMState *s, struct kvm_assigned_msix_nr *msix_nr)
{
- return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_SET_MSIX_NR, msix_nr);
+ return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, msix_nr);
}
-int kvm_assign_set_msix_entry(kvm_context_t kvm,
+int kvm_assign_set_msix_entry(KVMState *s,
struct kvm_assigned_msix_entry *entry)
{
- return kvm_vm_ioctl(kvm_state, KVM_ASSIGN_SET_MSIX_ENTRY, entry);
+ return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_ENTRY, entry);
}
#endif
@@ -1234,18 +1233,18 @@ void kvm_hpet_disable_kpit(void)
{
struct kvm_pit_state2 ps2;
- kvm_get_pit2(kvm_context, &ps2);
+ kvm_get_pit2(kvm_state, &ps2);
ps2.flags |= KVM_PIT_FLAGS_HPET_LEGACY;
- kvm_set_pit2(kvm_context, &ps2);
+ kvm_set_pit2(kvm_state, &ps2);
}
void kvm_hpet_enable_kpit(void)
{
struct kvm_pit_state2 ps2;
- kvm_get_pit2(kvm_context, &ps2);
+ kvm_get_pit2(kvm_state, &ps2);
ps2.flags &= ~KVM_PIT_FLAGS_HPET_LEGACY;
- kvm_set_pit2(kvm_context, &ps2);
+ kvm_set_pit2(kvm_state, &ps2);
}
#endif
@@ -1397,7 +1396,7 @@ static int kvm_create_context(void)
return -EINVAL;
}
- r = kvm_create_irqchip(kvm_context);
+ r = kvm_create_irqchip(kvm_state);
if (r < 0) {
return r;
}
@@ -1500,6 +1499,6 @@ void kvm_ioperm(CPUState *env, void *data)
int kvm_set_boot_cpu_id(uint32_t id)
{
- return kvm_set_boot_vcpu_id(kvm_context, id);
+ return kvm_set_boot_vcpu_id(&kvm_state->kvm_context, id);
}
diff --git a/qemu-kvm.h b/qemu-kvm.h
index dd11e32..2c67a28 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -66,7 +66,7 @@ typedef struct kvm_context *kvm_context_t;
int kvm_arch_run(CPUState *env);
-int kvm_create_irqchip(kvm_context_t kvm);
+int kvm_create_irqchip(KVMState *s);
/*!
* \brief Check if a vcpu is ready for interrupt injection
@@ -103,7 +103,7 @@ int kvm_inject_irq(CPUState *env, unsigned irq);
* \param kvm Pointer to the current kvm_context
* \param chip The irq chip device to be dumped
*/
-int kvm_get_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip);
+int kvm_get_irqchip(KVMState *s, struct kvm_irqchip *chip);
/*!
* \brief Set in kernel IRQCHIP contents
@@ -115,7 +115,7 @@ int kvm_get_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip);
* \param kvm Pointer to the current kvm_context
* \param chip THe irq chip device to be written
*/
-int kvm_set_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip);
+int kvm_set_irqchip(KVMState *s, struct kvm_irqchip *chip);
#if defined(__i386__) || defined(__x86_64__)
/*!
@@ -166,7 +166,7 @@ int kvm_inject_nmi(CPUState *env);
* \param kvm Pointer to the current kvm_context
* \param s PIT state of the virtual domain
*/
-int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s);
+int kvm_get_pit(KVMState *s, struct kvm_pit_state *pit_state);
/*!
* \brief Set in kernel PIT of the virtual domain
@@ -177,9 +177,9 @@ int kvm_get_pit(kvm_context_t kvm, struct kvm_pit_state *s);
* \param kvm Pointer to the current kvm_context
* \param s PIT state of the virtual domain
*/
-int kvm_set_pit(kvm_context_t kvm, struct kvm_pit_state *s);
+int kvm_set_pit(KVMState *s, struct kvm_pit_state *pit_state);
-int kvm_reinject_control(kvm_context_t kvm, int pit_reinject);
+int kvm_reinject_control(KVMState *s, int pit_reinject);
#ifdef KVM_CAP_PIT_STATE2
/*!
@@ -190,7 +190,7 @@ int kvm_reinject_control(kvm_context_t kvm, int pit_reinject);
* \param ps2 PIT state2 of the virtual domain
* \return 0 on success
*/
-int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2);
+int kvm_set_pit2(KVMState *s, struct kvm_pit_state2 *ps2);
/*!
* \brief Get in kernel PIT state2 of the virtual domain
@@ -200,7 +200,7 @@ int kvm_set_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2);
* \param ps2 PIT state2 of the virtual domain
* \return 0 on success
*/
-int kvm_get_pit2(kvm_context_t kvm, struct kvm_pit_state2 *ps2);
+int kvm_get_pit2(KVMState *s, struct kvm_pit_state2 *ps2);
#endif
#endif
@@ -222,7 +222,7 @@ int kvm_enable_vapic(CPUState *env, uint64_t vapic);
* \param kvm Pointer to the current kvm_context
* \param assigned_dev Parameters, like bus, devfn number, etc
*/
-int kvm_assign_pci_device(kvm_context_t kvm,
+int kvm_assign_pci_device(KVMState *s,
struct kvm_assigned_pci_dev *assigned_dev);
/*!
@@ -234,7 +234,7 @@ int kvm_assign_pci_device(kvm_context_t kvm,
* \param kvm Pointer to the current kvm_context
* \param assigned_irq Parameters, like dev id, host irq, guest irq, etc
*/
-int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
+int kvm_assign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq);
#ifdef KVM_CAP_ASSIGN_DEV_IRQ
/*!
@@ -246,7 +246,7 @@ int kvm_assign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
* \param kvm Pointer to the current kvm_context
* \param assigned_irq Parameters, like dev id, host irq, guest irq, etc
*/
-int kvm_deassign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
+int kvm_deassign_irq(KVMState *s, struct kvm_assigned_irq *assigned_irq);
#endif
#endif
@@ -260,7 +260,7 @@ int kvm_deassign_irq(kvm_context_t kvm, struct kvm_assigned_irq *assigned_irq);
* \param kvm Pointer to the current kvm_context
* \param assigned_dev Parameters, like bus, devfn number, etc
*/
-int kvm_deassign_pci_device(kvm_context_t kvm,
+int kvm_deassign_pci_device(KVMState *s,
struct kvm_assigned_pci_dev *assigned_dev);
#endif
@@ -318,16 +318,13 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
#ifdef KVM_CAP_DEVICE_MSIX
-int kvm_assign_set_msix_nr(kvm_context_t kvm,
- struct kvm_assigned_msix_nr *msix_nr);
-int kvm_assign_set_msix_entry(kvm_context_t kvm,
+int kvm_assign_set_msix_nr(KVMState *s, struct kvm_assigned_msix_nr *msix_nr);
+int kvm_assign_set_msix_entry(KVMState *s,
struct kvm_assigned_msix_entry *entry);
#endif
#else /* !CONFIG_KVM */
-typedef struct kvm_context *kvm_context_t;
-
struct kvm_pit_state {
};
@@ -383,7 +380,6 @@ extern int kvm_irqchip;
extern int kvm_pit;
extern int kvm_pit_reinject;
extern int kvm_nested;
-extern kvm_context_t kvm_context;
extern unsigned int kvm_shadow_memory;
struct ioperm_data {
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index a8b5c6d..33239bf 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -601,7 +601,7 @@ static int kvm_get_supported_msrs(KVMState *s)
return ret;
}
-static int kvm_create_pit(kvm_context_t kvm);
+static int kvm_create_pit(KVMState *s);
int kvm_arch_init(KVMState *s)
{
@@ -653,7 +653,7 @@ int kvm_arch_init(KVMState *s)
}
qemu_register_reset(kvm_unpoison_all, NULL);
- ret = kvm_create_pit(&s->kvm_context);
+ ret = kvm_create_pit(s);
if (ret < 0) {
return ret;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 12/16] qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (10 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 11/16] qemu-kvm: Remove kvm_context from public interfaces Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 13/16] qemu-kvm: Remove handle_io_window Jan Kiszka
` (5 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
qemu-kvm.c | 23 ++++++++---------------
qemu-kvm.h | 2 +-
target-i386/kvm.c | 2 +-
3 files changed, 10 insertions(+), 17 deletions(-)
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 9406fcf..b1405fd 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -197,19 +197,6 @@ static void kvm_finalize(KVMState *s)
free(s);
}
-static int kvm_set_boot_vcpu_id(kvm_context_t kvm, uint32_t id)
-{
-#ifdef KVM_CAP_SET_BOOT_CPU_ID
- int r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_BOOT_CPU_ID);
- if (r > 0) {
- return kvm_vm_ioctl(kvm_state, KVM_SET_BOOT_CPU_ID, id);
- }
- return -ENOSYS;
-#else
- return -ENOSYS;
-#endif
-}
-
static int kvm_init_irq_routing(KVMState *s)
{
#ifdef KVM_CAP_IRQ_ROUTING
@@ -1497,8 +1484,14 @@ void kvm_ioperm(CPUState *env, void *data)
#endif
-int kvm_set_boot_cpu_id(uint32_t id)
+int kvm_set_boot_cpu_id(KVMState *s, uint32_t id)
{
- return kvm_set_boot_vcpu_id(&kvm_state->kvm_context, id);
+#ifdef KVM_CAP_SET_BOOT_CPU_ID
+ int r = kvm_ioctl(s, KVM_CHECK_EXTENSION, KVM_CAP_SET_BOOT_CPU_ID);
+ if (r > 0) {
+ return kvm_vm_ioctl(s, KVM_SET_BOOT_CPU_ID, id);
+ }
+#endif
+ return -ENOSYS;
}
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 2c67a28..a55ef46 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -358,7 +358,7 @@ int kvm_arch_has_work(CPUState *env);
void kvm_arch_process_irqchip_events(CPUState *env);
int kvm_arch_try_push_interrupts(void *opaque);
void kvm_arch_push_nmi(void);
-int kvm_set_boot_cpu_id(uint32_t id);
+int kvm_set_boot_cpu_id(KVMState *s, uint32_t id);
void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write);
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 33239bf..9b8c460 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -665,7 +665,7 @@ int kvm_arch_init(KVMState *s)
}
}
- ret = kvm_set_boot_cpu_id(0);
+ ret = kvm_set_boot_cpu_id(s, 0);
if (ret < 0 && ret != -ENOSYS) {
return ret;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 13/16] qemu-kvm: Remove handle_io_window
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (11 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 12/16] qemu-kvm: Fold kvm_set_boot_vcpu_id into kvm_set_boot_cpu_id Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 14/16] qemu-kvm: Merge kvm_context into KVMState Jan Kiszka
` (4 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Disentangle the logic around handle_io_window in kvm_run.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
qemu-kvm.c | 9 +--------
1 files changed, 1 insertions(+), 8 deletions(-)
diff --git a/qemu-kvm.c b/qemu-kvm.c
index b1405fd..2af70c5 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -339,11 +339,6 @@ static int handle_mmio(CPUState *env)
return 0;
}
-static int handle_io_window(kvm_context_t kvm)
-{
- return 1;
-}
-
static int handle_shutdown(kvm_context_t kvm, CPUState *env)
{
/* stop the current vcpu from going back to guest mode */
@@ -422,8 +417,7 @@ static int kvm_run(CPUState *env)
#if !defined(__s390__)
if (r == -1) {
- r = handle_io_window(kvm);
- goto more;
+ return 1;
}
#endif
if (1) {
@@ -483,7 +477,6 @@ static int kvm_run(CPUState *env)
break;
}
}
-more:
if (!r) {
goto again;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 14/16] qemu-kvm: Merge kvm_context into KVMState
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (12 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 13/16] qemu-kvm: Remove handle_io_window Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 15/16] qemu-kvm: Use KVM-optimized interrupt handler Jan Kiszka
` (3 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Append the few additional fields needed for qemu-kvm to upstream's
KVMState and drop all related duplications.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
kvm-all.c | 11 ++++-
qemu-kvm.c | 121 ++++++++++++++++++++++++++++-------------------------------
qemu-kvm.h | 58 -----------------------------
3 files changed, 66 insertions(+), 124 deletions(-)
diff --git a/kvm-all.c b/kvm-all.c
index 9463341..a2c517e 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -50,8 +50,6 @@
do { } while (0)
#endif
-#ifdef OBSOLETE_KVM_IMPL
-
typedef struct KVMSlot
{
target_phys_addr_t start_addr;
@@ -83,10 +81,19 @@ struct KVMState
int xsave, xcrs;
int many_ioeventfds;
int pit_state2;
+
+ int irqchip_inject_ioctl;
+#ifdef KVM_CAP_IRQ_ROUTING
+ struct kvm_irq_routing *irq_routes;
+ int nr_allocated_irq_routes;
+#endif
+ void *used_gsi_bitmap;
+ int max_gsi;
};
KVMState *kvm_state;
+#ifdef OBSOLETE_KVM_IMPL
static const KVMCapabilityInfo kvm_required_capabilites[] = {
KVM_CAP_INFO(USER_MEMORY),
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 2af70c5..df8e817 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -53,9 +53,6 @@ int kvm_pit = 1;
int kvm_pit_reinject = 1;
int kvm_nested = 0;
-
-KVMState *kvm_state;
-
pthread_mutex_t qemu_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t qemu_vcpu_cond = PTHREAD_COND_INITIALIZER;
pthread_cond_t qemu_system_cond = PTHREAD_COND_INITIALIZER;
@@ -101,24 +98,26 @@ static int handle_failed_vmentry(uint64_t reason)
return -EINVAL;
}
-static inline void set_gsi(kvm_context_t kvm, unsigned int gsi)
+static inline void set_gsi(KVMState *s, unsigned int gsi)
{
- uint32_t *bitmap = kvm->used_gsi_bitmap;
+ uint32_t *bitmap = s->used_gsi_bitmap;
- if (gsi < kvm->max_gsi)
+ if (gsi < s->max_gsi) {
bitmap[gsi / 32] |= 1U << (gsi % 32);
- else
+ } else {
DPRINTF("Invalid GSI %u\n", gsi);
+ }
}
-static inline void clear_gsi(kvm_context_t kvm, unsigned int gsi)
+static inline void clear_gsi(KVMState *s, unsigned int gsi)
{
- uint32_t *bitmap = kvm->used_gsi_bitmap;
+ uint32_t *bitmap = s->used_gsi_bitmap;
- if (gsi < kvm->max_gsi)
+ if (gsi < s->max_gsi) {
bitmap[gsi / 32] &= ~(1U << (gsi % 32));
- else
+ } else {
DPRINTF("Invalid GSI %u\n", gsi);
+ }
}
static int kvm_create_context(void);
@@ -200,7 +199,6 @@ static void kvm_finalize(KVMState *s)
static int kvm_init_irq_routing(KVMState *s)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = &s->kvm_context;
int r, gsi_count;
gsi_count = kvm_check_extension(s, KVM_CAP_IRQ_ROUTING);
@@ -209,17 +207,17 @@ static int kvm_init_irq_routing(KVMState *s)
/* Round up so we can search ints using ffs */
gsi_bits = ALIGN(gsi_count, 32);
- kvm->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
- kvm->max_gsi = gsi_bits;
+ s->used_gsi_bitmap = qemu_mallocz(gsi_bits / 8);
+ s->max_gsi = gsi_bits;
/* Mark any over-allocated bits as already in use */
for (i = gsi_count; i < gsi_bits; i++) {
- set_gsi(kvm, i);
+ set_gsi(s, i);
}
}
- kvm->irq_routes = qemu_mallocz(sizeof(*kvm->irq_routes));
- kvm->nr_allocated_irq_routes = 0;
+ s->irq_routes = qemu_mallocz(sizeof(*s->irq_routes));
+ s->nr_allocated_irq_routes = 0;
r = kvm_arch_init_irq_routing();
if (r < 0) {
@@ -233,7 +231,6 @@ static int kvm_init_irq_routing(KVMState *s)
int kvm_create_irqchip(KVMState *s)
{
#ifdef KVM_CAP_IRQCHIP
- kvm_context_t kvm = &s->kvm_context;
int r;
if (!kvm_irqchip || !kvm_check_extension(s, KVM_CAP_IRQCHIP)) {
@@ -246,10 +243,10 @@ int kvm_create_irqchip(KVMState *s)
return r;
}
- kvm->irqchip_inject_ioctl = KVM_IRQ_LINE;
+ s->irqchip_inject_ioctl = KVM_IRQ_LINE;
#if defined(KVM_CAP_IRQ_INJECT_STATUS) && defined(KVM_IRQ_LINE_STATUS)
if (kvm_check_extension(s, KVM_CAP_IRQ_INJECT_STATUS)) {
- kvm->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
+ s->irqchip_inject_ioctl = KVM_IRQ_LINE_STATUS;
}
#endif
s->irqchip_in_kernel = 1;
@@ -275,7 +272,7 @@ int kvm_set_irq(int irq, int level, int *status)
}
event.level = level;
event.irq = irq;
- r = kvm_vm_ioctl(kvm_state, kvm_state->kvm_context.irqchip_inject_ioctl,
+ r = kvm_vm_ioctl(kvm_state, kvm_state->irqchip_inject_ioctl,
&event);
if (r < 0) {
perror("kvm_set_irq");
@@ -283,9 +280,8 @@ int kvm_set_irq(int irq, int level, int *status)
if (status) {
#ifdef KVM_CAP_IRQ_INJECT_STATUS
- *status =
- (kvm_state->kvm_context.irqchip_inject_ioctl == KVM_IRQ_LINE) ?
- 1 : event.status;
+ *status = (kvm_state->irqchip_inject_ioctl == KVM_IRQ_LINE) ?
+ 1 : event.status;
#else
*status = 1;
#endif
@@ -339,7 +335,7 @@ static int handle_mmio(CPUState *env)
return 0;
}
-static int handle_shutdown(kvm_context_t kvm, CPUState *env)
+static int handle_shutdown(CPUState *env)
{
/* stop the current vcpu from going back to guest mode */
env->stopped = 1;
@@ -348,21 +344,21 @@ static int handle_shutdown(kvm_context_t kvm, CPUState *env)
return 1;
}
-static inline void push_nmi(kvm_context_t kvm)
+static inline void push_nmi(void)
{
#ifdef KVM_CAP_USER_NMI
kvm_arch_push_nmi();
#endif /* KVM_CAP_USER_NMI */
}
-static void post_kvm_run(kvm_context_t kvm, CPUState *env)
+static void post_kvm_run(CPUState *env)
{
pthread_mutex_lock(&qemu_mutex);
kvm_arch_post_run(env, env->kvm_run);
cpu_single_env = env;
}
-static int pre_kvm_run(kvm_context_t kvm, CPUState *env)
+static int pre_kvm_run(CPUState *env)
{
kvm_arch_pre_run(env, env->kvm_run);
@@ -378,7 +374,6 @@ int kvm_is_ready_for_interrupt_injection(CPUState *env)
static int kvm_run(CPUState *env)
{
int r;
- kvm_context_t kvm = &env->kvm_state->kvm_context;
struct kvm_run *run = env->kvm_run;
int fd = env->kvm_fd;
@@ -387,14 +382,14 @@ static int kvm_run(CPUState *env)
kvm_arch_put_registers(env, KVM_PUT_RUNTIME_STATE);
env->kvm_vcpu_dirty = 0;
}
- push_nmi(kvm);
+ push_nmi();
#if !defined(__s390__)
if (!kvm_state->irqchip_in_kernel) {
run->request_interrupt_window = kvm_arch_try_push_interrupts(env);
}
#endif
- r = pre_kvm_run(kvm, env);
+ r = pre_kvm_run(env);
if (r) {
return r;
}
@@ -406,12 +401,12 @@ static int kvm_run(CPUState *env)
if (r == -1 && errno != EINTR && errno != EAGAIN) {
r = -errno;
- post_kvm_run(kvm, env);
+ post_kvm_run(env);
fprintf(stderr, "kvm_run: %s\n", strerror(-r));
return r;
}
- post_kvm_run(kvm, env);
+ post_kvm_run(env);
kvm_flush_coalesced_mmio_buffer();
@@ -451,7 +446,7 @@ static int kvm_run(CPUState *env)
case KVM_EXIT_IRQ_WINDOW_OPEN:
break;
case KVM_EXIT_SHUTDOWN:
- r = handle_shutdown(kvm, env);
+ r = handle_shutdown(env);
break;
#if defined(__s390__)
case KVM_EXIT_S390_SIEIC:
@@ -575,9 +570,7 @@ int kvm_has_gsi_routing(void)
int kvm_clear_gsi_routes(void)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = &kvm_state->kvm_context;
-
- kvm->irq_routes->nr = 0;
+ kvm_state->irq_routes->nr = 0;
return 0;
#else
return -EINVAL;
@@ -587,34 +580,34 @@ int kvm_clear_gsi_routes(void)
int kvm_add_routing_entry(struct kvm_irq_routing_entry *entry)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = &kvm_state->kvm_context;
+ KVMState *s = kvm_state;
struct kvm_irq_routing *z;
struct kvm_irq_routing_entry *new;
int n, size;
- if (kvm->irq_routes->nr == kvm->nr_allocated_irq_routes) {
- n = kvm->nr_allocated_irq_routes * 2;
+ if (s->irq_routes->nr == s->nr_allocated_irq_routes) {
+ n = s->nr_allocated_irq_routes * 2;
if (n < 64) {
n = 64;
}
size = sizeof(struct kvm_irq_routing);
size += n * sizeof(*new);
- z = realloc(kvm->irq_routes, size);
+ z = realloc(s->irq_routes, size);
if (!z) {
return -ENOMEM;
}
- kvm->nr_allocated_irq_routes = n;
- kvm->irq_routes = z;
+ s->nr_allocated_irq_routes = n;
+ s->irq_routes = z;
}
- n = kvm->irq_routes->nr++;
- new = &kvm->irq_routes->entries[n];
+ n = s->irq_routes->nr++;
+ new = &s->irq_routes->entries[n];
memset(new, 0, sizeof(*new));
new->gsi = entry->gsi;
new->type = entry->type;
new->flags = entry->flags;
new->u = entry->u;
- set_gsi(kvm, entry->gsi);
+ set_gsi(s, entry->gsi);
return 0;
#else
@@ -641,21 +634,21 @@ int kvm_add_irq_route(int gsi, int irqchip, int pin)
int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = &kvm_state->kvm_context;
+ KVMState *s = kvm_state;
struct kvm_irq_routing_entry *e, *p;
int i, gsi, found = 0;
gsi = entry->gsi;
- for (i = 0; i < kvm->irq_routes->nr; ++i) {
- e = &kvm->irq_routes->entries[i];
+ for (i = 0; i < s->irq_routes->nr; ++i) {
+ e = &s->irq_routes->entries[i];
if (e->type == entry->type && e->gsi == gsi) {
switch (e->type) {
case KVM_IRQ_ROUTING_IRQCHIP:{
if (e->u.irqchip.irqchip ==
entry->u.irqchip.irqchip
&& e->u.irqchip.pin == entry->u.irqchip.pin) {
- p = &kvm->irq_routes->entries[--kvm->irq_routes->nr];
+ p = &s->irq_routes->entries[--s->irq_routes->nr];
*e = *p;
found = 1;
}
@@ -667,7 +660,7 @@ int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
&& e->u.msi.address_hi ==
entry->u.msi.address_hi
&& e->u.msi.data == entry->u.msi.data) {
- p = &kvm->irq_routes->entries[--kvm->irq_routes->nr];
+ p = &s->irq_routes->entries[--s->irq_routes->nr];
*e = *p;
found = 1;
}
@@ -679,13 +672,13 @@ int kvm_del_routing_entry(struct kvm_irq_routing_entry *entry)
if (found) {
/* If there are no other users of this GSI
* mark it available in the bitmap */
- for (i = 0; i < kvm->irq_routes->nr; i++) {
- e = &kvm->irq_routes->entries[i];
+ for (i = 0; i < s->irq_routes->nr; i++) {
+ e = &s->irq_routes->entries[i];
if (e->gsi == gsi)
break;
}
- if (i == kvm->irq_routes->nr) {
- clear_gsi(kvm, gsi);
+ if (i == s->irq_routes->nr) {
+ clear_gsi(s, gsi);
}
return 0;
@@ -702,7 +695,7 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
struct kvm_irq_routing_entry *newentry)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = &kvm_state->kvm_context;
+ KVMState *s = kvm_state;
struct kvm_irq_routing_entry *e;
int i;
@@ -710,8 +703,8 @@ int kvm_update_routing_entry(struct kvm_irq_routing_entry *entry,
return -EINVAL;
}
- for (i = 0; i < kvm->irq_routes->nr; ++i) {
- e = &kvm->irq_routes->entries[i];
+ for (i = 0; i < s->irq_routes->nr; ++i) {
+ e = &s->irq_routes->entries[i];
if (e->type != entry->type || e->gsi != entry->gsi) {
continue;
}
@@ -761,10 +754,10 @@ int kvm_del_irq_route(int gsi, int irqchip, int pin)
int kvm_commit_irq_routes(void)
{
#ifdef KVM_CAP_IRQ_ROUTING
- kvm_context_t kvm = &kvm_state->kvm_context;
+ KVMState *s = kvm_state;
- kvm->irq_routes->flags = 0;
- return kvm_vm_ioctl(kvm_state, KVM_SET_GSI_ROUTING, kvm->irq_routes);
+ s->irq_routes->flags = 0;
+ return kvm_vm_ioctl(s, KVM_SET_GSI_ROUTING, s->irq_routes);
#else
return -ENOSYS;
#endif
@@ -772,12 +765,12 @@ int kvm_commit_irq_routes(void)
int kvm_get_irq_route_gsi(void)
{
- kvm_context_t kvm = &kvm_state->kvm_context;
+ KVMState *s = kvm_state;
int i, bit;
- uint32_t *buf = kvm->used_gsi_bitmap;
+ uint32_t *buf = s->used_gsi_bitmap;
/* Return the lowest unused GSI in the bitmap */
- for (i = 0; i < kvm->max_gsi / 32; i++) {
+ for (i = 0; i < s->max_gsi / 32; i++) {
bit = ffs(~buf[i]);
if (!bit) {
continue;
diff --git a/qemu-kvm.h b/qemu-kvm.h
index a55ef46..7386b46 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -43,25 +43,6 @@
#define MAX_VCPUS 16
#endif
-/**
- * \brief The KVM context
- *
- * The verbose KVM context
- */
-
-struct kvm_context {
- /// ioctl to use to inject interrupts
- int irqchip_inject_ioctl;
-#ifdef KVM_CAP_IRQ_ROUTING
- struct kvm_irq_routing *irq_routes;
- int nr_allocated_irq_routes;
-#endif
- void *used_gsi_bitmap;
- int max_gsi;
-};
-
-typedef struct kvm_context *kvm_context_t;
-
#include "kvm.h"
int kvm_arch_run(CPUState *env);
@@ -397,47 +378,8 @@ int handle_tpr_access(void *opaque, CPUState *env, uint64_t rip,
#define kvm_nested 0
#endif
-#ifdef CONFIG_KVM
-
-typedef struct KVMSlot {
- target_phys_addr_t start_addr;
- ram_addr_t memory_size;
- ram_addr_t phys_offset;
- int slot;
- int flags;
-} KVMSlot;
-
-typedef struct kvm_dirty_log KVMDirtyLog;
-
-struct KVMState {
- KVMSlot slots[32];
- int fd;
- int vmfd;
- int coalesced_mmio;
-#ifdef KVM_CAP_COALESCED_MMIO
- struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
-#endif
- int broken_set_mem_region;
- int migration_log;
- int vcpu_events;
- int robust_singlestep;
- int debugregs;
-#ifdef KVM_CAP_SET_GUEST_DEBUG
- QTAILQ_HEAD(, kvm_sw_breakpoint) kvm_sw_breakpoints;
-#endif
- int irqchip_in_kernel;
- int pit_in_kernel;
- int xsave, xcrs;
- int many_ioeventfds;
- int pit_state2;
-
- struct kvm_context kvm_context;
-};
-
int kvm_tpr_enable_vapic(CPUState *env);
unsigned long kvm_get_thread_id(void);
#endif
-
-#endif
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 15/16] qemu-kvm: Use KVM-optimized interrupt handler
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (13 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 14/16] qemu-kvm: Merge kvm_context into KVMState Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-13 12:14 ` [PATCH 16/16] qemu-kvm: Use upstream kvm_init Jan Kiszka
` (2 subsequent siblings)
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Instead of hooking into tcg_handler_interrupt, set cpu_interrupt_handler
just like upstream and move kvm_update_interrupt_request to
kvm_handle_interrupt. It's not worth keeping the check for !irqchip, we
will only rarely get here in the in-kernel irqchip case.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
exec.c | 2 --
kvm-all.c | 3 ++-
qemu-kvm.c | 2 ++
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/exec.c b/exec.c
index 169f9f4..6c4b32b 100644
--- a/exec.c
+++ b/exec.c
@@ -1646,8 +1646,6 @@ static void tcg_handle_interrupt(CPUState *env, int mask)
old_mask = env->interrupt_request;
env->interrupt_request |= mask;
- if (kvm_enabled() && !kvm_irqchip_in_kernel())
- kvm_update_interrupt_request(env);
/*
* If called from iothread context, wake the target cpu in
diff --git a/kvm-all.c b/kvm-all.c
index a2c517e..8ded95c 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -683,7 +683,6 @@ static CPUPhysMemoryClient kvm_cpu_phys_memory_client = {
.log_stop = kvm_log_stop,
};
-#ifdef OBSOLETE_KVM_IMPL
static void kvm_handle_interrupt(CPUState *env, int mask)
{
env->interrupt_request |= mask;
@@ -691,8 +690,10 @@ static void kvm_handle_interrupt(CPUState *env, int mask)
if (!qemu_cpu_is_self(env)) {
qemu_cpu_kick(env);
}
+ kvm_update_interrupt_request(env);
}
+#ifdef OBSOLETE_KVM_IMPL
int kvm_init(void)
{
static const char upgrade_note[] =
diff --git a/qemu-kvm.c b/qemu-kvm.c
index df8e817..5ba5b0a 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1409,6 +1409,8 @@ static int kvm_create_context(void)
kvm_init_ap();
+ cpu_interrupt_handler = kvm_handle_interrupt;
+
return 0;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* [PATCH 16/16] qemu-kvm: Use upstream kvm_init
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (14 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 15/16] qemu-kvm: Use KVM-optimized interrupt handler Jan Kiszka
@ 2011-05-13 12:14 ` Jan Kiszka
2011-05-16 10:37 ` [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Avi Kivity
2011-05-17 18:47 ` Marcelo Tosatti
17 siblings, 0 replies; 22+ messages in thread
From: Jan Kiszka @ 2011-05-13 12:14 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm
Fold remaining qemu-kvm specific initialization bits into upsteam
kvm_init and use that service.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
kvm-all.c | 17 +++---
kvm.h | 4 --
qemu-kvm-x86.c | 2 +-
qemu-kvm.c | 156 +----------------------------------------------------
qemu-kvm.h | 13 -----
target-i386/kvm.c | 2 -
6 files changed, 12 insertions(+), 182 deletions(-)
diff --git a/kvm-all.c b/kvm-all.c
index 8ded95c..6b35ea5 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -93,16 +93,12 @@ struct KVMState
KVMState *kvm_state;
-#ifdef OBSOLETE_KVM_IMPL
-
static const KVMCapabilityInfo kvm_required_capabilites[] = {
KVM_CAP_INFO(USER_MEMORY),
KVM_CAP_INFO(DESTROY_MEMORY_REGION_WORKS),
KVM_CAP_LAST_INFO
};
-#endif
-
static KVMSlot *kvm_alloc_slot(KVMState *s)
{
int i;
@@ -512,7 +508,6 @@ static int kvm_check_many_ioeventfds(void)
#endif
}
-#ifdef OBSOLETE_KVM_IMPL
static const KVMCapabilityInfo *
kvm_check_extension_list(KVMState *s, const KVMCapabilityInfo *list)
{
@@ -524,7 +519,6 @@ kvm_check_extension_list(KVMState *s, const KVMCapabilityInfo *list)
}
return NULL;
}
-#endif
static void kvm_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size,
ram_addr_t phys_offset)
@@ -693,7 +687,6 @@ static void kvm_handle_interrupt(CPUState *env, int mask)
kvm_update_interrupt_request(env);
}
-#ifdef OBSOLETE_KVM_IMPL
int kvm_init(void)
{
static const char upgrade_note[] =
@@ -797,6 +790,8 @@ int kvm_init(void)
s->pit_state2 = kvm_check_extension(s, KVM_CAP_PIT_STATE2);
#endif
+ s->pit_in_kernel = kvm_pit;
+
ret = kvm_arch_init(s);
if (ret < 0) {
goto err;
@@ -807,6 +802,13 @@ int kvm_init(void)
s->many_ioeventfds = kvm_check_many_ioeventfds();
+ ret = kvm_create_irqchip(s);
+ if (ret < 0) {
+ return ret;
+ }
+
+ kvm_init_ap();
+
cpu_interrupt_handler = kvm_handle_interrupt;
return 0;
@@ -824,7 +826,6 @@ err:
return ret;
}
-#endif
static void kvm_handle_io(uint16_t port, void *data, int direction, int size,
uint32_t count)
diff --git a/kvm.h b/kvm.h
index 75dc7cf..288a452 100644
--- a/kvm.h
+++ b/kvm.h
@@ -30,7 +30,6 @@ extern int kvm_allowed;
#define kvm_enabled() (0)
#endif
-#ifdef OBSOLETE_KVM_IMPL
struct kvm_run;
typedef struct KVMCapabilityInfo {
@@ -44,7 +43,6 @@ typedef struct KVMCapabilityInfo {
/* external API */
int kvm_init(void);
-#endif /* OBSOLETE_KVM_IMPL */
int kvm_has_sync_mmu(void);
int kvm_has_vcpu_events(void);
@@ -99,9 +97,7 @@ int kvm_vcpu_ioctl(CPUState *env, int type, ...);
/* Arch specific hooks */
-#ifdef OBSOLETE_KVM_IMPL
extern const KVMCapabilityInfo kvm_arch_required_capabilities[];
-#endif
void kvm_arch_pre_run(CPUState *env, struct kvm_run *run);
void kvm_arch_post_run(CPUState *env, struct kvm_run *run);
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 2aa833f..b009251 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -28,7 +28,7 @@ static int kvm_create_pit(KVMState *s)
#ifdef KVM_CAP_PIT
int r;
- if (kvm_pit_in_kernel()) {
+ if (kvm_pit) {
r = kvm_vm_ioctl(s, KVM_CREATE_PIT);
if (r < 0) {
fprintf(stderr, "Create kernel PIC irqchip failed\n");
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 5ba5b0a..c9ff5fe 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -120,82 +120,6 @@ static inline void clear_gsi(KVMState *s, unsigned int gsi)
}
}
-static int kvm_create_context(void);
-
-int kvm_init(void)
-{
- int fd;
- int r, i;
-
-
- fd = open("/dev/kvm", O_RDWR);
- if (fd == -1) {
- perror("open /dev/kvm");
- return -1;
- }
- r = ioctl(fd, KVM_GET_API_VERSION, 0);
- if (r == -1) {
- fprintf(stderr,
- "kvm kernel version too old: "
- "KVM_GET_API_VERSION ioctl not supported\n");
- goto out_close;
- }
- if (r < EXPECTED_KVM_API_VERSION) {
- fprintf(stderr, "kvm kernel version too old: "
- "We expect API version %d or newer, but got "
- "version %d\n", EXPECTED_KVM_API_VERSION, r);
- goto out_close;
- }
- if (r > EXPECTED_KVM_API_VERSION) {
- fprintf(stderr, "kvm userspace version too old\n");
- goto out_close;
- }
- kvm_state = qemu_mallocz(sizeof(*kvm_state));
-
- kvm_state->fd = fd;
- kvm_state->vmfd = -1;
-
-#ifdef KVM_CAP_SET_GUEST_DEBUG
- QTAILQ_INIT(&kvm_state->kvm_sw_breakpoints);
-#endif
-
- for (i = 0; i < ARRAY_SIZE(kvm_state->slots); i++) {
- kvm_state->slots[i].slot = i;
- }
-
-#ifdef KVM_CAP_USER_MEMORY
- r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_USER_MEMORY);
- if (r <= 0) {
- fprintf(stderr,
- "Hypervisor too old: KVM_CAP_USER_MEMORY extension not supported\n");
- goto out_close;
- }
-#else
-#error Hypervisor too old: KVM_CAP_USER_MEMORY extension not supported
-#endif
-
- cpu_register_phys_memory_client(&kvm_cpu_phys_memory_client);
-
- pthread_mutex_lock(&qemu_mutex);
- return kvm_create_context();
-
- out_close:
- close(fd);
- return -1;
-}
-
-static void kvm_finalize(KVMState *s)
-{
- /* FIXME
- if (kvm->vcpu_fd[0] != -1)
- close(kvm->vcpu_fd[0]);
- if (kvm->vm_fd != -1)
- close(kvm->vm_fd);
- */
- close(s->fd);
- free(s);
-}
-
static int kvm_init_irq_routing(KVMState *s)
{
#ifdef KVM_CAP_IRQ_ROUTING
@@ -1225,6 +1149,8 @@ int kvm_init_ap(void)
{
struct sigaction action;
+ pthread_mutex_lock(&qemu_mutex);
+
qemu_add_vm_change_state_handler(kvm_vm_state_change_handler, NULL);
signal(SIG_IPI, sig_ipi_handler);
@@ -1336,84 +1262,6 @@ int kvm_arch_init_irq_routing(void)
}
#endif
-static int kvm_create_context(void)
-{
- static const char upgrade_note[] =
- "Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
- "(see http://sourceforge.net/projects/kvm).\n";
-
- int r;
-
- kvm_state->pit_in_kernel = kvm_pit;
-
- kvm_state->vmfd = kvm_ioctl(kvm_state, KVM_CREATE_VM, 0);
- if (kvm_state->vmfd < 0) {
- fprintf(stderr, "kvm_create_vm: %m\n");
- kvm_finalize(kvm_state);
- return -1;
- }
-
- r = kvm_arch_init(kvm_state);
- if (r < 0) {
- kvm_finalize(kvm_state);
- return r;
- }
-
- /* There was a nasty bug in < kvm-80 that prevents memory slots from being
- * destroyed properly. Since we rely on this capability, refuse to work
- * with any kernel without this capability. */
- if (!kvm_check_extension(kvm_state, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) {
- fprintf(stderr,
- "KVM kernel module broken (DESTROY_MEMORY_REGION).\n%s",
- upgrade_note);
- return -EINVAL;
- }
-
- r = kvm_create_irqchip(kvm_state);
- if (r < 0) {
- return r;
- }
-
- kvm_state->coalesced_mmio = 0;
-#ifdef KVM_CAP_COALESCED_MMIO
- kvm_state->coalesced_mmio =
- kvm_check_extension(kvm_state, KVM_CAP_COALESCED_MMIO);
-#endif
-
- kvm_state->vcpu_events = 0;
-#ifdef KVM_CAP_VCPU_EVENTS
- kvm_state->vcpu_events = kvm_check_extension(kvm_state, KVM_CAP_VCPU_EVENTS);
-#endif
-
- kvm_state->debugregs = 0;
-#ifdef KVM_CAP_DEBUGREGS
- kvm_state->debugregs = kvm_check_extension(kvm_state, KVM_CAP_DEBUGREGS);
-#endif
-
- kvm_state->xsave = 0;
-#ifdef KVM_CAP_XSAVE
- kvm_state->xsave = kvm_check_extension(kvm_state, KVM_CAP_XSAVE);
-#endif
-
- kvm_state->xcrs = 0;
-#ifdef KVM_CAP_XCRS
- kvm_state->xcrs = kvm_check_extension(kvm_state, KVM_CAP_XCRS);
-#endif
-
- kvm_state->many_ioeventfds = kvm_check_many_ioeventfds();
-
- kvm_state->pit_state2 = 0;
-#ifdef KVM_CAP_PIT_STATE2
- kvm_state->pit_state2 = kvm_check_extension(kvm_state, KVM_CAP_PIT_STATE2);
-#endif
-
- kvm_init_ap();
-
- cpu_interrupt_handler = kvm_handle_interrupt;
-
- return 0;
-}
-
static void kvm_mutex_unlock(void)
{
assert(!cpu_single_env);
diff --git a/qemu-kvm.h b/qemu-kvm.h
index 7386b46..b552e1e 100644
--- a/qemu-kvm.h
+++ b/qemu-kvm.h
@@ -311,19 +311,6 @@ struct kvm_pit_state {
#endif /* !CONFIG_KVM */
-
-/*!
- * \brief Create new KVM context
- *
- * This creates a new kvm_context. A KVM context is a small area of data that
- * holds information about the KVM instance that gets created by this call.\n
- * This should always be your first call to KVM.
- *
- * \param opaque Not used
- * \return NULL on failure
- */
-int kvm_init(void);
-
int kvm_main_loop(void);
int kvm_init_ap(void);
void kvm_save_lapic(CPUState *env);
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 9b8c460..a4365bf 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -53,14 +53,12 @@
#define BUS_MCEERR_AO 5
#endif
-#ifdef OBSOLETE_KVM_IMPL
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
KVM_CAP_INFO(SET_TSS_ADDR),
KVM_CAP_INFO(EXT_CPUID),
KVM_CAP_INFO(MP_STATE),
KVM_CAP_LAST_INFO
};
-#endif
static bool has_msr_star;
static bool has_msr_hsave_pa;
--
1.7.1
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (15 preceding siblings ...)
2011-05-13 12:14 ` [PATCH 16/16] qemu-kvm: Use upstream kvm_init Jan Kiszka
@ 2011-05-16 10:37 ` Avi Kivity
2011-05-17 18:47 ` Marcelo Tosatti
17 siblings, 0 replies; 22+ messages in thread
From: Avi Kivity @ 2011-05-16 10:37 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm
On 05/13/2011 03:13 PM, Jan Kiszka wrote:
> The second round of merging qemu-kvm with upstream. This part stops
> after switching to upstreams kvm_init implementation.
>
> To achieve this, various small cleanups and refactorings are applied,
> the irq0 override management is simplified and the kvm_context fields
> are migrated into KVMState.
>
Looks good.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 22+ messages in thread* Re: [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II
2011-05-13 12:13 [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Jan Kiszka
` (16 preceding siblings ...)
2011-05-16 10:37 ` [PATCH 00/16] qemu-kvm: Cleanup and switch to upstream - Part II Avi Kivity
@ 2011-05-17 18:47 ` Marcelo Tosatti
17 siblings, 0 replies; 22+ messages in thread
From: Marcelo Tosatti @ 2011-05-17 18:47 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Avi Kivity, kvm
On Fri, May 13, 2011 at 02:13:54PM +0200, Jan Kiszka wrote:
> The second round of merging qemu-kvm with upstream. This part stops
> after switching to upstreams kvm_init implementation.
>
> To achieve this, various small cleanups and refactorings are applied,
> the irq0 override management is simplified and the kvm_context fields
> are migrated into KVMState.
>
> Please review/merge.
Applied, thanks.
^ permalink raw reply [flat|nested] 22+ messages in thread