target/s390x: Use tcg_s390_program_interrupt in TCG helpers
Replace all uses of s390_program_interrupt within files that are marked CONFIG_TCG. These are necessarily tcg-only. This lets each of these users benefit from the QEMU_NORETURN attribute on tcg_s390_program_interrupt. Acked-by: David Hildenbrand <david@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20191001171614.8405-5-richard.henderson@linaro.org> Signed-off-by: David Hildenbrand <david@redhat.com>
This commit is contained in:
parent
77b703f84f
commit
1e36aee636
@ -21,6 +21,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "internal.h"
|
||||
#include "tcg_s390x.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "qemu/host-utils.h"
|
||||
@ -588,8 +589,7 @@ void HELPER(sacf)(CPUS390XState *env, uint64_t a1)
|
||||
break;
|
||||
default:
|
||||
HELPER_LOG("unknown sacf mode: %" PRIx64 "\n", a1);
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
break;
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "internal.h"
|
||||
#include "tcg_s390x.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/cpu_ldst.h"
|
||||
@ -34,16 +35,14 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_t r3,
|
||||
case S390_FEAT_TYPE_PCKMO:
|
||||
case S390_FEAT_TYPE_PCC:
|
||||
if (mod) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
return 0;
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
s390_get_feat_block(type, subfunc);
|
||||
if (!test_be_bit(fc, subfunc)) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
return 0;
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
switch (fc) {
|
||||
|
@ -614,7 +614,7 @@ void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
|
||||
S390CPU *cpu = S390_CPU(cs);
|
||||
CPUS390XState *env = &cpu->env;
|
||||
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, retaddr);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, retaddr);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_USER_ONLY */
|
||||
|
@ -825,7 +825,7 @@ void HELPER(sfpc)(CPUS390XState *env, uint64_t fpc)
|
||||
{
|
||||
if (fpc_to_rnd[fpc & 0x7] == -1 || fpc & 0x03030088u ||
|
||||
(!s390_has_feat(S390_FEAT_FLOATING_POINT_EXT) && fpc & 0x4)) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
}
|
||||
|
||||
/* Install everything in the main FPC. */
|
||||
@ -843,7 +843,7 @@ void HELPER(sfas)(CPUS390XState *env, uint64_t fpc)
|
||||
|
||||
if (fpc_to_rnd[fpc & 0x7] == -1 || fpc & 0x03030088u ||
|
||||
(!s390_has_feat(S390_FEAT_FLOATING_POINT_EXT) && fpc & 0x4)) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
}
|
||||
|
||||
/*
|
||||
@ -880,7 +880,7 @@ void HELPER(sfas)(CPUS390XState *env, uint64_t fpc)
|
||||
void HELPER(srnm)(CPUS390XState *env, uint64_t rnd)
|
||||
{
|
||||
if (rnd > 0x7 || fpc_to_rnd[rnd & 0x7] == -1) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
}
|
||||
|
||||
env->fpc = deposit32(env->fpc, 0, 3, rnd);
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "internal.h"
|
||||
#include "tcg_s390x.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "exec/helper-proto.h"
|
||||
@ -39,7 +40,7 @@ int64_t HELPER(divs32)(CPUS390XState *env, int64_t a, int64_t b64)
|
||||
int64_t q;
|
||||
|
||||
if (b == 0) {
|
||||
s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
}
|
||||
|
||||
ret = q = a / b;
|
||||
@ -47,7 +48,7 @@ int64_t HELPER(divs32)(CPUS390XState *env, int64_t a, int64_t b64)
|
||||
|
||||
/* Catch non-representable quotient. */
|
||||
if (ret != q) {
|
||||
s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -60,7 +61,7 @@ uint64_t HELPER(divu32)(CPUS390XState *env, uint64_t a, uint64_t b64)
|
||||
uint64_t q;
|
||||
|
||||
if (b == 0) {
|
||||
s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
}
|
||||
|
||||
ret = q = a / b;
|
||||
@ -68,7 +69,7 @@ uint64_t HELPER(divu32)(CPUS390XState *env, uint64_t a, uint64_t b64)
|
||||
|
||||
/* Catch non-representable quotient. */
|
||||
if (ret != q) {
|
||||
s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -79,7 +80,7 @@ int64_t HELPER(divs64)(CPUS390XState *env, int64_t a, int64_t b)
|
||||
{
|
||||
/* Catch divide by zero, and non-representable quotient (MIN / -1). */
|
||||
if (b == 0 || (b == -1 && a == (1ll << 63))) {
|
||||
s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
}
|
||||
env->retxl = a % b;
|
||||
return a / b;
|
||||
@ -92,7 +93,7 @@ uint64_t HELPER(divu64)(CPUS390XState *env, uint64_t ah, uint64_t al,
|
||||
uint64_t ret;
|
||||
/* Signal divide by zero. */
|
||||
if (b == 0) {
|
||||
s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
}
|
||||
if (ah == 0) {
|
||||
/* 64 -> 64/64 case */
|
||||
@ -106,7 +107,7 @@ uint64_t HELPER(divu64)(CPUS390XState *env, uint64_t ah, uint64_t al,
|
||||
env->retxl = a % b;
|
||||
ret = q;
|
||||
if (ret != q) {
|
||||
s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
|
||||
}
|
||||
#else
|
||||
/* 32-bit hosts would need special wrapper functionality - just abort if
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "internal.h"
|
||||
#include "tcg_s390x.h"
|
||||
#include "exec/helper-proto.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "exec/cpu_ldst.h"
|
||||
@ -71,7 +72,7 @@ static inline void check_alignment(CPUS390XState *env, uint64_t v,
|
||||
int wordsize, uintptr_t ra)
|
||||
{
|
||||
if (v % wordsize) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
}
|
||||
|
||||
@ -730,7 +731,7 @@ void HELPER(srst)(CPUS390XState *env, uint32_t r1, uint32_t r2)
|
||||
|
||||
/* Bits 32-55 must contain all 0. */
|
||||
if (env->regs[0] & 0xffffff00u) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
str = get_address(env, r2);
|
||||
@ -767,7 +768,7 @@ void HELPER(srstu)(CPUS390XState *env, uint32_t r1, uint32_t r2)
|
||||
|
||||
/* Bits 32-47 of R0 must be zero. */
|
||||
if (env->regs[0] & 0xffff0000u) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
str = get_address(env, r2);
|
||||
@ -846,7 +847,7 @@ uint32_t HELPER(mvpg)(CPUS390XState *env, uint64_t r0, uint64_t r1, uint64_t r2)
|
||||
S390Access srca, desta;
|
||||
|
||||
if ((f && s) || extract64(r0, 12, 4)) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
}
|
||||
|
||||
r1 = wrap_address(env, r1 & TARGET_PAGE_MASK);
|
||||
@ -879,7 +880,7 @@ uint32_t HELPER(mvst)(CPUS390XState *env, uint32_t r1, uint32_t r2)
|
||||
int i;
|
||||
|
||||
if (env->regs[0] & 0xffffff00ull) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -911,7 +912,7 @@ void HELPER(lam)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
|
||||
int i;
|
||||
|
||||
if (a2 & 0x3) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
for (i = r1;; i = (i + 1) % 16) {
|
||||
@ -931,7 +932,7 @@ void HELPER(stam)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
|
||||
int i;
|
||||
|
||||
if (a2 & 0x3) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
for (i = r1;; i = (i + 1) % 16) {
|
||||
@ -1887,8 +1888,7 @@ static uint32_t do_csst(CPUS390XState *env, uint32_t r3, uint64_t a1,
|
||||
return cc;
|
||||
|
||||
spec_exception:
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
g_assert_not_reached();
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
uint32_t HELPER(csst)(CPUS390XState *env, uint32_t r3, uint64_t a1, uint64_t a2)
|
||||
@ -1911,7 +1911,7 @@ void HELPER(lctlg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
|
||||
uint32_t i;
|
||||
|
||||
if (src & 0x7) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
for (i = r1;; i = (i + 1) % 16) {
|
||||
@ -1944,7 +1944,7 @@ void HELPER(lctl)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
|
||||
uint32_t i;
|
||||
|
||||
if (src & 0x3) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
for (i = r1;; i = (i + 1) % 16) {
|
||||
@ -1975,7 +1975,7 @@ void HELPER(stctg)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
|
||||
uint32_t i;
|
||||
|
||||
if (dest & 0x7) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
for (i = r1;; i = (i + 1) % 16) {
|
||||
@ -1995,7 +1995,7 @@ void HELPER(stctl)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
|
||||
uint32_t i;
|
||||
|
||||
if (dest & 0x3) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
for (i = r1;; i = (i + 1) % 16) {
|
||||
@ -2225,7 +2225,7 @@ void HELPER(idte)(CPUS390XState *env, uint64_t r1, uint64_t r2, uint32_t m4)
|
||||
uint16_t entries, i, index = 0;
|
||||
|
||||
if (r2 & 0xff000) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
if (!(r2 & 0x800)) {
|
||||
@ -2369,7 +2369,7 @@ uint64_t HELPER(lra)(CPUS390XState *env, uint64_t addr)
|
||||
|
||||
/* XXX incomplete - has more corner cases */
|
||||
if (!(env->psw.mask & PSW_MASK_64) && (addr >> 32)) {
|
||||
s390_program_interrupt(env, PGM_SPECIAL_OP, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIAL_OP, GETPC());
|
||||
}
|
||||
|
||||
old_exc = cs->exception_index;
|
||||
@ -2538,7 +2538,7 @@ uint32_t HELPER(mvcos)(CPUS390XState *env, uint64_t dest, uint64_t src,
|
||||
__func__, dest, src, len);
|
||||
|
||||
if (!(env->psw.mask & PSW_MASK_DAT)) {
|
||||
s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
}
|
||||
|
||||
/* OAC (operand access control) for the first operand -> dest */
|
||||
@ -2569,14 +2569,14 @@ uint32_t HELPER(mvcos)(CPUS390XState *env, uint64_t dest, uint64_t src,
|
||||
}
|
||||
|
||||
if (dest_a && dest_as == AS_HOME && (env->psw.mask & PSW_MASK_PSTATE)) {
|
||||
s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
}
|
||||
if (!(env->cregs[0] & CR0_SECONDARY) &&
|
||||
(dest_as == AS_SECONDARY || src_as == AS_SECONDARY)) {
|
||||
s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIAL_OP, ra);
|
||||
}
|
||||
if (!psw_key_valid(env, dest_key) || !psw_key_valid(env, src_key)) {
|
||||
s390_program_interrupt(env, PGM_PRIVILEGED, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_PRIVILEGED, ra);
|
||||
}
|
||||
|
||||
len = wrap_length32(env, len);
|
||||
@ -2590,7 +2590,7 @@ uint32_t HELPER(mvcos)(CPUS390XState *env, uint64_t dest, uint64_t src,
|
||||
(env->psw.mask & PSW_MASK_PSTATE)) {
|
||||
qemu_log_mask(LOG_UNIMP, "%s: AR-mode and PSTATE support missing\n",
|
||||
__func__);
|
||||
s390_program_interrupt(env, PGM_ADDRESSING, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_ADDRESSING, ra);
|
||||
}
|
||||
|
||||
/* FIXME: Access using correct keys and AR-mode */
|
||||
|
@ -106,7 +106,7 @@ uint32_t HELPER(servc)(CPUS390XState *env, uint64_t r1, uint64_t r2)
|
||||
int r = sclp_service_call(env, r1, r2);
|
||||
qemu_mutex_unlock_iothread();
|
||||
if (r < 0) {
|
||||
s390_program_interrupt(env, -r, GETPC());
|
||||
tcg_s390_program_interrupt(env, -r, GETPC());
|
||||
}
|
||||
return r;
|
||||
}
|
||||
@ -143,7 +143,7 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uint32_t r3, uint32_t num)
|
||||
}
|
||||
|
||||
if (r) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
}
|
||||
}
|
||||
|
||||
@ -222,7 +222,7 @@ void HELPER(sckpf)(CPUS390XState *env, uint64_t r0)
|
||||
uint32_t val = r0;
|
||||
|
||||
if (val & 0xffff0000) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, GETPC());
|
||||
}
|
||||
env->todpr = val;
|
||||
}
|
||||
@ -266,7 +266,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0, uint64_t r0, uint64_t r1)
|
||||
}
|
||||
|
||||
if ((r0 & STSI_R0_RESERVED_MASK) || (r1 & STSI_R1_RESERVED_MASK)) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
if ((r0 & STSI_R0_FC_MASK) == STSI_R0_FC_CURRENT) {
|
||||
@ -276,7 +276,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0, uint64_t r0, uint64_t r1)
|
||||
}
|
||||
|
||||
if (a0 & ~TARGET_PAGE_MASK) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
/* count the cpus and split them into configured and reserved ones */
|
||||
@ -509,7 +509,7 @@ uint32_t HELPER(tpi)(CPUS390XState *env, uint64_t addr)
|
||||
LowCore *lowcore;
|
||||
|
||||
if (addr & 0x3) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
qemu_mutex_lock_iothread();
|
||||
@ -574,7 +574,7 @@ void HELPER(chsc)(CPUS390XState *env, uint64_t inst)
|
||||
void HELPER(per_check_exception)(CPUS390XState *env)
|
||||
{
|
||||
if (env->per_perc_atmid) {
|
||||
s390_program_interrupt(env, PGM_PER, GETPC());
|
||||
tcg_s390_program_interrupt(env, PGM_PER, GETPC());
|
||||
}
|
||||
}
|
||||
|
||||
@ -664,7 +664,7 @@ uint32_t HELPER(stfle)(CPUS390XState *env, uint64_t addr)
|
||||
int i;
|
||||
|
||||
if (addr & 0x7) {
|
||||
s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
|
||||
}
|
||||
|
||||
prepare_stfl();
|
||||
@ -737,7 +737,7 @@ void HELPER(sic)(CPUS390XState *env, uint64_t r1, uint64_t r3)
|
||||
qemu_mutex_unlock_iothread();
|
||||
/* css_do_sic() may actually return a PGM_xxx value to inject */
|
||||
if (r) {
|
||||
s390_program_interrupt(env, -r, GETPC());
|
||||
tcg_s390_program_interrupt(env, -r, GETPC());
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user