From: David Hildenbrand <d...@linux.vnet.ibm.com> The parameter of the SIGP instruction will be neded in the future. Let's read it out and store it in the struct sigp_info, so it can be passed to the sigp handlers.
Reviewed-by: Thomas Huth <th...@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.h...@de.ibm.com> Signed-off-by: Jens Freimann <jf...@linux.vnet.ibm.com> Signed-off-by: David Hildenbrand <d...@linux.vnet.ibm.com> --- target-s390x/kvm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index ec17ac8..1f4a4b1 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -1100,6 +1100,7 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb) typedef struct SigpInfo { S390CPU *cpu; + uint64_t param; int cc; uint64_t *status_reg; } SigpInfo; @@ -1161,10 +1162,11 @@ static void sigp_cpu_reset(void *arg) } static int handle_sigp_single_dst(S390CPU *dst_cpu, uint8_t order, - uint64_t *status_reg) + uint64_t param, uint64_t *status_reg) { SigpInfo si = { .cpu = dst_cpu, + .param = param, .status_reg = status_reg, }; @@ -1205,6 +1207,7 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) int ret; uint8_t order; uint64_t *status_reg; + uint64_t param; S390CPU *dst_cpu = NULL; cpu_synchronize_state(CPU(cpu)); @@ -1212,6 +1215,7 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) /* get order code */ order = decode_basedisp_rs(env, run->s390_sieic.ipb) & SIGP_ORDER_MASK; status_reg = &env->regs[r1]; + param = (r1 % 2) ? env->regs[r1] : env->regs[r1 + 1]; switch (order) { case SIGP_SET_ARCH: @@ -1222,7 +1226,7 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) default: /* all other sigp orders target a single vcpu */ dst_cpu = s390_cpu_addr2state(env->regs[r3]); - ret = handle_sigp_single_dst(dst_cpu, order, status_reg); + ret = handle_sigp_single_dst(dst_cpu, order, param, status_reg); } if (ret >= 0) { -- 2.1.4