On vcpu creation cookie is returned which is used in future communication.
Signed-off-by: Gleb Natapov g...@redhat.com
diff --git a/cpu-defs.h b/cpu-defs.h
index 1e071e7..5f541e0 100644
--- a/cpu-defs.h
+++ b/cpu-defs.h
@@ -147,6 +147,7 @@ struct KVMCPUState {
int stop;
int stopped;
int created;
+void *vcpu_ctx;
struct qemu_work_item *queued_work_first, *queued_work_last;
};
diff --git a/hw/apic.c b/hw/apic.c
index 86aa6b6..c5d97b2 100644
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -833,7 +833,7 @@ static void kvm_kernel_lapic_save_to_user(APICState *s)
struct kvm_lapic_state *kapic = apic;
int i, v;
-kvm_get_lapic(kvm_context, s-cpu_env-cpu_index, kapic);
+kvm_get_lapic(s-cpu_env-kvm_cpu_state.vcpu_ctx, kapic);
s-id = kapic_reg(kapic, 0x2) 24;
s-tpr = kapic_reg(kapic, 0x8);
@@ -886,7 +886,7 @@ static void kvm_kernel_lapic_load_from_user(APICState *s)
kapic_set_reg(klapic, 0x38, s-initial_count);
kapic_set_reg(klapic, 0x3e, s-divide_conf);
-kvm_set_lapic(kvm_context, s-cpu_env-cpu_index, klapic);
+kvm_set_lapic(s-cpu_env-kvm_cpu_state.vcpu_ctx, klapic);
}
#endif
diff --git a/kvm-tpr-opt.c b/kvm-tpr-opt.c
index bdbc742..3f388ef 100644
--- a/kvm-tpr-opt.c
+++ b/kvm-tpr-opt.c
@@ -70,7 +70,7 @@ static uint8_t read_byte_virt(CPUState *env, target_ulong
virt)
{
struct kvm_sregs sregs;
-kvm_get_sregs(kvm_context, env-cpu_index, sregs);
+kvm_get_sregs(env-kvm_cpu_state.vcpu_ctx, sregs);
return ldub_phys(map_addr(sregs, virt, NULL));
}
@@ -78,7 +78,7 @@ static void write_byte_virt(CPUState *env, target_ulong virt,
uint8_t b)
{
struct kvm_sregs sregs;
-kvm_get_sregs(kvm_context, env-cpu_index, sregs);
+kvm_get_sregs(env-kvm_cpu_state.vcpu_ctx, sregs);
stb_phys(map_addr(sregs, virt, NULL), b);
}
@@ -86,7 +86,7 @@ static __u64 kvm_rsp_read(CPUState *env)
{
struct kvm_regs regs;
-kvm_get_regs(kvm_context, env-cpu_index, regs);
+kvm_get_regs(env-kvm_cpu_state.vcpu_ctx, regs);
return regs.rsp;
}
@@ -192,7 +192,7 @@ static int bios_is_mapped(CPUState *env, uint64_t rip)
if (bios_enabled)
return 1;
-kvm_get_sregs(kvm_context, env-cpu_index, sregs);
+kvm_get_sregs(env-kvm_cpu_state.vcpu_ctx, sregs);
probe = (rip 0xf000) + 0xe;
phys = map_addr(sregs, probe, perms);
@@ -241,7 +241,7 @@ static int enable_vapic(CPUState *env)
if (pcr_cpu 0)
return 0;
-kvm_enable_vapic(kvm_context, env-cpu_index, vapic_phys + (pcr_cpu 7));
+kvm_enable_vapic(env-kvm_cpu_state.vcpu_ctx, vapic_phys + (pcr_cpu 7));
cpu_physical_memory_rw(vapic_phys + (pcr_cpu 7) + 4, one, 1, 1);
bios_enabled = 1;
@@ -314,7 +314,7 @@ void kvm_tpr_access_report(CPUState *env, uint64_t rip, int
is_write)
void kvm_tpr_vcpu_start(CPUState *env)
{
-kvm_enable_tpr_access_reporting(kvm_context, env-cpu_index);
+kvm_enable_tpr_access_reporting(env-kvm_cpu_state.vcpu_ctx);
if (bios_enabled)
enable_vapic(env);
}
@@ -364,7 +364,7 @@ static void vtpr_ioport_write(void *opaque, uint32_t addr,
uint32_t val)
struct kvm_sregs sregs;
uint32_t rip;
-kvm_get_regs(kvm_context, env-cpu_index, regs);
+kvm_get_regs(env-kvm_cpu_state.vcpu_ctx, regs);
rip = regs.rip - 2;
write_byte_virt(env, rip, 0x66);
write_byte_virt(env, rip + 1, 0x90);
@@ -372,7 +372,7 @@ static void vtpr_ioport_write(void *opaque, uint32_t addr,
uint32_t val)
return;
if (!bios_is_mapped(env, rip))
printf(bios not mapped?\n);
-kvm_get_sregs(kvm_context, env-cpu_index, sregs);
+kvm_get_sregs(env-kvm_cpu_state.vcpu_ctx, sregs);
for (addr = 0xf000u; addr = 0x8000u; addr -= 4096)
if (map_addr(sregs, addr, NULL) == 0xfee0u) {
real_tpr = addr + 0x80;
diff --git a/libkvm-all.c b/libkvm-all.c
index 1668e32..a826341 100644
--- a/libkvm-all.c
+++ b/libkvm-all.c
@@ -356,10 +356,12 @@ kvm_context_t kvm_init(struct kvm_callbacks *callbacks,
void kvm_finalize(kvm_context_t kvm)
{
+ /* FIXME
if (kvm-vcpu_fd[0] != -1)
close(kvm-vcpu_fd[0]);
if (kvm-vm_fd != -1)
close(kvm-vm_fd);
+ */
close(kvm-fd);
free(kvm);
}
@@ -374,32 +376,43 @@ void kvm_disable_pit_creation(kvm_context_t kvm)
kvm-no_pit_creation = 1;
}
-int kvm_create_vcpu(kvm_context_t kvm, int slot)
+kvm_vcpu_context_t kvm_create_vcpu(kvm_context_t kvm, int id)
{
long mmap_size;
int r;
+ kvm_vcpu_context_t vcpu_ctx = malloc(sizeof(struct kvm_vcpu_context));
- r = ioctl(kvm-vm_fd, KVM_CREATE_VCPU, slot);
+ if (!vcpu_ctx) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ vcpu_ctx-kvm = kvm;
+ vcpu_ctx-id = id;
+
+ r = ioctl(kvm-vm_fd, KVM_CREATE_VCPU, id);
if (r == -1) {
- r = -errno;
fprintf(stderr,