KVM: PPC: Add support for ePAPR idle hcall in host kernel
authorLiu Yu-B13201 <Yu.Liu@freescale.com>
Tue, 3 Jul 2012 05:48:52 +0000 (05:48 +0000)
committerAlexander Graf <agraf@suse.de>
Fri, 5 Oct 2012 21:38:37 +0000 (23:38 +0200)
And add a new flag definition in kvm_ppc_pvinfo to indicate
whether the host supports the EV_IDLE hcall.

Signed-off-by: Liu Yu <yu.liu@freescale.com>
[stuart.yoder@freescale.com: cleanup,fixes for conditions allowing idle]
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
[agraf: fix typo]
Signed-off-by: Alexander Graf <agraf@suse.de>
Documentation/virtual/kvm/api.txt
arch/powerpc/include/asm/Kbuild
arch/powerpc/kvm/powerpc.c
include/linux/kvm.h

index f6ec3a92e62148087b8ac0764e8f916e175d8eb8..170afb1fbc2e1aa5b5e35858f0d7f7e2f6a653bc 100644 (file)
@@ -1194,12 +1194,15 @@ struct kvm_ppc_pvinfo {
 This ioctl fetches PV specific information that need to be passed to the guest
 using the device tree or other means from vm context.
 
-For now the only implemented piece of information distributed here is an array
-of 4 instructions that make up a hypercall.
+The hcall array defines 4 instructions that make up a hypercall.
 
 If any additional field gets added to this structure later on, a bit for that
 additional piece of information will be set in the flags bitmap.
 
+The flags bitmap is defined as:
+
+   /* the host supports the ePAPR idle hcall
+   #define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
 
 4.48 KVM_ASSIGN_PCI_DEVICE
 
index 7e313f1ed1832a5048770ed7ac72a169ae603541..13d6b7bf3b69818641705770fed052999389afd5 100644 (file)
@@ -34,5 +34,6 @@ header-y += termios.h
 header-y += types.h
 header-y += ucontext.h
 header-y += unistd.h
+header-y += epapr_hcalls.h
 
 generic-y += rwsem.h
index a478e662b2bce68d9ac3dc737aa4571d9c245d1c..dbf56e173c25b138af016e865f4c99b369abba24 100644 (file)
@@ -38,8 +38,7 @@
 
 int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
 {
-       return !(v->arch.shared->msr & MSR_WE) ||
-              !!(v->arch.pending_exceptions) ||
+       return !!(v->arch.pending_exceptions) ||
               v->requests;
 }
 
@@ -86,6 +85,11 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
 
                /* Second return value is in r4 */
                break;
+       case EV_HCALL_TOKEN(EV_IDLE):
+               r = EV_SUCCESS;
+               kvm_vcpu_block(vcpu);
+               clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+               break;
        default:
                r = EV_UNIMPLEMENTED;
                break;
@@ -779,6 +783,8 @@ static int kvm_vm_ioctl_get_pvinfo(struct kvm_ppc_pvinfo *pvinfo)
        pvinfo->hcall[3] = inst_nop;
 #endif
 
+       pvinfo->flags = KVM_PPC_PVINFO_FLAGS_EV_IDLE;
+
        return 0;
 }
 
index 0a6d6ba44c858959cd2ed6b912751c5f36810989..4cb3761bebae9d4ecd7f2881aa47eb55e4fb267b 100644 (file)
@@ -477,6 +477,8 @@ struct kvm_ppc_smmu_info {
        struct kvm_ppc_one_seg_page_size sps[KVM_PPC_PAGE_SIZES_MAX_SZ];
 };
 
+#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
+
 #define KVMIO 0xAE
 
 /* machine type bits, to be used as argument to KVM_CREATE_VM */