[Top][All Lists]
[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