diff mbox series

[for-4.1,6/6] target/s390x: Use tcg_s390_program_interrupt in TCG helpers

Message ID 20190401102911.8685-7-richard.henderson@linaro.org
State Superseded
Headers show
Series target/s390x: Clean up tcg exceptions | expand

Commit Message

Richard Henderson April 1, 2019, 10:29 a.m. UTC
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.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 target/s390x/cc_helper.c     |  4 ++--
 target/s390x/crypto_helper.c |  7 +++----
 target/s390x/excp_helper.c   |  2 +-
 target/s390x/fpu_helper.c    |  6 +++---
 target/s390x/int_helper.c    | 15 +++++++-------
 target/s390x/mem_helper.c    | 38 ++++++++++++++++++------------------
 target/s390x/misc_helper.c   | 18 ++++++++---------
 7 files changed, 45 insertions(+), 45 deletions(-)

-- 
2.17.1

Comments

David Hildenbrand April 1, 2019, 12:17 p.m. UTC | #1
On 01.04.19 12:29, Richard Henderson wrote:
> 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.

> 

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  target/s390x/cc_helper.c     |  4 ++--

>  target/s390x/crypto_helper.c |  7 +++----

>  target/s390x/excp_helper.c   |  2 +-

>  target/s390x/fpu_helper.c    |  6 +++---

>  target/s390x/int_helper.c    | 15 +++++++-------

>  target/s390x/mem_helper.c    | 38 ++++++++++++++++++------------------

>  target/s390x/misc_helper.c   | 18 ++++++++---------

>  7 files changed, 45 insertions(+), 45 deletions(-)

> 

> diff --git a/target/s390x/cc_helper.c b/target/s390x/cc_helper.c

> index d35ff08f59..9199b4c9bc 100644

> --- a/target/s390x/cc_helper.c

> +++ b/target/s390x/cc_helper.c

> @@ -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"

> @@ -572,8 +573,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

> diff --git a/target/s390x/crypto_helper.c b/target/s390x/crypto_helper.c

> index 1f83987e9d..ff3fbc3950 100644

> --- a/target/s390x/crypto_helper.c

> +++ b/target/s390x/crypto_helper.c

> @@ -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) {

> diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c

> index f42af4de91..bc781c14c3 100644

> --- a/target/s390x/excp_helper.c

> +++ b/target/s390x/excp_helper.c

> @@ -573,7 +573,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 */

> diff --git a/target/s390x/fpu_helper.c b/target/s390x/fpu_helper.c

> index 4c107c9e37..4d3fe962cd 100644

> --- a/target/s390x/fpu_helper.c

> +++ b/target/s390x/fpu_helper.c

> @@ -827,7 +827,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.  */

> @@ -845,7 +845,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());

>      }

>  

>      /*

> @@ -882,7 +882,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);

> diff --git a/target/s390x/int_helper.c b/target/s390x/int_helper.c

> index 7027f51b44..80150039b0 100644

> --- a/target/s390x/int_helper.c

> +++ b/target/s390x/int_helper.c

> @@ -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

>          S390CPU *cpu = s390_env_get_cpu(env);

> diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c

> index 6c5754a2bf..d54907696d 100644

> --- a/target/s390x/mem_helper.c

> +++ b/target/s390x/mem_helper.c

> @@ -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"

> @@ -98,7 +99,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);

>      }

>  }

>  

> @@ -556,7 +557,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);

> @@ -593,7 +594,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);

> @@ -708,7 +709,7 @@ void HELPER(lam)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)

>  

>      if (a2 & 0x3) {

>          /* we either came here by lam or lamy, which have different lengths */

> -        s390_program_interrupt(env, PGM_SPECIFICATION, ra);

> +        tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);

>      }

>  

>      for (i = r1;; i = (i + 1) % 16) {

> @@ -728,7 +729,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) {

> @@ -1627,8 +1628,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)

> @@ -1652,7 +1652,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) {

> @@ -1686,7 +1686,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) {

> @@ -1717,7 +1717,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) {

> @@ -1737,7 +1737,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) {

> @@ -1941,7 +1941,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)) {

> @@ -2089,7 +2089,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;

> @@ -2258,7 +2258,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 */

> @@ -2289,14 +2289,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_length(env, len);

> @@ -2310,7 +2310,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: a) LAP

> @@ -2643,7 +2643,7 @@ void probe_write_access(CPUS390XState *env, uint64_t addr, uint64_t len,

>  #ifdef CONFIG_USER_ONLY

>      if (!h2g_valid(addr) || !h2g_valid(addr + len - 1) ||

>          page_check_range(addr, len, PAGE_WRITE) < 0) {

> -        s390_program_interrupt(env, PGM_ADDRESSING, ra);

> +        tcg_s390_program_interrupt(env, PGM_ADDRESSING, ra);

>      }

>  #else

>      /* test the actual access, not just any access to the page due to LAP */

> diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c

> index fd2ed885a5..7ea0202341 100644

> --- a/target/s390x/misc_helper.c

> +++ b/target/s390x/misc_helper.c

> @@ -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();

> @@ -730,7 +730,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());

>      }

>  }

>  

> 


Acked-by: David Hildenbrand <david@redhat.com>


-- 

Thanks,

David / dhildenb
diff mbox series

Patch

diff --git a/target/s390x/cc_helper.c b/target/s390x/cc_helper.c
index d35ff08f59..9199b4c9bc 100644
--- a/target/s390x/cc_helper.c
+++ b/target/s390x/cc_helper.c
@@ -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"
@@ -572,8 +573,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
diff --git a/target/s390x/crypto_helper.c b/target/s390x/crypto_helper.c
index 1f83987e9d..ff3fbc3950 100644
--- a/target/s390x/crypto_helper.c
+++ b/target/s390x/crypto_helper.c
@@ -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) {
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index f42af4de91..bc781c14c3 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -573,7 +573,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 */
diff --git a/target/s390x/fpu_helper.c b/target/s390x/fpu_helper.c
index 4c107c9e37..4d3fe962cd 100644
--- a/target/s390x/fpu_helper.c
+++ b/target/s390x/fpu_helper.c
@@ -827,7 +827,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.  */
@@ -845,7 +845,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());
     }
 
     /*
@@ -882,7 +882,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);
diff --git a/target/s390x/int_helper.c b/target/s390x/int_helper.c
index 7027f51b44..80150039b0 100644
--- a/target/s390x/int_helper.c
+++ b/target/s390x/int_helper.c
@@ -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
         S390CPU *cpu = s390_env_get_cpu(env);
diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c
index 6c5754a2bf..d54907696d 100644
--- a/target/s390x/mem_helper.c
+++ b/target/s390x/mem_helper.c
@@ -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"
@@ -98,7 +99,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);
     }
 }
 
@@ -556,7 +557,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);
@@ -593,7 +594,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);
@@ -708,7 +709,7 @@  void HELPER(lam)(CPUS390XState *env, uint32_t r1, uint64_t a2, uint32_t r3)
 
     if (a2 & 0x3) {
         /* we either came here by lam or lamy, which have different lengths */
-        s390_program_interrupt(env, PGM_SPECIFICATION, ra);
+        tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
     }
 
     for (i = r1;; i = (i + 1) % 16) {
@@ -728,7 +729,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) {
@@ -1627,8 +1628,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)
@@ -1652,7 +1652,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) {
@@ -1686,7 +1686,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) {
@@ -1717,7 +1717,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) {
@@ -1737,7 +1737,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) {
@@ -1941,7 +1941,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)) {
@@ -2089,7 +2089,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;
@@ -2258,7 +2258,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 */
@@ -2289,14 +2289,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_length(env, len);
@@ -2310,7 +2310,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: a) LAP
@@ -2643,7 +2643,7 @@  void probe_write_access(CPUS390XState *env, uint64_t addr, uint64_t len,
 #ifdef CONFIG_USER_ONLY
     if (!h2g_valid(addr) || !h2g_valid(addr + len - 1) ||
         page_check_range(addr, len, PAGE_WRITE) < 0) {
-        s390_program_interrupt(env, PGM_ADDRESSING, ra);
+        tcg_s390_program_interrupt(env, PGM_ADDRESSING, ra);
     }
 #else
     /* test the actual access, not just any access to the page due to LAP */
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index fd2ed885a5..7ea0202341 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -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();
@@ -730,7 +730,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());
     }
 }