{"id":815024,"url":"http://patchwork.ozlabs.org/api/patches/815024/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170918160012.4317-24-david@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170918160012.4317-24-david@redhat.com>","list_archive_url":null,"date":"2017-09-18T16:00:08","name":"[v1,23/27] s390x/tcg: implement STOP and RESET interrupts for TCG","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"fcb084fd50a9ee0b88c669b928394c697a70efc1","submitter":{"id":70402,"url":"http://patchwork.ozlabs.org/api/people/70402/?format=json","name":"David Hildenbrand","email":"david@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170918160012.4317-24-david@redhat.com/mbox/","series":[{"id":3672,"url":"http://patchwork.ozlabs.org/api/series/3672/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=3672","date":"2017-09-18T15:59:45","name":"s390x: SMP for TCG (+ cleanups)","version":1,"mbox":"http://patchwork.ozlabs.org/series/3672/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/815024/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/815024/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=208.118.235.17; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx08.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx08.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=david@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [208.118.235.17])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xwrrK0SWdz9s78\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 19 Sep 2017 02:22:24 +1000 (AEST)","from localhost ([::1]:37675 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dtyoQ-0008Rh-Ni\n\tfor incoming@patchwork.ozlabs.org; Mon, 18 Sep 2017 12:22:22 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:37984)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <david@redhat.com>) id 1dtyUq-0007os-AO\n\tfor qemu-devel@nongnu.org; Mon, 18 Sep 2017 12:02:14 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <david@redhat.com>) id 1dtyUk-0008JR-ER\n\tfor qemu-devel@nongnu.org; Mon, 18 Sep 2017 12:02:08 -0400","from mx1.redhat.com ([209.132.183.28]:59878)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <david@redhat.com>) id 1dtyUk-0008Iy-7B\n\tfor qemu-devel@nongnu.org; Mon, 18 Sep 2017 12:02:02 -0400","from smtp.corp.redhat.com\n\t(int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 30F7AC05178E;\n\tMon, 18 Sep 2017 16:02:01 +0000 (UTC)","from t460s.redhat.com (unknown [10.36.118.72])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id C52B15D6A8;\n\tMon, 18 Sep 2017 16:01:58 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com 30F7AC05178E","From":"David Hildenbrand <david@redhat.com>","To":"qemu-devel@nongnu.org","Date":"Mon, 18 Sep 2017 18:00:08 +0200","Message-Id":"<20170918160012.4317-24-david@redhat.com>","In-Reply-To":"<20170918160012.4317-1-david@redhat.com>","References":"<20170918160012.4317-1-david@redhat.com>","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.15","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.32]);\n\tMon, 18 Sep 2017 16:02:01 +0000 (UTC)","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","Subject":"[Qemu-devel] [PATCH v1 23/27] s390x/tcg: implement STOP and RESET\n\tinterrupts for TCG","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Matthew Rosato <mjrosato@linux.vnet.ibm.com>, thuth@redhat.com,\n\tdavid@redhat.com, cohuck@redhat.com, Richard Henderson\n\t<richard.henderson@linaro.org>, Alexander Graf <agraf@suse.de>,\n\tborntraeger@de.ibm.com, \tIgor Mammedov <imammedo@redhat.com>,\n\t=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n\tAurelien Jarno <aurelien@aurel32.net>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"Implement them like KVM implements/handles them. Both can only be\ntriggered via SIGP instructions. RESET has (almos)the lowest priority if\nthe CPU is running, and the highest if the CPU is STOPPED. This is handled\nin SIGP code already. On delivery, we only have to care about the\n\"CPU running\" scenario.\n\nSTOP is defined to be delivered after all other interrupts have been\ndelivered. Therefore it has the actual lowest priority.\n\nAs both can wake up a CPU if sleeping, indicate them correctly to\nexternal code (e.g. cpu_has_work()).\n\nSigned-off-by: David Hildenbrand <david@redhat.com>\n---\n target/s390x/cpu.c         |  4 +++-\n target/s390x/cpu.h         |  4 ++++\n target/s390x/excp_helper.c | 18 +++++++++++++++++-\n target/s390x/helper.c      |  1 +\n target/s390x/interrupt.c   | 14 ++++++++++----\n target/s390x/sigp.c        |  1 +\n 6 files changed, 36 insertions(+), 6 deletions(-)","diff":"diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c\nindex 9a01f591b6..9d20434075 100644\n--- a/target/s390x/cpu.c\n+++ b/target/s390x/cpu.c\n@@ -65,7 +65,9 @@ static bool s390_cpu_has_work(CPUState *cs)\n     }\n \n     return (cs->interrupt_request & CPU_INTERRUPT_HARD) &&\n-           (env->psw.mask & PSW_MASK_EXT);\n+            ((env->psw.mask & PSW_MASK_EXT) ||\n+             env->pending_int & INTERRUPT_STOP ||\n+             env->pending_int & INTERRUPT_RESTART);\n }\n \n #if !defined(CONFIG_USER_ONLY)\ndiff --git a/target/s390x/cpu.h b/target/s390x/cpu.h\nindex 97d4abb6c0..fc1f622c52 100644\n--- a/target/s390x/cpu.h\n+++ b/target/s390x/cpu.h\n@@ -399,6 +399,8 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,\n #define EXCP_EXT 1 /* external interrupt */\n #define EXCP_SVC 2 /* supervisor call (syscall) */\n #define EXCP_PGM 3 /* program interruption */\n+#define EXCP_RESTART 4 /* restart interrupt */\n+#define EXCP_STOP 5 /* stop interrupt */\n #define EXCP_IO  7 /* I/O interrupt */\n #define EXCP_MCHK 8 /* machine check */\n \n@@ -409,6 +411,8 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,\n #define INTERRUPT_EXT_CLOCK_COMPARATOR   (1 << 4)\n #define INTERRUPT_EXTERNAL_CALL          (1 << 5)\n #define INTERRUPT_EMERGENCY_SIGNAL       (1 << 6)\n+#define INTERRUPT_RESTART                (1 << 7)\n+#define INTERRUPT_STOP                   (1 << 8)\n #define INTERRUPT_EXT                    (INTERRUPT_EXT_FLOATING | \\\n                                           INTERRUPT_EXT_CPU_TIMER | \\\n                                           INTERRUPT_EXT_CLOCK_COMPARATOR | \\\ndiff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c\nindex 4dc30e056a..ce28708499 100644\n--- a/target/s390x/excp_helper.c\n+++ b/target/s390x/excp_helper.c\n@@ -452,6 +452,14 @@ void s390_cpu_do_interrupt(CPUState *cs)\n             cs->exception_index = EXCP_IO;\n         }\n     }\n+    /* RESTART interrupt */\n+    if (cs->exception_index == -1 && env->pending_int & INTERRUPT_RESTART) {\n+        cs->exception_index = EXCP_RESTART;\n+    }\n+    /* STOP interrupt has least priority */\n+    if (cs->exception_index == -1 && env->pending_int & INTERRUPT_STOP) {\n+        cs->exception_index = EXCP_STOP;\n+    }\n \n     switch (cs->exception_index) {\n     case EXCP_PGM:\n@@ -469,6 +477,12 @@ void s390_cpu_do_interrupt(CPUState *cs)\n     case EXCP_MCHK:\n         do_mchk_interrupt(env);\n         break;\n+    case EXCP_RESTART:\n+        do_restart_interrupt(env);\n+        break;\n+    case EXCP_STOP:\n+        do_stop_interrupt(env);\n+        break;\n     }\n     cs->exception_index = -1;\n \n@@ -488,7 +502,9 @@ bool s390_cpu_exec_interrupt(CPUState *cs, int interrupt_request)\n                the parent EXECUTE insn.  */\n             return false;\n         }\n-        if (env->psw.mask & PSW_MASK_EXT) {\n+        if (env->psw.mask & PSW_MASK_EXT ||\n+            env->pending_int & INTERRUPT_STOP ||\n+            env->pending_int & INTERRUPT_RESTART) {\n             s390_cpu_do_interrupt(cs);\n             return true;\n         }\ndiff --git a/target/s390x/helper.c b/target/s390x/helper.c\nindex 4d5a92c2ca..abda74d810 100644\n--- a/target/s390x/helper.c\n+++ b/target/s390x/helper.c\n@@ -202,6 +202,7 @@ void do_restart_interrupt(CPUS390XState *env)\n     addr = be64_to_cpu(lowcore->restart_new_psw.addr);\n \n     cpu_unmap_lowcore(lowcore);\n+    env->pending_int &= ~INTERRUPT_RESTART;\n \n     load_psw(env, mask, addr);\n }\ndiff --git a/target/s390x/interrupt.c b/target/s390x/interrupt.c\nindex b1dc28c8dd..2f004ffe6d 100644\n--- a/target/s390x/interrupt.c\n+++ b/target/s390x/interrupt.c\n@@ -119,22 +119,28 @@ int cpu_inject_external_call(S390CPU *cpu, uint16_t src_cpu_addr)\n \n void cpu_inject_restart(S390CPU *cpu)\n {\n+    CPUS390XState *env = &cpu->env;\n+\n     if (kvm_enabled()) {\n         kvm_s390_restart_interrupt(cpu);\n         return;\n     }\n-    /* FIXME TCG */\n-    g_assert_not_reached();\n+\n+    env->pending_int |= INTERRUPT_RESTART;\n+    cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);\n }\n \n void cpu_inject_stop(S390CPU *cpu)\n {\n+    CPUS390XState *env = &cpu->env;\n+\n     if (kvm_enabled()) {\n         kvm_s390_stop_interrupt(cpu);\n         return;\n     }\n-    /* FIXME TCG */\n-    g_assert_not_reached();\n+\n+    env->pending_int |= INTERRUPT_STOP;\n+    cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);\n }\n \n static void cpu_inject_io(S390CPU *cpu, uint16_t subchannel_id,\ndiff --git a/target/s390x/sigp.c b/target/s390x/sigp.c\nindex ce8fda9d01..521dcc75f3 100644\n--- a/target/s390x/sigp.c\n+++ b/target/s390x/sigp.c\n@@ -498,6 +498,7 @@ void do_stop_interrupt(CPUS390XState *env)\n         s390_store_status(cpu, S390_STORE_STATUS_DEF_ADDR, true);\n     }\n     env->sigp_order = 0;\n+    env->pending_int &= ~INTERRUPT_STOP;\n }\n \n void s390_init_sigp(void)\n","prefixes":["v1","23/27"]}