diff options
author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2012-12-20 09:32:07 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2013-01-07 16:53:38 -0500 |
commit | b1c571a50dfacf25a24c23271e9b8bf18ff6b102 (patch) | |
tree | ca6408076537bab63fd2b7e9df890f1a524c14a3 /arch/s390/kvm/intercept.c | |
parent | 77975357956c6450dd7ac3dfe572c1a8f0014c54 (diff) |
KVM: s390: Decoding helper functions.
Introduce helper functions for decoding the various base/displacement
instruction formats.
Reviewed-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/s390/kvm/intercept.c')
-rw-r--r-- | arch/s390/kvm/intercept.c | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 0c08b3f1c1c5..df6c0ad085aa 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -26,9 +26,6 @@ static int handle_lctlg(struct kvm_vcpu *vcpu) | |||
26 | { | 26 | { |
27 | int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4; | 27 | int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4; |
28 | int reg3 = vcpu->arch.sie_block->ipa & 0x000f; | 28 | int reg3 = vcpu->arch.sie_block->ipa & 0x000f; |
29 | int base2 = vcpu->arch.sie_block->ipb >> 28; | ||
30 | int disp2 = ((vcpu->arch.sie_block->ipb & 0x0fff0000) >> 16) + | ||
31 | ((vcpu->arch.sie_block->ipb & 0xff00) << 4); | ||
32 | u64 useraddr; | 29 | u64 useraddr; |
33 | int reg, rc; | 30 | int reg, rc; |
34 | 31 | ||
@@ -36,17 +33,15 @@ static int handle_lctlg(struct kvm_vcpu *vcpu) | |||
36 | if ((vcpu->arch.sie_block->ipb & 0xff) != 0x2f) | 33 | if ((vcpu->arch.sie_block->ipb & 0xff) != 0x2f) |
37 | return -EOPNOTSUPP; | 34 | return -EOPNOTSUPP; |
38 | 35 | ||
39 | useraddr = disp2; | 36 | useraddr = kvm_s390_get_base_disp_rsy(vcpu); |
40 | if (base2) | ||
41 | useraddr += vcpu->run->s.regs.gprs[base2]; | ||
42 | 37 | ||
43 | if (useraddr & 7) | 38 | if (useraddr & 7) |
44 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | 39 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); |
45 | 40 | ||
46 | reg = reg1; | 41 | reg = reg1; |
47 | 42 | ||
48 | VCPU_EVENT(vcpu, 5, "lctlg r1:%x, r3:%x,b2:%x,d2:%x", reg1, reg3, base2, | 43 | VCPU_EVENT(vcpu, 5, "lctlg r1:%x, r3:%x, addr:%llx", reg1, reg3, |
49 | disp2); | 44 | useraddr); |
50 | trace_kvm_s390_handle_lctl(vcpu, 1, reg1, reg3, useraddr); | 45 | trace_kvm_s390_handle_lctl(vcpu, 1, reg1, reg3, useraddr); |
51 | 46 | ||
52 | do { | 47 | do { |
@@ -68,23 +63,19 @@ static int handle_lctl(struct kvm_vcpu *vcpu) | |||
68 | { | 63 | { |
69 | int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4; | 64 | int reg1 = (vcpu->arch.sie_block->ipa & 0x00f0) >> 4; |
70 | int reg3 = vcpu->arch.sie_block->ipa & 0x000f; | 65 | int reg3 = vcpu->arch.sie_block->ipa & 0x000f; |
71 | int base2 = vcpu->arch.sie_block->ipb >> 28; | ||
72 | int disp2 = ((vcpu->arch.sie_block->ipb & 0x0fff0000) >> 16); | ||
73 | u64 useraddr; | 66 | u64 useraddr; |
74 | u32 val = 0; | 67 | u32 val = 0; |
75 | int reg, rc; | 68 | int reg, rc; |
76 | 69 | ||
77 | vcpu->stat.instruction_lctl++; | 70 | vcpu->stat.instruction_lctl++; |
78 | 71 | ||
79 | useraddr = disp2; | 72 | useraddr = kvm_s390_get_base_disp_rs(vcpu); |
80 | if (base2) | ||
81 | useraddr += vcpu->run->s.regs.gprs[base2]; | ||
82 | 73 | ||
83 | if (useraddr & 3) | 74 | if (useraddr & 3) |
84 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | 75 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); |
85 | 76 | ||
86 | VCPU_EVENT(vcpu, 5, "lctl r1:%x, r3:%x,b2:%x,d2:%x", reg1, reg3, base2, | 77 | VCPU_EVENT(vcpu, 5, "lctl r1:%x, r3:%x, addr:%llx", reg1, reg3, |
87 | disp2); | 78 | useraddr); |
88 | trace_kvm_s390_handle_lctl(vcpu, 0, reg1, reg3, useraddr); | 79 | trace_kvm_s390_handle_lctl(vcpu, 0, reg1, reg3, useraddr); |
89 | 80 | ||
90 | reg = reg1; | 81 | reg = reg1; |