Commit b697e435 authored by Jason J. Herne's avatar Jason J. Herne Committed by Christian Borntraeger

KVM: s390: Support Configuration z/Architecture Mode

kvm has always supported the concept of starting in z/Arch mode so let's
reflect the feature bit to the guest.

Also, we change sigp set architecture to reject any request to change
architecture modes.
Signed-off-by: default avatarJason J. Herne <jjherne@linux.vnet.ibm.com>
Reviewed-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent ccc59f47
...@@ -155,29 +155,26 @@ static int __sigp_stop_and_store_status(struct kvm_vcpu *vcpu, ...@@ -155,29 +155,26 @@ static int __sigp_stop_and_store_status(struct kvm_vcpu *vcpu,
return rc; return rc;
} }
static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter) static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter,
u64 *status_reg)
{ {
int rc;
unsigned int i; unsigned int i;
struct kvm_vcpu *v; struct kvm_vcpu *v;
bool all_stopped = true;
switch (parameter & 0xff) { kvm_for_each_vcpu(i, v, vcpu->kvm) {
case 0: if (v == vcpu)
rc = SIGP_CC_NOT_OPERATIONAL; continue;
break; if (!is_vcpu_stopped(v))
case 1: all_stopped = false;
case 2:
kvm_for_each_vcpu(i, v, vcpu->kvm) {
v->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
kvm_clear_async_pf_completion_queue(v);
}
rc = SIGP_CC_ORDER_CODE_ACCEPTED;
break;
default:
rc = -EOPNOTSUPP;
} }
return rc;
*status_reg &= 0xffffffff00000000UL;
/* Reject set arch order, with czam we're always in z/Arch mode. */
*status_reg |= (all_stopped ? SIGP_STATUS_INVALID_PARAMETER :
SIGP_STATUS_INCORRECT_STATE);
return SIGP_CC_STATUS_STORED;
} }
static int __sigp_set_prefix(struct kvm_vcpu *vcpu, struct kvm_vcpu *dst_vcpu, static int __sigp_set_prefix(struct kvm_vcpu *vcpu, struct kvm_vcpu *dst_vcpu,
...@@ -446,7 +443,8 @@ int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu) ...@@ -446,7 +443,8 @@ int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu)
switch (order_code) { switch (order_code) {
case SIGP_SET_ARCHITECTURE: case SIGP_SET_ARCHITECTURE:
vcpu->stat.instruction_sigp_arch++; vcpu->stat.instruction_sigp_arch++;
rc = __sigp_set_arch(vcpu, parameter); rc = __sigp_set_arch(vcpu, parameter,
&vcpu->run->s.regs.gprs[r1]);
break; break;
default: default:
rc = handle_sigp_dst(vcpu, order_code, cpu_addr, rc = handle_sigp_dst(vcpu, order_code, cpu_addr,
......
...@@ -80,6 +80,7 @@ static struct facility_def facility_defs[] = { ...@@ -80,6 +80,7 @@ static struct facility_def facility_defs[] = {
78, /* enhanced-DAT 2 */ 78, /* enhanced-DAT 2 */
130, /* instruction-execution-protection */ 130, /* instruction-execution-protection */
131, /* enhanced-SOP 2 and side-effect */ 131, /* enhanced-SOP 2 and side-effect */
138, /* configuration z/architecture mode (czam) */
146, /* msa extension 8 */ 146, /* msa extension 8 */
-1 /* END */ -1 /* END */
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment