aboutsummaryrefslogtreecommitdiff
path: root/target-s390x
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2015-02-24 14:15:24 +0100
committerChristian Borntraeger <borntraeger@de.ibm.com>2015-03-10 09:26:22 +0100
commit22740e3fc0856b2b6e66c91056a7026f87f51482 (patch)
treef7d7142494d527d204e7d0ca381a65385ea7cfe8 /target-s390x
parent6eb8f212d2686ed9b17077d554465df7ae06f805 (diff)
s390x/kvm: pass the SIGP instruction parameter to the SIGP handler
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 <thuth@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Message-Id: <1424783731-43426-4-git-send-email-jfrei@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'target-s390x')
-rw-r--r--target-s390x/kvm.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 8918986bc2..aaf703eecd 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -1113,6 +1113,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;
@@ -1174,10 +1175,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,
};
@@ -1218,6 +1220,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));
@@ -1225,6 +1228,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:
@@ -1235,7 +1239,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) {