diff options
author | David Hildenbrand <david@redhat.com> | 2017-09-28 22:36:42 +0200 |
---|---|---|
committer | Cornelia Huck <cohuck@redhat.com> | 2017-10-20 13:32:10 +0200 |
commit | 8417f904bad50021b432dfea12613345d9fb1f68 (patch) | |
tree | 955b565a71a6bb5376b386cb99eedf8fe69fbf6f /target/s390x/excp_helper.c | |
parent | 14ca122e753c7bc925e6cedc4f16588bc154090d (diff) |
s390x/tcg: rework checking for deliverable interrupts
Currently, enabling/disabling of interrupts is not really supported.
Let's improve interrupt handling code by explicitly checking for
deliverable interrupts only. This is the first step. Checking for
external interrupt subclasses will be done next.
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170928203708.9376-5-david@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Diffstat (limited to 'target/s390x/excp_helper.c')
-rw-r--r-- | target/s390x/excp_helper.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c index 44e9b2c6a6..050d5a61f1 100644 --- a/target/s390x/excp_helper.c +++ b/target/s390x/excp_helper.c @@ -435,24 +435,16 @@ void s390_cpu_do_interrupt(CPUState *cs) s390_cpu_set_state(CPU_STATE_OPERATING, cpu); /* handle machine checks */ - if ((env->psw.mask & PSW_MASK_MCHECK) && - (cs->exception_index == -1)) { - if (env->pending_int & INTERRUPT_MCHK) { - cs->exception_index = EXCP_MCHK; - } + if (cs->exception_index == -1 && s390_cpu_has_mcck_int(cpu)) { + cs->exception_index = EXCP_MCHK; } /* handle external interrupts */ - if ((env->psw.mask & PSW_MASK_EXT) && - cs->exception_index == -1 && - (env->pending_int & INTERRUPT_EXT)) { + if (cs->exception_index == -1 && s390_cpu_has_ext_int(cpu)) { cs->exception_index = EXCP_EXT; } /* handle I/O interrupts */ - if ((env->psw.mask & PSW_MASK_IO) && - (cs->exception_index == -1)) { - if (env->pending_int & INTERRUPT_IO) { - cs->exception_index = EXCP_IO; - } + if (cs->exception_index == -1 && s390_cpu_has_io_int(cpu)) { + cs->exception_index = EXCP_IO; } switch (cs->exception_index) { @@ -474,6 +466,7 @@ void s390_cpu_do_interrupt(CPUState *cs) } cs->exception_index = -1; + /* we might still have pending interrupts, but not deliverable */ if (!env->pending_int) { cs->interrupt_request &= ~CPU_INTERRUPT_HARD; } @@ -490,7 +483,7 @@ bool s390_cpu_exec_interrupt(CPUState *cs, int interrupt_request) the parent EXECUTE insn. */ return false; } - if (env->psw.mask & PSW_MASK_EXT) { + if (s390_cpu_has_int(cpu)) { s390_cpu_do_interrupt(cs); return true; } |