All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: qemu-s390x@nongnu.org, qemu-devel@nongnu.org
Cc: Christian Borntraeger <borntraeger@de.ibm.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Richard Henderson <rth@twiddle.net>,
	Alexander Graf <agraf@suse.de>, Thomas Huth <thuth@redhat.com>,
	David Hildenbrand <david@redhat.com>
Subject: [Qemu-devel] [PATCH v2 04/18] s390x/tcg: simplify machine check handling
Date: Wed, 17 Jan 2018 18:40:33 +0100	[thread overview]
Message-ID: <20180117174047.6382-5-david@redhat.com> (raw)
In-Reply-To: <20180117174047.6382-1-david@redhat.com>

We currently only support CRW machine checks. This is a preparation for
real floating interrupt support.

Get rid of the queue and handle it via the bit INTERRUPT_MCHK. We don't
rename it for now, as it will be soon gone (when moving crw machine checks
into the flic).

Please note that this is the same way also KVM handles it: only one
instance of a machine check can be pending at a time. So no need for a
queue.

While at it, make sure we try to deliver only if env->cregs[14]
actually indicates that CRWs are accepted.

Drop two unused defines on the way (we already have PSW_MASK_...).

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu.c         |  2 --
 target/s390x/cpu.h         | 10 ----------
 target/s390x/excp_helper.c | 29 +++++------------------------
 target/s390x/interrupt.c   | 18 +++++++-----------
 4 files changed, 12 insertions(+), 47 deletions(-)

diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index ae3cee91a2..bb4fc0f879 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -118,7 +118,6 @@ static void s390_cpu_initial_reset(CPUState *s)
     for (i = 0; i < ARRAY_SIZE(env->io_index); i++) {
         env->io_index[i] = -1;
     }
-    env->mchk_index = -1;
 
     /* tininess for underflow is detected before rounding */
     set_float_detect_tininess(float_tininess_before_rounding,
@@ -155,7 +154,6 @@ static void s390_cpu_full_reset(CPUState *s)
     for (i = 0; i < ARRAY_SIZE(env->io_index); i++) {
         env->io_index[i] = -1;
     }
-    env->mchk_index = -1;
 
     /* tininess for underflow is detected before rounding */
     set_float_detect_tininess(float_tininess_before_rounding,
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 1a8b6b9ae9..85f4e6b758 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -54,10 +54,6 @@
 #define MMU_USER_IDX 0
 
 #define MAX_IO_QUEUE 16
-#define MAX_MCHK_QUEUE 16
-
-#define PSW_MCHK_MASK 0x0004000000000000
-#define PSW_IO_MASK 0x0200000000000000
 
 #define S390_MAX_CPUS 248
 
@@ -73,10 +69,6 @@ typedef struct IOIntQueue {
     uint32_t word;
 } IOIntQueue;
 
-typedef struct MchkQueue {
-    uint16_t type;
-} MchkQueue;
-
 struct CPUS390XState {
     uint64_t regs[16];     /* GP registers */
     /*
@@ -122,14 +114,12 @@ struct CPUS390XState {
     uint64_t cregs[16]; /* control registers */
 
     IOIntQueue io_queue[MAX_IO_QUEUE][8];
-    MchkQueue mchk_queue[MAX_MCHK_QUEUE];
 
     int pending_int;
     uint32_t service_param;
     uint16_t external_call_addr;
     DECLARE_BITMAP(emergency_signals, S390_MAX_CPUS);
     int io_index[8];
-    int mchk_index;
 
     uint64_t ckc;
     uint64_t cputm;
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index d024ac5fef..a18842ccbd 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -368,30 +368,16 @@ static void do_io_interrupt(CPUS390XState *env)
 
 static void do_mchk_interrupt(CPUS390XState *env)
 {
-    S390CPU *cpu = s390_env_get_cpu(env);
     uint64_t mask, addr;
     LowCore *lowcore;
-    MchkQueue *q;
     int i;
 
-    if (!(env->psw.mask & PSW_MASK_MCHECK)) {
-        cpu_abort(CPU(cpu), "Machine check w/o mchk mask\n");
-    }
+    /* for now we only support channel report machine checks (floating) */
+    g_assert(env->psw.mask & PSW_MASK_MCHECK);
+    g_assert(env->cregs[14] & CR0_SERVICE_SC);
 
-    if (env->mchk_index < 0 || env->mchk_index >= MAX_MCHK_QUEUE) {
-        cpu_abort(CPU(cpu), "Mchk queue overrun: %d\n", env->mchk_index);
-    }
-
-    q = &env->mchk_queue[env->mchk_index];
-
-    if (q->type != 1) {
-        /* Don't know how to handle this... */
-        cpu_abort(CPU(cpu), "Unknown machine check type %d\n", q->type);
-    }
-    if (!(env->cregs[14] & (1 << 28))) {
-        /* CRW machine checks disabled */
-        return;
-    }
+    g_assert(env->pending_int & INTERRUPT_MCHK);
+    env->pending_int &= ~INTERRUPT_MCHK;
 
     lowcore = cpu_map_lowcore(env);
 
@@ -418,11 +404,6 @@ static void do_mchk_interrupt(CPUS390XState *env)
 
     cpu_unmap_lowcore(lowcore);
 
-    env->mchk_index--;
-    if (env->mchk_index == -1) {
-        env->pending_int &= ~INTERRUPT_MCHK;
-    }
-
     DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__,
             env->psw.mask, env->psw.addr);
 
diff --git a/target/s390x/interrupt.c b/target/s390x/interrupt.c
index 39c026b8b5..380222b394 100644
--- a/target/s390x/interrupt.c
+++ b/target/s390x/interrupt.c
@@ -162,16 +162,6 @@ static void cpu_inject_crw_mchk(S390CPU *cpu)
 {
     CPUS390XState *env = &cpu->env;
 
-    if (env->mchk_index == MAX_MCHK_QUEUE - 1) {
-        /* ugh - can't queue anymore. Let's drop. */
-        return;
-    }
-
-    env->mchk_index++;
-    assert(env->mchk_index < MAX_MCHK_QUEUE);
-
-    env->mchk_queue[env->mchk_index].type = 1;
-
     env->pending_int |= INTERRUPT_MCHK;
     cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);
 }
@@ -225,7 +215,13 @@ bool s390_cpu_has_mcck_int(S390CPU *cpu)
         return false;
     }
 
-    return env->pending_int & INTERRUPT_MCHK;
+    /* for now we only support channel report machine checks (floating) */
+    if ((env->pending_int & INTERRUPT_MCHK) &&
+        (env->cregs[14] & CR14_CHANNEL_REPORT_SC)) {
+        return true;
+    }
+
+    return false;
 }
 
 bool s390_cpu_has_ext_int(S390CPU *cpu)
-- 
2.14.3

  parent reply	other threads:[~2018-01-17 17:41 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-17 17:40 [Qemu-devel] [PATCH v2 00/18] s390x: flic rework, tcg flic support and STSI David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 01/18] s390x/tcg: deliver multiple interrupts in a row David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 02/18] s390x/flic: simplify flic initialization David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 03/18] s390x/tcg: simplify lookup of flic David Hildenbrand
2018-01-17 17:40 ` David Hildenbrand [this message]
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 05/18] s390x/flic: factor out injection of floating interrupts David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 06/18] s390x/flic: no need to call s390_io_interrupt() from flic David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 07/18] s390x/tcg: tolerate wrong wakeups due to floating interrupts David Hildenbrand
2018-01-25 10:22   ` Cornelia Huck
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 08/18] s390x/flic: make floating interrupts on TCG actually floating David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 09/18] s390x/tcg: implement TEST PENDING INTERRUPTION David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 10/18] s390x/flic: implement qemu_s390_clear_io_flic() David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 11/18] s390x/flic: optimize CPU wakeup for TCG David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 12/18] s390x: fix size + content of STSI blocks David Hildenbrand
2018-01-25 10:26   ` Cornelia Huck
2018-01-25 13:15     ` David Hildenbrand
2018-01-25 13:51       ` Cornelia Huck
2018-01-29  9:42         ` [Qemu-devel] [qemu-s390x] " David Hildenbrand
2018-01-29  9:48           ` Cornelia Huck
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 13/18] s390x/tcg: STSI overhaul David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 14/18] s390x/tcg: remove SMP warning David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 15/18] configure: s390x supports mttcg now David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 16/18] s390x/tcg: cache the qemu flic in a central function David Hildenbrand
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 17/18] s390x/kvm: cache the kvm " David Hildenbrand
2018-01-25 11:03   ` Christian Borntraeger
2018-01-17 17:40 ` [Qemu-devel] [PATCH v2 18/18] s390x/flic: cache the common flic class " David Hildenbrand
2018-01-25 10:29 ` [Qemu-devel] [PATCH v2 00/18] s390x: flic rework, tcg flic support and STSI Cornelia Huck
2018-01-25 12:42 ` Cornelia Huck
2018-01-25 12:47   ` Cornelia Huck
2018-01-25 13:11     ` David Hildenbrand
2018-01-25 13:13       ` Thomas Huth

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=20180117174047.6382-5-david@redhat.com \
    --to=david@redhat.com \
    --cc=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=rth@twiddle.net \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.