static int handle_skey(struct kvm_vcpu *vcpu) { vcpu->stat.instruction_storage_key++; if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); vcpu->arch.sie_block->gpsw.addr = __rewind_psw(vcpu->arch.sie_block->gpsw, 4); VCPU_EVENT(vcpu, 4, "%s", "retrying storage key operation"); return 0; }
[0xb9] = kvm_s390_handle_b9, [0xe5] = kvm_s390_handle_e5, [0xeb] = kvm_s390_handle_eb, }; void kvm_s390_rewind_psw(struct kvm_vcpu *vcpu, int ilc) { struct kvm_s390_sie_block *sie_block = vcpu->arch.sie_block; /* Use the length of the EXECUTE instruction if necessary */ if (sie_block->icptstatus & 1) { ilc = (sie_block->icptstatus >> 4) & 0x6; if (!ilc) ilc = 4; } sie_block->gpsw.addr = __rewind_psw(sie_block->gpsw, ilc); } static int handle_noop(struct kvm_vcpu *vcpu) { switch (vcpu->arch.sie_block->icptcode) { case 0x0: vcpu->stat.exit_null++; break; case 0x10: vcpu->stat.exit_external_request++; break; default: break; /* nothing */ } return 0;