s390x/kvm: Fixed condition code for unknown SIGP orders
If SIGP is called with an unknown order code, it has to return CC1 instead of CC3 and set the "invalid order" bit in the return status. Signed-off-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: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
b8031adba7
commit
3796f0e1cd
@ -633,8 +633,9 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
|
||||
CPUS390XState *env = &cpu->env;
|
||||
uint8_t order_code;
|
||||
uint16_t cpu_addr;
|
||||
int r = -1;
|
||||
S390CPU *target_cpu;
|
||||
uint64_t *statusreg = &env->regs[ipa1 >> 4];
|
||||
int cc;
|
||||
|
||||
cpu_synchronize_state(CPU(cpu));
|
||||
|
||||
@ -644,29 +645,33 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
|
||||
cpu_addr = env->regs[ipa1 & 0x0f];
|
||||
target_cpu = s390_cpu_addr2state(cpu_addr);
|
||||
if (target_cpu == NULL) {
|
||||
cc = 3; /* not operational */
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (order_code) {
|
||||
case SIGP_START:
|
||||
r = kvm_s390_cpu_start(target_cpu);
|
||||
cc = kvm_s390_cpu_start(target_cpu);
|
||||
break;
|
||||
case SIGP_RESTART:
|
||||
r = kvm_s390_cpu_restart(target_cpu);
|
||||
cc = kvm_s390_cpu_restart(target_cpu);
|
||||
break;
|
||||
case SIGP_SET_ARCH:
|
||||
/* make the caller panic */
|
||||
return -1;
|
||||
case SIGP_INITIAL_CPU_RESET:
|
||||
r = s390_cpu_initial_reset(target_cpu);
|
||||
cc = s390_cpu_initial_reset(target_cpu);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "KVM: unknown SIGP: 0x%x\n", order_code);
|
||||
DPRINTF("KVM: unknown SIGP: 0x%x\n", order_code);
|
||||
*statusreg &= 0xffffffff00000000UL;
|
||||
*statusreg |= SIGP_STAT_INVALID_ORDER;
|
||||
cc = 1; /* status stored */
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
setcc(cpu, r ? 3 : 0);
|
||||
setcc(cpu, cc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user