s390x/tcg: Introduce tcg_s390_vector_exception()
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 <david@redhat.com>
This commit is contained in:
parent
e19a61eb51
commit
9be6fa99d6
@ -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
|
||||
|
@ -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());
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user