[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 11/34] s390x/tcg: Introduce tcg_s390_vector_except
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PULL v2 11/34] s390x/tcg: Introduce tcg_s390_vector_exception() |
Date: |
Fri, 7 Jun 2019 16:17:04 +0200 |
From: David Hildenbrand <address@hidden>
Handling is similar to data exceptions, however we can always store the
VXC into the lowore and the FPC:
z14 PoP, 6-20, "Vector-Exception Code"
When a vector-processing exception causes a pro-
gram interruption, a vector-exception code (VXC) is
stored at location 147, and zeros are stored at loca-
tions 144-146. The VXC is also placed in the DXC
field of the floating-point-control (FPC) register if bit
45 of control register 0 is one. When bit 45 of control
register 0 is zero and bit 46 of control register 0 is
one, the DXC field of the FPC register and the con-
tents of storage at location 147 are unpredictable.
Signed-off-by: David Hildenbrand <address@hidden>
---
target/s390x/cpu.h | 1 +
target/s390x/excp_helper.c | 15 +++++++++++++++
target/s390x/tcg_s390x.h | 2 ++
3 files changed, 18 insertions(+)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 317a1377e6ce..4fc08a2c88f6 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -215,6 +215,7 @@ extern const struct VMStateDescription vmstate_s390_cpu;
#define PGM_SPECIAL_OP 0x0013
#define PGM_OPERAND 0x0015
#define PGM_TRACE_TABLE 0x0016
+#define PGM_VECTOR_PROCESSING 0x001b
#define PGM_SPACE_SWITCH 0x001c
#define PGM_HFP_SQRT 0x001d
#define PGM_PC_TRANS_SPEC 0x001f
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index 85223d00c01f..f21bcf79ae18 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -62,6 +62,21 @@ void QEMU_NORETURN tcg_s390_data_exception(CPUS390XState
*env, uint32_t dxc,
tcg_s390_program_interrupt(env, PGM_DATA, ILEN_AUTO, ra);
}
+void QEMU_NORETURN tcg_s390_vector_exception(CPUS390XState *env, uint32_t vxc,
+ uintptr_t ra)
+{
+ g_assert(vxc <= 0xff);
+#if !defined(CONFIG_USER_ONLY)
+ /* Always store the VXC into the lowcore, without AFP it is undefined */
+ stl_phys(CPU(s390_env_get_cpu(env))->as,
+ env->psa + offsetof(LowCore, data_exc_code), vxc);
+#endif
+
+ /* Always store the VXC into the FPC, without AFP it is undefined */
+ env->fpc = deposit32(env->fpc, 8, 8, vxc);
+ tcg_s390_program_interrupt(env, PGM_VECTOR_PROCESSING, ILEN_AUTO, ra);
+}
+
void HELPER(data_exception)(CPUS390XState *env, uint32_t dxc)
{
tcg_s390_data_exception(env, dxc, GETPC());
diff --git a/target/s390x/tcg_s390x.h b/target/s390x/tcg_s390x.h
index ab2c4ba70327..2813f9d48e2e 100644
--- a/target/s390x/tcg_s390x.h
+++ b/target/s390x/tcg_s390x.h
@@ -18,5 +18,7 @@ void QEMU_NORETURN tcg_s390_program_interrupt(CPUS390XState
*env, uint32_t code,
int ilen, uintptr_t ra);
void QEMU_NORETURN tcg_s390_data_exception(CPUS390XState *env, uint32_t dxc,
uintptr_t ra);
+void QEMU_NORETURN tcg_s390_vector_exception(CPUS390XState *env, uint32_t vxc,
+ uintptr_t ra);
#endif /* TCG_S390X_H */
--
2.20.1
- [Qemu-devel] [PULL v2 00/34] s390x updates, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 01/34] MAINTAINERS: cover tests/migration/s390x/, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 04/34] s390x/tcg: Implement VECTOR FIND ELEMENT NOT EQUAL, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 02/34] s390x/tcg: Implement VECTOR FIND ANY ELEMENT EQUAL, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 03/34] s390x/tcg: Implement VECTOR FIND ELEMENT EQUAL, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 05/34] s390x/tcg: Implement VECTOR ISOLATE STRING, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 06/34] s390x/tcg: Implement VECTOR STRING RANGE COMPARE, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 07/34] s390x: Align vector registers to 16 bytes, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 08/34] s390x: Use uint64_t for vector registers, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 09/34] s390x/tcg: Fix max_byte detection for stfle, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 11/34] s390x/tcg: Introduce tcg_s390_vector_exception(),
Cornelia Huck <=
- [Qemu-devel] [PULL v2 10/34] s390x/tcg: Store only the necessary amount of doublewords for STFLE, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 13/34] s390x/tcg: Implement VECTOR FP ADD, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 12/34] s390x/tcg: Export float_comp_to_cc() and float(32|64|128)_dcmask(), Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 14/34] s390x/tcg: Implement VECTOR FP COMPARE (AND SIGNAL) SCALAR, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 15/34] s390x/tcg: Implement VECTOR FP COMPARE (EQUAL|HIGH|HIGH OR EQUAL), Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 16/34] s390x/tcg: Implement VECTOR FP CONVERT FROM FIXED 64-BIT, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 17/34] s390x/tcg: Implement VECTOR FP CONVERT FROM LOGICAL 64-BIT, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 18/34] s390x/tcg: Implement VECTOR FP CONVERT TO FIXED 64-BIT, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 19/34] s390x/tcg: Implement VECTOR FP CONVERT TO LOGICAL 64-BIT, Cornelia Huck, 2019/06/07
- [Qemu-devel] [PULL v2 20/34] s390x/tcg: Implement VECTOR FP DIVIDE, Cornelia Huck, 2019/06/07