From: David Hildenbrand <david@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
thuth@redhat.com, cohuck@redhat.com, david@redhat.com,
borntraeger@de.ibm.com, "Alexander Graf" <agraf@suse.de>,
"Igor Mammedov" <imammedo@redhat.com>,
"Aurelien Jarno" <aurelien@aurel32.net>,
"Matthew Rosato" <mjrosato@linux.vnet.ibm.com>,
"Alex Bennée" <alex.bennee@linaro.org>
Subject: [Qemu-devel] [PATCH v1 23/27] s390x/tcg: implement STOP and RESET interrupts for TCG
Date: Mon, 18 Sep 2017 18:00:08 +0200 [thread overview]
Message-ID: <20170918160012.4317-24-david@redhat.com> (raw)
In-Reply-To: <20170918160012.4317-1-david@redhat.com>
Implement them like KVM implements/handles them. Both can only be
triggered via SIGP instructions. RESET has (almos)the lowest priority if
the CPU is running, and the highest if the CPU is STOPPED. This is handled
in SIGP code already. On delivery, we only have to care about the
"CPU running" scenario.
STOP is defined to be delivered after all other interrupts have been
delivered. Therefore it has the actual lowest priority.
As both can wake up a CPU if sleeping, indicate them correctly to
external code (e.g. cpu_has_work()).
Signed-off-by: David Hildenbrand <david@redhat.com>
---
target/s390x/cpu.c | 4 +++-
target/s390x/cpu.h | 4 ++++
target/s390x/excp_helper.c | 18 +++++++++++++++++-
target/s390x/helper.c | 1 +
target/s390x/interrupt.c | 14 ++++++++++----
target/s390x/sigp.c | 1 +
6 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 9a01f591b6..9d20434075 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -65,7 +65,9 @@ static bool s390_cpu_has_work(CPUState *cs)
}
return (cs->interrupt_request & CPU_INTERRUPT_HARD) &&
- (env->psw.mask & PSW_MASK_EXT);
+ ((env->psw.mask & PSW_MASK_EXT) ||
+ env->pending_int & INTERRUPT_STOP ||
+ env->pending_int & INTERRUPT_RESTART);
}
#if !defined(CONFIG_USER_ONLY)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 97d4abb6c0..fc1f622c52 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -399,6 +399,8 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,
#define EXCP_EXT 1 /* external interrupt */
#define EXCP_SVC 2 /* supervisor call (syscall) */
#define EXCP_PGM 3 /* program interruption */
+#define EXCP_RESTART 4 /* restart interrupt */
+#define EXCP_STOP 5 /* stop interrupt */
#define EXCP_IO 7 /* I/O interrupt */
#define EXCP_MCHK 8 /* machine check */
@@ -409,6 +411,8 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,
#define INTERRUPT_EXT_CLOCK_COMPARATOR (1 << 4)
#define INTERRUPT_EXTERNAL_CALL (1 << 5)
#define INTERRUPT_EMERGENCY_SIGNAL (1 << 6)
+#define INTERRUPT_RESTART (1 << 7)
+#define INTERRUPT_STOP (1 << 8)
#define INTERRUPT_EXT (INTERRUPT_EXT_FLOATING | \
INTERRUPT_EXT_CPU_TIMER | \
INTERRUPT_EXT_CLOCK_COMPARATOR | \
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index 4dc30e056a..ce28708499 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -452,6 +452,14 @@ void s390_cpu_do_interrupt(CPUState *cs)
cs->exception_index = EXCP_IO;
}
}
+ /* RESTART interrupt */
+ if (cs->exception_index == -1 && env->pending_int & INTERRUPT_RESTART) {
+ cs->exception_index = EXCP_RESTART;
+ }
+ /* STOP interrupt has least priority */
+ if (cs->exception_index == -1 && env->pending_int & INTERRUPT_STOP) {
+ cs->exception_index = EXCP_STOP;
+ }
switch (cs->exception_index) {
case EXCP_PGM:
@@ -469,6 +477,12 @@ void s390_cpu_do_interrupt(CPUState *cs)
case EXCP_MCHK:
do_mchk_interrupt(env);
break;
+ case EXCP_RESTART:
+ do_restart_interrupt(env);
+ break;
+ case EXCP_STOP:
+ do_stop_interrupt(env);
+ break;
}
cs->exception_index = -1;
@@ -488,7 +502,9 @@ bool s390_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
the parent EXECUTE insn. */
return false;
}
- if (env->psw.mask & PSW_MASK_EXT) {
+ if (env->psw.mask & PSW_MASK_EXT ||
+ env->pending_int & INTERRUPT_STOP ||
+ env->pending_int & INTERRUPT_RESTART) {
s390_cpu_do_interrupt(cs);
return true;
}
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index 4d5a92c2ca..abda74d810 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -202,6 +202,7 @@ void do_restart_interrupt(CPUS390XState *env)
addr = be64_to_cpu(lowcore->restart_new_psw.addr);
cpu_unmap_lowcore(lowcore);
+ env->pending_int &= ~INTERRUPT_RESTART;
load_psw(env, mask, addr);
}
diff --git a/target/s390x/interrupt.c b/target/s390x/interrupt.c
index b1dc28c8dd..2f004ffe6d 100644
--- a/target/s390x/interrupt.c
+++ b/target/s390x/interrupt.c
@@ -119,22 +119,28 @@ int cpu_inject_external_call(S390CPU *cpu, uint16_t src_cpu_addr)
void cpu_inject_restart(S390CPU *cpu)
{
+ CPUS390XState *env = &cpu->env;
+
if (kvm_enabled()) {
kvm_s390_restart_interrupt(cpu);
return;
}
- /* FIXME TCG */
- g_assert_not_reached();
+
+ env->pending_int |= INTERRUPT_RESTART;
+ cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);
}
void cpu_inject_stop(S390CPU *cpu)
{
+ CPUS390XState *env = &cpu->env;
+
if (kvm_enabled()) {
kvm_s390_stop_interrupt(cpu);
return;
}
- /* FIXME TCG */
- g_assert_not_reached();
+
+ env->pending_int |= INTERRUPT_STOP;
+ cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);
}
static void cpu_inject_io(S390CPU *cpu, uint16_t subchannel_id,
diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
index ce8fda9d01..521dcc75f3 100644
--- a/target/s390x/sigp.c
+++ b/target/s390x/sigp.c
@@ -498,6 +498,7 @@ void do_stop_interrupt(CPUS390XState *env)
s390_store_status(cpu, S390_STORE_STATUS_DEF_ADDR, true);
}
env->sigp_order = 0;
+ env->pending_int &= ~INTERRUPT_STOP;
}
void s390_init_sigp(void)
--
2.13.5
next prev parent reply other threads:[~2017-09-18 16:02 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-18 15:59 [Qemu-devel] [PATCH v1 00/27] s390x: SMP for TCG (+ cleanups) David Hildenbrand
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 01/27] s390x: raise CPU hotplug irq after really hotplugged David Hildenbrand
2017-09-25 7:18 ` Christian Borntraeger
2017-09-25 23:10 ` Richard Henderson
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 02/27] s390x/cpumodel: fix max STFL(E) bit number David Hildenbrand
2017-09-25 8:14 ` Christian Borntraeger
2017-09-25 9:18 ` Thomas Huth
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 03/27] target/s390x: get rid of next_core_id David Hildenbrand
2017-09-21 13:28 ` Igor Mammedov
2017-09-25 23:14 ` Richard Henderson
2017-09-26 8:49 ` Igor Mammedov
2017-09-26 12:40 ` David Hildenbrand
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 04/27] s390x: introduce and use S390_MAX_CPUS David Hildenbrand
2017-09-25 10:08 ` Thomas Huth
2017-09-25 23:14 ` Richard Henderson
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 05/27] s390/tcg: turn INTERRUPT_EXT into a mask David Hildenbrand
2017-09-25 23:18 ` Richard Henderson
2017-09-28 19:08 ` David Hildenbrand
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 06/27] s390x/tcg: injection of emergency signals and extarnal calls David Hildenbrand
2017-09-25 13:16 ` David Hildenbrand
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 07/27] s390x/tcg: STOPPED cpus can never wake up David Hildenbrand
2017-09-25 23:20 ` Richard Henderson
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 08/27] s390x/tcg: a CPU cannot switch state due to an interrupt David Hildenbrand
2017-09-25 23:20 ` Richard Henderson
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 09/27] target/s390x: factor out handling of WAIT PSW into handle_wait() David Hildenbrand
2017-09-25 10:22 ` Thomas Huth
2017-09-26 13:04 ` David Hildenbrand
2017-09-25 23:23 ` Richard Henderson
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 10/27] s390x/kvm: pass ipb directly into handle_sigp() David Hildenbrand
2017-09-25 10:27 ` Thomas Huth
2017-09-25 23:24 ` Richard Henderson
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 11/27] s390x/kvm: generalize SIGP stop and restart interrupt injection David Hildenbrand
2017-09-25 23:29 ` Richard Henderson
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 12/27] s390x/kvm: factor out storing of CPU status David Hildenbrand
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 13/27] target/s390x: proper cpu->be convertion in s390_store_status() David Hildenbrand
2017-09-18 15:59 ` [Qemu-devel] [PATCH v1 14/27] s390x/kvm: factor out storing of adtl CPU status David Hildenbrand
2017-09-25 23:31 ` Richard Henderson
2017-09-25 23:41 ` Richard Henderson
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 15/27] s390x/kvm: drop two debug prints David Hildenbrand
2017-09-25 10:32 ` Thomas Huth
2017-09-25 23:41 ` Richard Henderson
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 16/27] s390x/kvm: factor out SIGP code into sigp.c David Hildenbrand
2017-09-18 17:25 ` Christian Borntraeger
2017-09-18 18:14 ` David Hildenbrand
2017-09-25 23:49 ` Richard Henderson
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 17/27] s390x/kvm: factor out actual handling of STOP interrupts David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 18/27] s390x/tcg: implement SIGP SENSE RUNNING STATUS David Hildenbrand
2017-09-25 12:47 ` Thomas Huth
2017-09-25 12:51 ` David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 19/27] s390x/tcg: implement SIGP SENSE David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 20/27] s390x/tcg: implement SIGP EXTERNAL CALL David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 21/27] s390x/tcg: implement SIGP EMERGENCY SIGNAL David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 22/27] s390x/tcg: implement SIGP CONDITIONAL " David Hildenbrand
2017-09-18 16:00 ` David Hildenbrand [this message]
2017-09-18 20:00 ` [Qemu-devel] [PATCH v1 23/27] s390x/tcg: implement STOP and RESET interrupts for TCG David Hildenbrand
2017-09-18 20:21 ` David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 24/27] s390x/tcg: flush the tlb on SIGP SET PREFIX David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 25/27] s390x/tcg: switch to new SIGP handling code David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 26/27] s390x/tcg: unlock NMI David Hildenbrand
2017-09-18 16:00 ` [Qemu-devel] [PATCH v1 27/27] s390x/tcg: refactor stfl(e) to use s390_get_feat_block() David Hildenbrand
2017-09-18 17:31 ` [Qemu-devel] [PATCH v1 00/27] s390x: SMP for TCG (+ cleanups) Christian Borntraeger
2017-09-18 18:28 ` David Hildenbrand
2017-09-21 13:07 ` David Hildenbrand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170918160012.4317-24-david@redhat.com \
--to=david@redhat.com \
--cc=agraf@suse.de \
--cc=alex.bennee@linaro.org \
--cc=aurelien@aurel32.net \
--cc=borntraeger@de.ibm.com \
--cc=cohuck@redhat.com \
--cc=imammedo@redhat.com \
--cc=mjrosato@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).