20 static int diag_release_pages(
struct kvm_vcpu *vcpu)
23 unsigned long prefix = vcpu->
arch.sie_block->prefix;
25 start = vcpu->
run->s.regs.gprs[(vcpu->
arch.sie_block->ipa & 0xf0) >> 4];
26 end = vcpu->
run->s.regs.gprs[vcpu->
arch.sie_block->ipa & 0xf] + 4096;
32 VCPU_EVENT(vcpu, 5,
"diag release pages %lX %lX", start, end);
33 vcpu->
stat.diagnose_10++;
36 if (end < prefix || start >= prefix + 2 *
PAGE_SIZE) {
43 end, vcpu->
arch.gmap);
48 static int __diag_time_slice_end(
struct kvm_vcpu *vcpu)
50 VCPU_EVENT(vcpu, 5,
"%s",
"diag time slice end");
51 vcpu->
stat.diagnose_44++;
56 static int __diag_time_slice_end_directed(
struct kvm_vcpu *vcpu)
63 tid = vcpu->
run->s.regs.gprs[(vcpu->
arch.sie_block->ipa & 0xf0) >> 4];
64 vcpu->
stat.diagnose_9c++;
65 VCPU_EVENT(vcpu, 5,
"diag time slice end directed to %d", tid);
79 static int __diag_ipl_functions(
struct kvm_vcpu *vcpu)
81 unsigned int reg = vcpu->
arch.sie_block->ipa & 0xf;
82 unsigned long subcode = vcpu->
run->s.regs.gprs[
reg] & 0xffff;
84 VCPU_EVENT(vcpu, 5,
"diag ipl functions, subcode %lx", subcode);
90 vcpu->
run->s390_reset_flags = 0;
101 VCPU_EVENT(vcpu, 3,
"requesting userspace resets %llx",
102 vcpu->
run->s390_reset_flags);
103 trace_kvm_s390_request_resets(vcpu->
run->s390_reset_flags);
109 int code = (vcpu->
arch.sie_block->ipb & 0xfff0000) >> 16;
111 trace_kvm_s390_handle_diag(vcpu, code);
114 return diag_release_pages(vcpu);
116 return __diag_time_slice_end(vcpu);
118 return __diag_time_slice_end_directed(vcpu);
120 return __diag_ipl_functions(vcpu);