On 01/05/2012 03:06 AM, Liu Yu wrote: > diff --git a/arch/powerpc/kernel/idle_e500.S b/arch/powerpc/kernel/idle_e500.S > index 3e2b95c..6ea95f0 100644 > --- a/arch/powerpc/kernel/idle_e500.S > +++ b/arch/powerpc/kernel/idle_e500.S > @@ -85,6 +85,23 @@ END_FTR_SECTION_IFSET(CPU_FTR_L2CSR|CPU_FTR_CAN_NAP) > 2: b 2b > #endif /* !E500MC */ > > +#ifdef CONFIG_KVM_GUEST > +/* > + * r3 contains the pointer to in[8] > + * r4 contains the pointer to out[8] > + * r5 contains the hcall vendor and nr > + * r6 contains the handler which send hcall > + */ > +_GLOBAL(e500_ev_idle) > + rlwinm r7,r1,0,0,31-THREAD_SHIFT /* current thread_info */ > + lwz r8,TI_LOCAL_FLAGS(r7) /* set napping bit */ > + ori r8,r8,_TLF_NAPPING /* so when we take an exception */ > + stw r8,TI_LOCAL_FLAGS(r7) /* it will return to our caller */ > + wrteei 1 > + mtctr r6 > + bctr > +#endif /* KVM_GUEST */ You'll need to branch back to the hcall invocation in an infinite loop -- the only way we should leave is via an interrupt. > +static void kvm_hcall_idle(void) > +{ > +#ifdef CONFIG_KVM_E500 > + ulong in[8]; > + ulong out[8]; > + > + e500_ev_idle(in, out, HC_VENDOR_EPAPR | HC_EV_IDLE, kvm_hypercall); > +#endif > +} kvm_hypercall is C code. As stated before, you cannot use C code while _TLF_NAPPING is set. > +static bool kvm_para_has_idle(void) > +{ > +#ifdef CONFIG_BOOKE > + return epapr_hcall_has_idle; > +#else > + return false; > +#endif > +} > + > static int __init kvm_guest_init(void) > { > if (!kvm_para_available()) > @@ -594,6 +614,10 @@ static int __init kvm_guest_init(void) > powersave_nap = 1; > #endif > > + /* Install hcall based power_save for guest kernel */ > + if (kvm_para_has_idle()) > + ppc_md.power_save = kvm_hcall_idle; Why did you only move it halfway out of KVM code? ePAPR features such as idle hcall should work on any ePAPR hypervisor, even with all KVM code disabled. Plus everything Alex said. :-) -Scott -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html