aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm/intercept.c
diff options
context:
space:
mode:
authorCornelia Huck <cornelia.huck@de.ibm.com>2012-12-20 09:32:07 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2013-01-07 16:53:38 -0500
commitb1c571a50dfacf25a24c23271e9b8bf18ff6b102 (patch)
treeca6408076537bab63fd2b7e9df890f1a524c14a3 /arch/s390/kvm/intercept.c
parent77975357956c6450dd7ac3dfe572c1a8f0014c54 (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.c21
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;