Patchwork [S390,KVM] Enable SIGP Initial Reset

login
register
mail settings
Submitter Alexander Graf
Date May 14, 2010, 2:14 p.m.
Message ID <1273846471-11152-1-git-send-email-agraf@suse.de>
Download mbox | patch
Permalink /patch/52621/
State New
Headers show

Comments

Alexander Graf - May 14, 2010, 2:14 p.m.
For SMP to work with KVM, we need to properly emulate the SIGP Initial Reset
Command. Recent (2.6.32) kernels issue that before the SIGP Reset command that
actually wakes up the vcpu.

This patch makes -smp work on S390x.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 target-s390x/kvm.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)
Aurelien Jarno - May 18, 2010, 7:24 p.m.
On Fri, May 14, 2010 at 04:14:31PM +0200, Alexander Graf wrote:
> For SMP to work with KVM, we need to properly emulate the SIGP Initial Reset
> Command. Recent (2.6.32) kernels issue that before the SIGP Reset command that
> actually wakes up the vcpu.
> 
> This patch makes -smp work on S390x.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>

Thanks, applied.

> ---
>  target-s390x/kvm.c |   17 ++++++++++++++---
>  1 files changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
> index a2d7741..9bf6abb 100644
> --- a/target-s390x/kvm.c
> +++ b/target-s390x/kvm.c
> @@ -344,9 +344,20 @@ static int s390_store_status(CPUState *env, uint32_t parameter)
>  
>  static int s390_cpu_initial_reset(CPUState *env)
>  {
> -    /* XXX */
> -    fprintf(stderr, "XXX SIGP init\n");
> -    return -1;
> +    int i;
> +
> +    if (kvm_vcpu_ioctl(env, KVM_S390_INITIAL_RESET, NULL) < 0) {
> +        perror("cannot init reset vcpu");
> +    }
> +
> +    /* Manually zero out all registers */
> +    cpu_synchronize_state(env);
> +    for (i = 0; i < 16; i++) {
> +        env->regs[i] = 0;
> +    }
> +
> +    dprintf("DONE: SIGP initial reset: %p\n", env);
> +    return 0;
>  }
>  
>  static int handle_sigp(CPUState *env, struct kvm_run *run, uint8_t ipa1)
> -- 
> 1.6.0.2
> 
> 
>

Patch

diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index a2d7741..9bf6abb 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -344,9 +344,20 @@  static int s390_store_status(CPUState *env, uint32_t parameter)
 
 static int s390_cpu_initial_reset(CPUState *env)
 {
-    /* XXX */
-    fprintf(stderr, "XXX SIGP init\n");
-    return -1;
+    int i;
+
+    if (kvm_vcpu_ioctl(env, KVM_S390_INITIAL_RESET, NULL) < 0) {
+        perror("cannot init reset vcpu");
+    }
+
+    /* Manually zero out all registers */
+    cpu_synchronize_state(env);
+    for (i = 0; i < 16; i++) {
+        env->regs[i] = 0;
+    }
+
+    dprintf("DONE: SIGP initial reset: %p\n", env);
+    return 0;
 }
 
 static int handle_sigp(CPUState *env, struct kvm_run *run, uint8_t ipa1)