type can be one of the following:
 
-KVM_S390_SIGP_STOP (vcpu) - sigp restart
+KVM_S390_SIGP_STOP (vcpu) - sigp stop; optional flags in parm
 KVM_S390_PROGRAM_INT (vcpu) - program check; code in parm
 KVM_S390_SIGP_SET_PREFIX (vcpu) - sigp set prefix; prefix address in parm
 KVM_S390_RESTART (vcpu) - restart
 
                struct kvm_s390_emerg_info emerg;
                struct kvm_s390_extcall_info extcall;
                struct kvm_s390_prefix_info prefix;
+               struct kvm_s390_stop_info stop;
                struct kvm_s390_mchk_info mchk;
        };
 };
        struct kvm_s390_emerg_info emerg;
        struct kvm_s390_extcall_info extcall;
        struct kvm_s390_prefix_info prefix;
+       struct kvm_s390_stop_info stop;
        struct kvm_s390_mchk_info mchk;
 };
 
 
 
 static int __must_check __deliver_stop(struct kvm_vcpu *vcpu)
 {
+       struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
+       struct kvm_s390_stop_info *stop = &li->irq.stop;
+
+       spin_lock(&li->lock);
+       stop->flags = 0;
+       clear_bit(IRQ_PEND_SIGP_STOP, &li->pending_irqs);
+       spin_unlock(&li->lock);
+
        VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu stop");
        vcpu->stat.deliver_stop_signal++;
        trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_SIGP_STOP,
                                         0, 0);
 
        __set_cpuflag(vcpu, CPUSTAT_STOP_INT);
-       clear_bit(IRQ_PEND_SIGP_STOP, &vcpu->arch.local_int.pending_irqs);
        return 0;
 }
 
        return 0;
 }
 
+#define KVM_S390_STOP_SUPP_FLAGS 0
 static int __inject_sigp_stop(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
 {
        struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
+       struct kvm_s390_stop_info *stop = &li->irq.stop;
 
        trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_SIGP_STOP, 0, 0, 2);
 
+       if (irq->u.stop.flags & ~KVM_S390_STOP_SUPP_FLAGS)
+               return -EINVAL;
+
        li->action_bits |= ACTION_STOP_ON_STOP;
+       stop->flags = irq->u.stop.flags;
        set_bit(IRQ_PEND_SIGP_STOP, &li->pending_irqs);
        return 0;
 }
        case KVM_S390_SIGP_SET_PREFIX:
                irq->u.prefix.address = s390int->parm;
                break;
+       case KVM_S390_SIGP_STOP:
+               irq->u.stop.flags = s390int->parm;
+               break;
        case KVM_S390_INT_EXTERNAL_CALL:
                if (irq->u.extcall.code & 0xffff0000)
                        return -EINVAL;
 
        __u16 code;
 };
 
+#define KVM_S390_STOP_FLAG_STORE_STATUS        0x01
+struct kvm_s390_stop_info {
+       __u32 flags;
+};
+
 struct kvm_s390_mchk_info {
        __u64 cr14;
        __u64 mcic;
                struct kvm_s390_emerg_info emerg;
                struct kvm_s390_extcall_info extcall;
                struct kvm_s390_prefix_info prefix;
+               struct kvm_s390_stop_info stop;
                struct kvm_s390_mchk_info mchk;
                char reserved[64];
        } u;