[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 02/10] s390x: Vector Register IOCTLs
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PULL 02/10] s390x: Vector Register IOCTLs |
Date: |
Thu, 28 May 2015 10:42:57 +0200 |
From: Eric Farman <address@hidden>
Handle the actual syncing of the vector registers with kernel space,
via the get/put register IOCTLs.
The vector registers that were introduced with the z13 overlay
the existing floating point registers. FP registers 0-15 are
the high-halves of vector registers 0-15. Thus, remove the
freg fields and replace them with the equivalent vector field
to avoid errors in duplication. Moreover, synchronize either the
vector registers via kvm_sync_regs, or floating point registers
via the GET/SET FPU IOCTLs.
Signed-off-by: Eric Farman <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
target-s390x/cpu.h | 8 ++++++--
target-s390x/kvm.c | 49 ++++++++++++++++++++++++++++++++----------------
target-s390x/machine.c | 32 +++++++++++++++----------------
target-s390x/translate.c | 2 +-
4 files changed, 56 insertions(+), 35 deletions(-)
diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
index e968769..708349c 100644
--- a/target-s390x/cpu.h
+++ b/target-s390x/cpu.h
@@ -81,7 +81,11 @@ typedef struct MchkQueue {
typedef struct CPUS390XState {
uint64_t regs[16]; /* GP registers */
- CPU_DoubleU fregs[16]; /* FP registers */
+ /*
+ * The floating point registers are part of the vector registers.
+ * vregs[0][0] -> vregs[15][0] are 16 floating point registers
+ */
+ CPU_DoubleU vregs[32][2]; /* vector registers */
uint32_t aregs[16]; /* access registers */
uint32_t fpc; /* floating-point control register */
@@ -164,7 +168,7 @@ typedef struct CPUS390XState {
static inline CPU_DoubleU *get_freg(CPUS390XState *cs, int nr)
{
- return &cs->fregs[nr];
+ return &cs->vregs[nr][0];
}
#include "cpu-qom.h"
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 1a40a94..ca8ffcc 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -337,15 +337,24 @@ int kvm_arch_put_registers(CPUState *cs, int level)
}
}
- /* Floating point */
- for (i = 0; i < 16; i++) {
- fpu.fprs[i] = get_freg(env, i)->ll;
- }
- fpu.fpc = env->fpc;
+ if (can_sync_regs(cs, KVM_SYNC_VRS)) {
+ for (i = 0; i < 32; i++) {
+ cs->kvm_run->s.regs.vrs[i][0] = env->vregs[i][0].ll;
+ cs->kvm_run->s.regs.vrs[i][1] = env->vregs[i][1].ll;
+ }
+ cs->kvm_run->s.regs.fpc = env->fpc;
+ cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_VRS;
+ } else {
+ /* Floating point */
+ for (i = 0; i < 16; i++) {
+ fpu.fprs[i] = get_freg(env, i)->ll;
+ }
+ fpu.fpc = env->fpc;
- r = kvm_vcpu_ioctl(cs, KVM_SET_FPU, &fpu);
- if (r < 0) {
- return r;
+ r = kvm_vcpu_ioctl(cs, KVM_SET_FPU, &fpu);
+ if (r < 0) {
+ return r;
+ }
}
/* Do we need to save more than that? */
@@ -468,15 +477,23 @@ int kvm_arch_get_registers(CPUState *cs)
}
}
- /* Floating point */
- r = kvm_vcpu_ioctl(cs, KVM_GET_FPU, &fpu);
- if (r < 0) {
- return r;
- }
- for (i = 0; i < 16; i++) {
- get_freg(env, i)->ll = fpu.fprs[i];
+ /* Floating point and vector registers */
+ if (can_sync_regs(cs, KVM_SYNC_VRS)) {
+ for (i = 0; i < 32; i++) {
+ env->vregs[i][0].ll = cs->kvm_run->s.regs.vrs[i][0];
+ env->vregs[i][1].ll = cs->kvm_run->s.regs.vrs[i][1];
+ }
+ env->fpc = cs->kvm_run->s.regs.fpc;
+ } else {
+ r = kvm_vcpu_ioctl(cs, KVM_GET_FPU, &fpu);
+ if (r < 0) {
+ return r;
+ }
+ for (i = 0; i < 16; i++) {
+ get_freg(env, i)->ll = fpu.fprs[i];
+ }
+ env->fpc = fpu.fpc;
}
- env->fpc = fpu.fpc;
/* The prefix */
if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
diff --git a/target-s390x/machine.c b/target-s390x/machine.c
index 7853e3c..1a9390b 100644
--- a/target-s390x/machine.c
+++ b/target-s390x/machine.c
@@ -47,22 +47,22 @@ const VMStateDescription vmstate_fpu = {
.version_id = 1,
.minimum_version_id = 1,
.fields = (VMStateField[]) {
- VMSTATE_UINT64(env.fregs[0].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[1].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[2].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[3].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[4].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[5].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[6].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[7].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[8].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[9].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[10].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[11].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[12].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[13].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[14].ll, S390CPU),
- VMSTATE_UINT64(env.fregs[15].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[0][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[1][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[2][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[3][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[4][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[5][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[6][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[7][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[8][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[9][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[10][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[11][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[12][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[13][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[14][0].ll, S390CPU),
+ VMSTATE_UINT64(env.vregs[15][0].ll, S390CPU),
VMSTATE_UINT32(env.fpc, S390CPU),
VMSTATE_END_OF_LIST()
}
diff --git a/target-s390x/translate.c b/target-s390x/translate.c
index 96b43b3..06fc192 100644
--- a/target-s390x/translate.c
+++ b/target-s390x/translate.c
@@ -187,7 +187,7 @@ void s390x_translate_init(void)
for (i = 0; i < 16; i++) {
snprintf(cpu_reg_names[i + 16], sizeof(cpu_reg_names[0]), "f%d", i);
fregs[i] = tcg_global_mem_new(TCG_AREG0,
- offsetof(CPUS390XState, fregs[i].d),
+ offsetof(CPUS390XState, vregs[i][0].d),
cpu_reg_names[i + 16]);
}
}
--
2.4.2
- [Qemu-devel] [PULL 00/10] s390x: SIMD support, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 03/10] s390x: Store Additional Status SIGP order, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 05/10] s390x: gdb updates for vector registers, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 07/10] linux/elf.h update, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 06/10] s390x: Add vector registers to HMP output, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 04/10] gdb-xml: Include XML for s390 vector registers, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 10/10] s390x: Enable vector processing capability, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 09/10] s390x: Migrate vector registers, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 02/10] s390x: Vector Register IOCTLs,
Cornelia Huck <=
- [Qemu-devel] [PULL 01/10] s390x: Common access to floating point registers, Cornelia Huck, 2015/05/28
- [Qemu-devel] [PULL 08/10] s390x: Add vector registers to ELF dump, Cornelia Huck, 2015/05/28
- Re: [Qemu-devel] [PULL 00/10] s390x: SIMD support, Peter Maydell, 2015/05/28