Do not use cpu_index in interface between libkvm and qemu
RFC PATCH 1/1 Do not use cpu_index in interface between libkvm and qemu
On vcpu creation cookie is returned which is used in future communication.
Signed-off-by Gleb Natapov <[email protected]>
cpu-defs.h +1 -0
@@ -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; };
hw/apic.c +2 -2
@@ -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
kvm-tpr-opt.c +8 -8
@@ -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, ®s); +kvm_get_regs (env->kvm_cpu_state.vcpu_ctx, ®s);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 &0xf0000000 ) +0xe0000 ; 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, ®s); +kvm_get_regs (env->kvm_cpu_state.vcpu_ctx, ®s); 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 =0xfffff000u ; addr >=0x80000000u ; addr -=4096 )if (map_addr (&sregs, addr,NULL ) ==0xfee00000u ) { real_tpr = addr +0x80 ;
libkvm-all.c +84 -71
337 lines not on this page · raw message
libkvm-all.h +39 -55
279 lines not on this page · raw message
libkvm-common.h +12 -6
@@ -44,8 +44,6 @@ struct kvm_context {/// Filedescriptor to /dev/kvm int fd;int vm_fd; -int vcpu_fd[MAX_VCPUS ]; -struct kvm_run *run[MAX_VCPUS ];/// Callbacks that KVM uses to emulate various unvirtualizable functionality struct kvm_callbacks *callbacks;void *opaque;
@@ -71,6 +69,14 @@ struct kvm_context {int max_gsi; }; +struct kvm_vcpu_context +{ +int fd; +struct kvm_run *run; +struct kvm_context *kvm; +uint32_t id; +}; +int kvm_alloc_kernel_memory (kvm_context_t kvm,unsigned long memory,void **vm_mem); int kvm_alloc_userspace_memory(kvm_context_t kvm, unsigned long memory,
@@ -78,17 +84,17 @@ int kvm_alloc_userspace_memory(kvm_context_t kvm, unsigned long memory,int kvm_arch_create (kvm_context_t kvm,unsigned long phys_mem_bytes,void **vm_mem); -int kvm_arch_run (struct kvm_run *run,kvm_context_t kvm,int vcpu); +int kvm_arch_run (kvm_vcpu_context_t vcpu); -void kvm_show_code (kvm_context_t kvm,int vcpu); +void kvm_show_code (kvm_vcpu_context_t vcpu); -int handle_halt (kvm_context_t kvm,int vcpu); +int handle_halt (kvm_vcpu_context_t vcpu);int handle_shutdown (kvm_context_t kvm,void *env);void post_kvm_run (kvm_context_t kvm,void *env);int pre_kvm_run (kvm_context_t kvm,void *env);int handle_io_window (kvm_context_t kvm); -int handle_debug (kvm_context_t kvm,int vcpu,void *env); +int handle_debug (kvm_vcpu_context_t vcpu,void *env);int try_push_interrupts (kvm_context_t kvm);#endif
qemu-kvm-ia64.c +4 -4
@@ -31,7 +31,7 @@ int kvm_arch_qemu_init_env(CPUState *cenv)return 0 ; } -int kvm_arch_halt (void *opaque,int vcpu) +int kvm_arch_halt (void *opaque,kvm_vcpu_context_t vcpu) {CPUState *env = cpu_single_env; env->hflags |=HF_HALTED_MASK ;
@@ -104,7 +104,7 @@ void kvm_save_mpstate(CPUState *env)int r;struct kvm_mp_state mp_state; - r =kvm_get_mpstate (kvm_context, env->cpu_index, &mp_state); + r =kvm_get_mpstate (env->kvm_cpu_state.vcpu_ctx, &mp_state);if (r <0 ) env->mp_state =-1 ;else
@@ -122,7 +122,7 @@ void kvm_load_mpstate(CPUState *env)* so don't touch it. */ if (env->mp_state !=-1 ) -kvm_set_mpstate (kvm_context, env->cpu_index, &mp_state); +kvm_set_mpstate (env->kvm_cpu_state.vcpu_ctx, &mp_state);#endif }
@@ -130,7 +130,7 @@ void kvm_arch_cpu_reset(CPUState *env) {if (kvm_irqchip_in_kernel (kvm_context)) {#ifdef KVM_CAP_MP_STATE -kvm_reset_mpstate (kvm_context, env->cpu_index); +kvm_reset_mpstate (env->kvm_cpu_state.vcpu_ctx);#endif }else { env->interrupt_request &= ~CPU_INTERRUPT_HARD ;
qemu-kvm-x86.c +22 -24
167 lines not on this page · raw message
qemu-kvm.c +6 -6
@@ -204,7 +204,7 @@ int kvm_cpu_exec(CPUState *env) {int r; - r =kvm_run (kvm_context, env->cpu_index, env); + r =kvm_run (env->kvm_cpu_state.vcpu_ctx, env);if (r <0 ) {printf ("kvm_run returned %d\n" , r);exit (1 );
@@ -366,7 +366,7 @@ static void setup_kernel_sigmask(CPUState *env)sigprocmask (SIG_BLOCK ,NULL , &set);sigdelset (&set,SIG_IPI ); -kvm_set_signal_mask (kvm_context, env->cpu_index, &set); +kvm_set_signal_mask (env->kvm_cpu_state.vcpu_ctx, &set); }static void qemu_kvm_system_reset (void )
@@ -432,7 +432,7 @@ static void *ap_main_loop(void *_env) env->thread_id =kvm_get_thread_id ();sigfillset (&signals);sigprocmask (SIG_BLOCK , &signals,NULL ); -kvm_create_vcpu (kvm_context, env->cpu_index); + env->kvm_cpu_state.vcpu_ctx =kvm_create_vcpu (kvm_context, env->cpu_index);#ifdef USE_KVM_DEVICE_ASSIGNMENT /* do ioperm for io ports of assigned devices */
@@ -723,7 +723,7 @@ static int kvm_io_window(void *opaque) } -static int kvm_halt (void *opaque,int vcpu) +static int kvm_halt (void *opaque,kvm_vcpu_context_t vcpu) {return kvm_arch_halt (opaque, vcpu); }
@@ -1027,8 +1027,8 @@ static void kvm_invoke_set_guest_debug(void *data) {struct kvm_set_guest_debug_data *dbg_data = data; - dbg_data->err =kvm_set_guest_debug (kvm_context, cpu_single_env->cpu_index, - &dbg_data->dbg); + dbg_data->err =kvm_set_guest_debug (cpu_single_env->kvm_cpu_state.vcpu_ctx, + &dbg_data->dbg); }int kvm_update_guest_debug (CPUState *env,unsigned long reinject_trap)
qemu-kvm.h +5 -5
@@ -70,7 +70,6 @@ int kvm_arch_qemu_create_context(void);void kvm_arch_save_regs (CPUState *env);void kvm_arch_load_regs (CPUState *env);int kvm_arch_qemu_init_env (CPUState *cenv); -int kvm_arch_halt (void *opaque,int vcpu);void kvm_arch_pre_kvm_run (void *opaque,CPUState *env);void kvm_arch_post_kvm_run (void *opaque,CPUState *env);int kvm_arch_has_work (CPUState *env);
@@ -113,8 +112,6 @@ void qemu_kvm_notify_work(void);void kvm_tpr_opt_setup (void );void kvm_tpr_access_report (CPUState *env,uint64_t rip,int is_write); -int handle_tpr_access (void *opaque,int vcpu, -uint64_t rip,int is_write);void kvm_tpr_vcpu_start (CPUState *env);int qemu_kvm_get_dirty_pages (unsigned long phys_addr,void *buf);
@@ -138,8 +135,8 @@ void kvm_arch_do_ioperm(void *_data);#endif #ifdef TARGET_PPC -int handle_powerpc_dcr_read (int vcpu,uint32_t dcrn,uint32_t *data); -int handle_powerpc_dcr_write (int vcpu,uint32_t dcrn,uint32_t data); +int handle_powerpc_dcr_read (kvm_vcpu_context_t vcpu,uint32_t dcrn,uint32_t *data); +int handle_powerpc_dcr_write (kvm_vcpu_context_t vcpu,uint32_t dcrn,uint32_t data);#endif #define ALIGN (x, y) (((x)+(y)-1) & ~((y)-1))
@@ -165,6 +162,9 @@ struct ioperm_data {int qemu_kvm_has_sync_mmu (void );void qemu_kvm_cpu_stop (CPUState *env); +int kvm_arch_halt (void *opaque,kvm_vcpu_context_t vcpu); +int handle_tpr_access (void *opaque,kvm_vcpu_context_t vcpu, +uint64_t rip,int is_write);#define kvm_enabled () (kvm_allowed)#define qemu_kvm_irqchip_in_kernel () kvm_irqchip_in_kernel(kvm_context)
target-i386/libkvm.c +41 -43
235 lines not on this page · raw message
target-ia64/libkvm.c +4 -4
@@ -45,11 +45,11 @@ int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,return 0 ; } -int kvm_arch_run (struct kvm_run *run,kvm_context_t kvm,int vcpu) +int kvm_arch_run (kvm_vcpu_context_t vcpu) {int r =0 ; -switch (run->exit_reason) { +switch (vcp->run->exit_reason) {default : r =1 ;break ;
@@ -58,12 +58,12 @@ int kvm_arch_run(struct kvm_run *run,kvm_context_t kvm, int vcpu)return r; } -void kvm_show_code (kvm_context_t kvm,int vcpu) +void kvm_show_code (kvm_vcpu_context_t vcpu) {fprintf (stderr,"kvm_show_code not supported yet!\n" ); } -void kvm_show_regs (kvm_context_t kvm,int vcpu) +void kvm_show_regs (kvm_vcpu_context_t vcpu) {fprintf (stderr,"kvm_show_regs not supportted today!\n" ); }
target-ppc/libkvm.c +9 -7
@@ -23,9 +23,11 @@#include <stdio.h> #include <inttypes.h> -int handle_dcr (struct kvm_run *run,kvm_context_t kvm,int vcpu) +int handle_dcr (kvm_vcpu_context_t vcpu) {int ret =0 ; +struct kvm_run *run = vcpu->run; +kvm_context_t kvm = vcpu->kvm;if (run->dcr.is_write) ret = kvm->callbacks->powerpc_dcr_write(vcpu,
@@ -39,17 +41,17 @@ int handle_dcr(struct kvm_run *run, kvm_context_t kvm, int vcpu)return ret; } -void kvm_show_code (kvm_context_t kvm,int vcpu) +void kvm_show_code (kvm_vcpu_context_t vcpu) {fprintf (stderr,"%s: Operation not supported\n" , __FUNCTION__); } -void kvm_show_regs (kvm_context_t kvm,int vcpu) +void kvm_show_regs (kvm_vcpu_context_t vcpu) {struct kvm_regs regs;int i; -if (kvm_get_regs (kvm, vcpu, ®s)) +if (kvm_get_regs (vcpu, ®s))return ;fprintf (stderr,"guest vcpu #%d\n" , vcpu);
@@ -84,13 +86,13 @@ int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes,return 0 ; } -int kvm_arch_run (struct kvm_run *run,kvm_context_t kvm,int vcpu) +int kvm_arch_run (kvm_vcpu_context_t vcpu) {int ret =0 ; -switch (run->exit_reason){ +switch (vcpu->run->exit_reason){case KVM_EXIT_DCR : - ret =handle_dcr (run, kvm, vcpu); + ret =handle_dcr (vcpu);break ;default : ret =1 ;
--
Gleb.
Avi Kivity
AppliedQuoted 3 lines · Gleb Natapov
On vcpu creation cookie is returned which is used in future communication.
Applied, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function