Handle INIT before SIPI.
Handle INIT before SIPI.
If SIPI was issued before CPU handled INIT signal the CPU is not reseted.
qemu/qemu-kvm.c +14 -5
@@ -349,13 +349,20 @@ static void update_regs_for_sipi(CPUState *env) {kvm_arch_update_regs_for_sipi (env); vcpu_info[env->cpu_index].sipi_needed =0 ; - vcpu_info[env->cpu_index].init =0 ; }static void update_regs_for_init (CPUState *env) { +SegmentCache cs = env->segs[R_CS ]; +cpu_reset (env); + +/* restore SIPI vector */ +if (vcpu_info[env->cpu_index].sipi_needed) + env->segs[R_CS ] = cs; +kvm_arch_load_regs (env); + vcpu_info[env->cpu_index].init =0 ; }static void setup_kernel_sigmask (CPUState *env)
@@ -411,10 +418,12 @@ static int kvm_main_loop_cpu(CPUState *env)kvm_main_loop_wait (env,1000 );if (env->interrupt_request & (CPU_INTERRUPT_HARD |CPU_INTERRUPT_NMI )) env->halted =0 ; -if (!kvm_irqchip_in_kernel (kvm_context) && info->sipi_needed) -update_regs_for_sipi (env); -if (!kvm_irqchip_in_kernel (kvm_context) && info->init) -update_regs_for_init (env); +if (!kvm_irqchip_in_kernel (kvm_context)) { +if (info->init) +update_regs_for_init (env); +if (info->sipi_needed) +update_regs_for_sipi (env); + }if (!env->halted && !info->init)kvm_cpu_exec (env); env->interrupt_request &= ~CPU_INTERRUPT_EXIT ;
--
Gleb.
Avi Kivity
AppliedQuoted 5 lines · Gleb Natapov
Handle INIT before SIPI.
If SIPI was issued before CPU handled INIT signal the CPU is not reseted.
Applied, thanks.
Signature · 1 line
error compiling committee.c: too many arguments to function
Hi, Gleb,
It seems that this patch is x86 specific, and it breaks the IA-64 compilation. Do you have any good idea to solve this? Thanks!
Best Regards,
-- Dongxiao
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Gleb Natapov
Sent: 2008年10月16日 23:21
To: [email protected]
Cc: [email protected]
Subject: Handle INIT before SIPI.
Handle INIT before SIPI.
If SIPI was issued before CPU handled INIT signal the CPU is not reseted.
qemu/qemu-kvm.c +14 -5
@@ -349,13 +349,20 @@ static void update_regs_for_sipi(CPUState *env) {kvm_arch_update_regs_for_sipi (env); vcpu_info[env->cpu_index].sipi_needed =0 ; - vcpu_info[env->cpu_index].init =0 ; }static void update_regs_for_init (CPUState *env) { +SegmentCache cs = env->segs[R_CS ]; +cpu_reset (env); + +/* restore SIPI vector */ +if (vcpu_info[env->cpu_index].sipi_needed) + env->segs[R_CS ] = cs; +kvm_arch_load_regs (env); + vcpu_info[env->cpu_index].init =0 ; }static void setup_kernel_sigmask (CPUState *env)
@@ -411,10 +418,12 @@ static int kvm_main_loop_cpu(CPUState *env)kvm_main_loop_wait (env,1000 );if (env->interrupt_request & (CPU_INTERRUPT_HARD |CPU_INTERRUPT_NMI )) env->halted =0 ; -if (!kvm_irqchip_in_kernel (kvm_context) && info->sipi_needed) -update_regs_for_sipi (env); -if (!kvm_irqchip_in_kernel (kvm_context) && info->init) -update_regs_for_init (env); +if (!kvm_irqchip_in_kernel (kvm_context)) { +if (info->init) +update_regs_for_init (env); +if (info->sipi_needed) +update_regs_for_sipi (env); + }if (!env->halted && !info->init)kvm_cpu_exec (env); env->interrupt_request &= ~CPU_INTERRUPT_EXIT ;
--
Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 3 lines · Dongxiao
Hi, Gleb,
It seems that this patch is x86 specific, and it breaks the IA-64 compilation. Do you have any good idea to solve this? Thanks!
Solve this by ifdefs for now. For better solution cleanup of SMP handling is needed.
qemu/qemu-kvm.c +5 -1
@@ -353,16 +353,20 @@ static void update_regs_for_sipi(CPUState *env)static void update_regs_for_init (CPUState *env) { +#ifdef TARGET_I386 SegmentCache cs = env->segs[R_CS ]; +#endif cpu_reset (env); +#ifdef TARGET_I386 /* restore SIPI vector */ if (vcpu_info[env->cpu_index].sipi_needed) env->segs[R_CS ] = cs; -kvm_arch_load_regs (env); vcpu_info[env->cpu_index].init =0 ; +#endif +kvm_arch_load_regs (env); }static void setup_kernel_sigmask (CPUState *env)
--
Gleb.