qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH 3/3 v3] Enable kvm emulated watchdog


From: Scott Wood
Subject: Re: [Qemu-ppc] [PATCH 3/3 v3] Enable kvm emulated watchdog
Date: Wed, 18 Jul 2012 21:33:40 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120714 Thunderbird/14.0

On 07/18/2012 06:34 AM, Bharat Bhushan wrote:
> diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
> index 4b9e575..64d94da 100644
> --- a/linux-headers/linux/kvm.h
> +++ b/linux-headers/linux/kvm.h
> @@ -163,6 +163,7 @@ struct kvm_pit_config {
>  #define KVM_EXIT_OSI              18
>  #define KVM_EXIT_PAPR_HCALL    19
>  #define KVM_EXIT_S390_UCONTROL         20
> +#define KVM_EXIT_WATCHDOG         21
>  
>  /* For KVM_EXIT_INTERNAL_ERROR */
>  #define KVM_INTERNAL_ERROR_EMULATION 1
> @@ -618,6 +619,7 @@ struct kvm_ppc_smmu_info {
>  #define KVM_CAP_PPC_GET_SMMU_INFO 78
>  #define KVM_CAP_S390_COW 79
>  #define KVM_CAP_PPC_ALLOC_HTAB 80
> +#define KVM_CAP_PPC_WDT      81
>  
>  #ifdef KVM_CAP_IRQ_ROUTING
>  

linux headers update should be a separate patch.

> @@ -371,6 +393,33 @@ static inline void kvm_fixup_page_sizes(CPUPPCState *env)
>  
>  #endif /* !defined (TARGET_PPC64) */
>  
> +static void cpu_state_change_handler(void *opaque, int running, RunState 
> state)
> +{
> +    CPUPPCState *env = opaque;
> +
> +    struct kvm_sregs sregs;
> +
> +    printf("running = %d, state = %d \n", running, state);

Remove this printf.

> +    if (!running)
> +        return;
> +
> +    /*
> +     * Clear watchdog interrupt condition by clearing TSR.
> +     * Similar logic needed to be implemented for watchdog
> +     * emulation in qemu.
> +     */
> +    if (cap_booke_sregs && cap_ppc_wdt) {
> +        kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
> +
> +        /* Clear TSR.ENW, TSR.WIS and TSR.WRS */
> +        ppc_booke_wdt_clear_tsr(env, sregs.u.e.tsr);
> +        sregs.u.e.tsr = env->spr[SPR_BOOKE_TSR];
> +        sregs.u.e.update_special = KVM_SREGS_E_BASE | KVM_SREGS_E_UPDATE_TSR;

KVM_SREGS_E_BASE is for "features", not "update_special".  Used here
it'll translate to KVM_SREGS_E_UPDATE_MCSR.

> +        kvm_vcpu_ioctl(env, KVM_SET_SREGS, &sregs);
> +    }
> +}
> +
>  int kvm_arch_init_vcpu(CPUPPCState *cenv)
>  {
>      int ret;
> @@ -384,6 +433,13 @@ int kvm_arch_init_vcpu(CPUPPCState *cenv)
>          return ret;
>      }
>  
> +    ret = kvm_wdt_enable(cenv);
> +    if (ret) {
> +        return ret;
> +    }

s/wdt/watchdog/g

Only do this if the user asks for a watchdog enforcement action -- and
if they do, make sure to at least warn if KVM doesn't support it.

> +    qemu_add_vm_change_state_handler(cpu_state_change_handler, cenv);
> +
>      idle_timer = qemu_new_timer_ns(vm_clock, kvm_kick_env, cenv);
>  
>      /* Some targets support access to KVM's guest TLB. */
> @@ -769,6 +825,13 @@ int kvm_arch_handle_exit(CPUPPCState *env, struct 
> kvm_run *run)
>          ret = 1;
>          break;
>  #endif
> +#ifdef KVM_EXIT_WATCHDOG
> +    case KVM_EXIT_WATCHDOG:
> +        dprintf("booke watchdog action\n");
> +     watchdog_perform_action();
> +        ret = 0;
> +        break;

Indentation.  Is this part really booke-specific?

-Scott





reply via email to

[Prev in Thread] Current Thread [Next in Thread]