Re: [PATCH RFC] Do not use cpu_index in interface between libkvm and qemu

2009-06-04 Thread Avi Kivity

Gleb Natapov wrote:

On vcpu creation cookie is returned which is used in future communication.

  


Applied, thanks.

--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH RFC] Do not use cpu_index in interface between libkvm and qemu

2009-06-02 Thread Gleb Natapov
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,