s390/kvm: remove dependency on struct save_area definition
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 23 Oct 2015 07:02:32 +0000 (09:02 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 27 Nov 2015 08:24:13 +0000 (09:24 +0100)
Replace the offsets based on the struct area_area with the offset
constants from asm-offsets.c based on the struct _lowcore.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/asm-offsets.c
arch/s390/kvm/kvm-s390.c

index 9cd248f..dc6c9c6 100644 (file)
@@ -181,6 +181,7 @@ int main(void)
        OFFSET(__LC_PSW_SAVE_AREA, _lowcore, psw_save_area);
        OFFSET(__LC_PREFIX_SAVE_AREA, _lowcore, prefixreg_save_area);
        OFFSET(__LC_FP_CREG_SAVE_AREA, _lowcore, fpt_creg_save_area);
+       OFFSET(__LC_TOD_PROGREG_SAVE_AREA, _lowcore, tod_progreg_save_area);
        OFFSET(__LC_CPU_TIMER_SAVE_AREA, _lowcore, cpu_timer_save_area);
        OFFSET(__LC_CLOCK_COMP_SAVE_AREA, _lowcore, clock_comp_save_area);
        OFFSET(__LC_AREGS_SAVE_AREA, _lowcore, access_regs_save_area);
index 8465892..713a91a 100644 (file)
@@ -2270,37 +2270,37 @@ int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long gpa)
        u64 clkcomp;
        int rc;
 
+       px = kvm_s390_get_prefix(vcpu);
        if (gpa == KVM_S390_STORE_STATUS_NOADDR) {
                if (write_guest_abs(vcpu, 163, &archmode, 1))
                        return -EFAULT;
-               gpa = SAVE_AREA_BASE;
+               gpa = 0;
        } else if (gpa == KVM_S390_STORE_STATUS_PREFIXED) {
                if (write_guest_real(vcpu, 163, &archmode, 1))
                        return -EFAULT;
-               gpa = kvm_s390_real_to_abs(vcpu, SAVE_AREA_BASE);
-       }
-       rc = write_guest_abs(vcpu, gpa + offsetof(struct save_area, fp_regs),
+               gpa = px;
+       } else
+               gpa -= __LC_FPREGS_SAVE_AREA;
+       rc = write_guest_abs(vcpu, gpa + __LC_FPREGS_SAVE_AREA,
                             vcpu->arch.guest_fpregs.fprs, 128);
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, gp_regs),
+       rc |= write_guest_abs(vcpu, gpa + __LC_GPREGS_SAVE_AREA,
                              vcpu->run->s.regs.gprs, 128);
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, psw),
+       rc |= write_guest_abs(vcpu, gpa + __LC_PSW_SAVE_AREA,
                              &vcpu->arch.sie_block->gpsw, 16);
-       px = kvm_s390_get_prefix(vcpu);
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, pref_reg),
+       rc |= write_guest_abs(vcpu, gpa + __LC_PREFIX_SAVE_AREA,
                              &px, 4);
-       rc |= write_guest_abs(vcpu,
-                             gpa + offsetof(struct save_area, fp_ctrl_reg),
+       rc |= write_guest_abs(vcpu, gpa + __LC_FP_CREG_SAVE_AREA,
                              &vcpu->arch.guest_fpregs.fpc, 4);
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, tod_reg),
+       rc |= write_guest_abs(vcpu, gpa + __LC_TOD_PROGREG_SAVE_AREA,
                              &vcpu->arch.sie_block->todpr, 4);
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, timer),
+       rc |= write_guest_abs(vcpu, gpa + __LC_CPU_TIMER_SAVE_AREA,
                              &vcpu->arch.sie_block->cputm, 8);
        clkcomp = vcpu->arch.sie_block->ckc >> 8;
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, clk_cmp),
+       rc |= write_guest_abs(vcpu, gpa + __LC_CLOCK_COMP_SAVE_AREA,
                              &clkcomp, 8);
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, acc_regs),
+       rc |= write_guest_abs(vcpu, gpa + __LC_AREGS_SAVE_AREA,
                              &vcpu->run->s.regs.acrs, 64);
-       rc |= write_guest_abs(vcpu, gpa + offsetof(struct save_area, ctrl_regs),
+       rc |= write_guest_abs(vcpu, gpa + __LC_CREGS_SAVE_AREA,
                              &vcpu->arch.sie_block->gcr, 128);
        return rc ? -EFAULT : 0;
 }