Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/815001/?format=api
{ "id": 815001, "url": "http://patchwork.ozlabs.org/api/patches/815001/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170918160012.4317-6-david@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "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-6-david@redhat.com>", "list_archive_url": null, "date": "2017-09-18T15:59:50", "name": "[v1,05/27] s390/tcg: turn INTERRUPT_EXT into a mask", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "50ecf4dc1e5c7912b9933f490a950047f912c762", "submitter": { "id": 70402, "url": "http://patchwork.ozlabs.org/api/people/70402/?format=api", "name": "David Hildenbrand", "email": "david@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170918160012.4317-6-david@redhat.com/mbox/", "series": [ { "id": 3672, "url": "http://patchwork.ozlabs.org/api/series/3672/?format=api", "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/815001/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/815001/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=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)", "ext-mx03.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx03.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=david@redhat.com" ], "Received": [ "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\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 3xwrTD1q2sz9s78\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 19 Sep 2017 02:05:52 +1000 (AEST)", "from localhost ([::1]:37595 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 1dtyYQ-0001wo-Ae\n\tfor incoming@patchwork.ozlabs.org; Mon, 18 Sep 2017 12:05:50 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:37345)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <david@redhat.com>) id 1dtyTr-0006u7-Od\n\tfor qemu-devel@nongnu.org; Mon, 18 Sep 2017 12:01:14 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <david@redhat.com>) id 1dtyTl-0007nr-L4\n\tfor qemu-devel@nongnu.org; Mon, 18 Sep 2017 12:01:07 -0400", "from mx1.redhat.com ([209.132.183.28]:47514)\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 1dtyTl-0007nC-DW\n\tfor qemu-devel@nongnu.org; Mon, 18 Sep 2017 12:01:01 -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 4FD107E43B;\n\tMon, 18 Sep 2017 16:01:00 +0000 (UTC)", "from t460s.redhat.com (unknown [10.36.118.72])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id D40CC5D6A8;\n\tMon, 18 Sep 2017 16:00:57 +0000 (UTC)" ], "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 4FD107E43B", "From": "David Hildenbrand <david@redhat.com>", "To": "qemu-devel@nongnu.org", "Date": "Mon, 18 Sep 2017 17:59:50 +0200", "Message-Id": "<20170918160012.4317-6-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.27]);\n\tMon, 18 Sep 2017 16:01:00 +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 05/27] s390/tcg: turn INTERRUPT_EXT into a\n\tmask", "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": "External interrupts are currently all handled like floating external\ninterrupts, they are queued. Let's prepare for a split of floating\nand local interrupts by turning INTERRUPT_EXT into a mask.\n\nWhile we can have various floating external interrupts of one kind, there\nis usually only one (or a fixed number) of the local external interrupts.\n\nSo turn INTERRUPT_EXT into a mask and properly indicate the kind of\nexternal interrupt. Floating interrupts will have to moved out of\none CPU instance later once we have SMP support.\n\nThis get's rid of the ugly special handling for cpu timer and clock\ncomparator interrupts. And we really only store the parameters as\ndefined by the PoP.\n\nWe'll introduce external calls and emergency signals in the following\npatches.\n\nSigned-off-by: David Hildenbrand <david@redhat.com>\n---\n target/s390x/cpu.h | 13 ++++++----\n target/s390x/excp_helper.c | 65 ++++++++++++++++++++++++----------------------\n target/s390x/helper.c | 12 ++-------\n target/s390x/internal.h | 2 ++\n target/s390x/interrupt.c | 18 ++++++++++++-\n 5 files changed, 63 insertions(+), 47 deletions(-)", "diff": "diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h\nindex 5f539b1057..d4e2aa2f24 100644\n--- a/target/s390x/cpu.h\n+++ b/target/s390x/cpu.h\n@@ -400,11 +400,14 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,\n #define EXCP_IO 7 /* I/O interrupt */\n #define EXCP_MCHK 8 /* machine check */\n \n-#define INTERRUPT_EXT (1 << 0)\n-#define INTERRUPT_TOD (1 << 1)\n-#define INTERRUPT_CPUTIMER (1 << 2)\n-#define INTERRUPT_IO (1 << 3)\n-#define INTERRUPT_MCHK (1 << 4)\n+#define INTERRUPT_IO (1 << 0)\n+#define INTERRUPT_MCHK (1 << 1)\n+#define INTERRUPT_EXT_FLOATING (1 << 2)\n+#define INTERRUPT_EXT_CPU_TIMER (1 << 3)\n+#define INTERRUPT_EXT_CLOCK_COMPARATOR (1 << 4)\n+#define INTERRUPT_EXT (INTERRUPT_EXT_FLOATING | \\\n+ INTERRUPT_EXT_CPU_TIMER | \\\n+ INTERRUPT_EXT_CLOCK_COMPARATOR)\n \n /* Program Status Word. */\n #define S390_PSWM_REGNUM 0\ndiff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c\nindex 470cf8f5bc..46d015f260 100644\n--- a/target/s390x/excp_helper.c\n+++ b/target/s390x/excp_helper.c\n@@ -238,29 +238,44 @@ static void do_ext_interrupt(CPUS390XState *env)\n cpu_abort(CPU(cpu), \"Ext int w/o ext mask\\n\");\n }\n \n- if (env->ext_index < 0 || env->ext_index >= MAX_EXT_QUEUE) {\n- cpu_abort(CPU(cpu), \"Ext queue overrun: %d\\n\", env->ext_index);\n- }\n-\n- q = &env->ext_queue[env->ext_index];\n lowcore = cpu_map_lowcore(env);\n \n- lowcore->ext_int_code = cpu_to_be16(q->code);\n- lowcore->ext_params = cpu_to_be32(q->param);\n- lowcore->ext_params2 = cpu_to_be64(q->param64);\n- lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(env));\n- lowcore->external_old_psw.addr = cpu_to_be64(env->psw.addr);\n- lowcore->cpu_addr = cpu_to_be16(env->core_id | VIRTIO_SUBCODE_64);\n+ if (env->pending_int & INTERRUPT_EXT_CLOCK_COMPARATOR) {\n+ lowcore->ext_int_code = cpu_to_be16(EXT_CLOCK_COMP);\n+ lowcore->cpu_addr = 0;\n+ env->pending_int &= ~INTERRUPT_EXT_CLOCK_COMPARATOR;\n+ } else if (env->pending_int & INTERRUPT_EXT_CPU_TIMER) {\n+ lowcore->ext_int_code = cpu_to_be16(EXT_CPU_TIMER);\n+ lowcore->cpu_addr = 0;\n+ env->pending_int &= ~INTERRUPT_EXT_CPU_TIMER;\n+ } else if (env->pending_int | INTERRUPT_EXT_FLOATING) {\n+ g_assert(env->ext_index >= 0);\n+ /*\n+ * FIXME: floating IRQs should be considered by all CPUs and\n+ * shuld not get cleared by CPU reset.\n+ */\n+ q = &env->ext_queue[env->ext_index];\n+ lowcore->ext_int_code = cpu_to_be16(q->code);\n+ lowcore->ext_params = cpu_to_be32(q->param);\n+ lowcore->ext_params2 = cpu_to_be64(q->param64);\n+ lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(env));\n+ lowcore->external_old_psw.addr = cpu_to_be64(env->psw.addr);\n+ lowcore->cpu_addr = cpu_to_be16(env->core_id | VIRTIO_SUBCODE_64);\n+ env->ext_index--;\n+ if (env->ext_index == -1) {\n+ env->pending_int &= ~INTERRUPT_EXT_FLOATING;\n+ }\n+ } else {\n+ g_assert_not_reached();\n+ }\n+\n mask = be64_to_cpu(lowcore->external_new_psw.mask);\n addr = be64_to_cpu(lowcore->external_new_psw.addr);\n+ lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(env));\n+ lowcore->external_old_psw.addr = cpu_to_be64(env->psw.addr);\n \n cpu_unmap_lowcore(lowcore);\n \n- env->ext_index--;\n- if (env->ext_index == -1) {\n- env->pending_int &= ~INTERRUPT_EXT;\n- }\n-\n DPRINTF(\"%s: %\" PRIx64 \" %\" PRIx64 \"\\n\", __func__,\n env->psw.mask, env->psw.addr);\n \n@@ -413,21 +428,9 @@ void s390_cpu_do_interrupt(CPUState *cs)\n }\n /* handle external interrupts */\n if ((env->psw.mask & PSW_MASK_EXT) &&\n- cs->exception_index == -1) {\n- if (env->pending_int & INTERRUPT_EXT) {\n- /* code is already in env */\n- cs->exception_index = EXCP_EXT;\n- } else if (env->pending_int & INTERRUPT_TOD) {\n- cpu_inject_ext(cpu, 0x1004, 0, 0);\n- cs->exception_index = EXCP_EXT;\n- env->pending_int &= ~INTERRUPT_EXT;\n- env->pending_int &= ~INTERRUPT_TOD;\n- } else if (env->pending_int & INTERRUPT_CPUTIMER) {\n- cpu_inject_ext(cpu, 0x1005, 0, 0);\n- cs->exception_index = EXCP_EXT;\n- env->pending_int &= ~INTERRUPT_EXT;\n- env->pending_int &= ~INTERRUPT_TOD;\n- }\n+ cs->exception_index == -1 &&\n+ (env->pending_int & INTERRUPT_EXT)) {\n+ cs->exception_index = EXCP_EXT;\n }\n /* handle I/O interrupts */\n if ((env->psw.mask & PSW_MASK_IO) &&\ndiff --git a/target/s390x/helper.c b/target/s390x/helper.c\nindex 97adbcc86d..e22b93258b 100644\n--- a/target/s390x/helper.c\n+++ b/target/s390x/helper.c\n@@ -51,20 +51,12 @@\n #ifndef CONFIG_USER_ONLY\n void s390x_tod_timer(void *opaque)\n {\n- S390CPU *cpu = opaque;\n- CPUS390XState *env = &cpu->env;\n-\n- env->pending_int |= INTERRUPT_TOD;\n- cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);\n+ cpu_inject_clock_comparator((S390CPU *) opaque);\n }\n \n void s390x_cpu_timer(void *opaque)\n {\n- S390CPU *cpu = opaque;\n- CPUS390XState *env = &cpu->env;\n-\n- env->pending_int |= INTERRUPT_CPUTIMER;\n- cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);\n+ cpu_inject_cpu_timer((S390CPU *) opaque);\n }\n #endif\n \ndiff --git a/target/s390x/internal.h b/target/s390x/internal.h\nindex bc8f83129a..ae4b27a574 100644\n--- a/target/s390x/internal.h\n+++ b/target/s390x/internal.h\n@@ -348,6 +348,8 @@ void cpu_unmap_lowcore(LowCore *lowcore);\n void trigger_pgm_exception(CPUS390XState *env, uint32_t code, uint32_t ilen);\n void cpu_inject_ext(S390CPU *cpu, uint32_t code, uint32_t param,\n uint64_t param64);\n+void cpu_inject_clock_comparator(S390CPU *cpu);\n+void cpu_inject_cpu_timer(S390CPU *cpu);\n \n \n /* ioinst.c */\ndiff --git a/target/s390x/interrupt.c b/target/s390x/interrupt.c\nindex 058e219fe5..4ba33c49cb 100644\n--- a/target/s390x/interrupt.c\n+++ b/target/s390x/interrupt.c\n@@ -71,7 +71,23 @@ void cpu_inject_ext(S390CPU *cpu, uint32_t code, uint32_t param,\n env->ext_queue[env->ext_index].param = param;\n env->ext_queue[env->ext_index].param64 = param64;\n \n- env->pending_int |= INTERRUPT_EXT;\n+ env->pending_int |= INTERRUPT_EXT_FLOATING;\n+ cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);\n+}\n+\n+void cpu_inject_clock_comparator(S390CPU *cpu)\n+{\n+ CPUS390XState *env = &cpu->env;\n+\n+ env->pending_int |= INTERRUPT_EXT_CLOCK_COMPARATOR;\n+ cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);\n+}\n+\n+void cpu_inject_cpu_timer(S390CPU *cpu)\n+{\n+ CPUS390XState *env = &cpu->env;\n+\n+ env->pending_int |= INTERRUPT_EXT_CPU_TIMER;\n cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);\n }\n \n", "prefixes": [ "v1", "05/27" ] }