[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[qemu-s390x] [PULL 02/29] s390x/tcg: deliver multiple interrupts in a ro
From: |
Cornelia Huck |
Subject: |
[qemu-s390x] [PULL 02/29] s390x/tcg: deliver multiple interrupts in a row |
Date: |
Fri, 9 Feb 2018 10:24:57 +0100 |
From: David Hildenbrand <address@hidden>
We have to consider all deliverable interrupts.
We now have to take care of the special scenario, where we first
inject an interrupt with a WAIT PSW, followed by a !WAIT PSW. (very
unlikely but possible)
Signed-off-by: David Hildenbrand <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
target/s390x/excp_helper.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index e8f7a40c2b..97caa7f418 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -433,10 +433,12 @@ void s390_cpu_do_interrupt(CPUState *cs)
{
S390CPU *cpu = S390_CPU(cs);
CPUS390XState *env = &cpu->env;
+ bool stopped = false;
qemu_log_mask(CPU_LOG_INT, "%s: %d at pc=%" PRIx64 "\n",
__func__, cs->exception_index, env->psw.addr);
+try_deliver:
/* handle machine checks */
if (cs->exception_index == -1 && s390_cpu_has_mcck_int(cpu)) {
cs->exception_index = EXCP_MCHK;
@@ -479,13 +481,14 @@ void s390_cpu_do_interrupt(CPUState *cs)
break;
case EXCP_STOP:
do_stop_interrupt(env);
+ stopped = true;
break;
}
- /* WAIT PSW during interrupt injection or STOP interrupt */
- if (cs->exception_index == EXCP_HLT) {
- /* don't trigger a cpu_loop_exit(), use an interrupt instead */
- cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HALT);
+ if (cs->exception_index != -1 && !stopped) {
+ /* check if there are more pending interrupts to deliver */
+ cs->exception_index = -1;
+ goto try_deliver;
}
cs->exception_index = -1;
@@ -493,6 +496,15 @@ void s390_cpu_do_interrupt(CPUState *cs)
if (!env->pending_int) {
cs->interrupt_request &= ~CPU_INTERRUPT_HARD;
}
+
+ /* WAIT PSW during interrupt injection or STOP interrupt */
+ if ((env->psw.mask & PSW_MASK_WAIT) || stopped) {
+ /* don't trigger a cpu_loop_exit(), use an interrupt instead */
+ cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HALT);
+ } else if (cs->halted) {
+ /* unhalt if we had a WAIT PSW somehwere in our injection chain */
+ s390_cpu_unhalt(cpu);
+ }
}
bool s390_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
--
2.13.6
- [qemu-s390x] [PULL 00/29] s390x: assorted updates, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 01/29] Fix configure for s390 qemu on alpine and other busybox environments, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 03/29] s390x/flic: simplify flic initialization, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 02/29] s390x/tcg: deliver multiple interrupts in a row,
Cornelia Huck <=
- [qemu-s390x] [PULL 04/29] s390x/tcg: simplify lookup of flic, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 08/29] s390x/tcg: tolerate wrong wakeups due to floating interrupts, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 07/29] s390x/flic: no need to call s390_io_interrupt() from flic, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 06/29] s390x/flic: factor out injection of floating interrupts, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 11/29] s390x/flic: implement qemu_s390_clear_io_flic(), Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 05/29] s390x/tcg: simplify machine check handling, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 10/29] s390x/tcg: implement TEST PENDING INTERRUPTION, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 12/29] s390x/flic: optimize CPU wakeup for TCG, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 09/29] s390x/flic: make floating interrupts on TCG actually floating, Cornelia Huck, 2018/02/09
- [qemu-s390x] [PULL 13/29] s390x: fix size + content of STSI blocks, Cornelia Huck, 2018/02/09