qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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 27/27] s390x/tcg: refactor stfl(e) to use s390_get_feat_block()
Date: Mon, 18 Sep 2017 18:00:12 +0200	[thread overview]
Message-ID: <20170918160012.4317-28-david@redhat.com> (raw)
In-Reply-To: <20170918160012.4317-1-david@redhat.com>

Refactor it to use s390_get_feat_block(). Directly write into the mapped
lowcore with stfl and make sure it is really only compiled if needed.

While at it, add an alignment check for STFLE and avoid
potential_page_fault() by properly restoring the CPU state.

Due to s390_get_feat_block(), we will now also indicate the
"Configuration-z-architectural-mode", which is with new SIGP code the
right thing to do.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/helper.h      |  2 +-
 target/s390x/misc_helper.c | 72 ++++++++++++++++++++++------------------------
 target/s390x/translate.c   |  1 -
 3 files changed, 35 insertions(+), 40 deletions(-)

diff --git a/target/s390x/helper.h b/target/s390x/helper.h
index a0e4bfb850..a6d94d2d82 100644
--- a/target/s390x/helper.h
+++ b/target/s390x/helper.h
@@ -104,7 +104,6 @@ DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_NO_RWG_SE, i32, env, i32, i64, i64, i64)
 DEF_HELPER_FLAGS_2(sfpc, TCG_CALL_NO_RWG, void, env, i64)
 DEF_HELPER_FLAGS_2(sfas, TCG_CALL_NO_WG, void, env, i64)
 DEF_HELPER_FLAGS_1(popcnt, TCG_CALL_NO_RWG_SE, i64, i64)
-DEF_HELPER_FLAGS_1(stfl, TCG_CALL_NO_RWG, void, env)
 DEF_HELPER_2(stfle, i32, env, i64)
 DEF_HELPER_FLAGS_2(lpq, TCG_CALL_NO_WG, i64, env, i64)
 DEF_HELPER_FLAGS_4(stpq, TCG_CALL_NO_WG, void, env, i64, i64, i64)
@@ -152,6 +151,7 @@ DEF_HELPER_FLAGS_3(sturg, TCG_CALL_NO_WG, void, env, i64, i64)
 DEF_HELPER_1(per_check_exception, void, env)
 DEF_HELPER_FLAGS_3(per_branch, TCG_CALL_NO_RWG, void, env, i64, i64)
 DEF_HELPER_FLAGS_2(per_ifetch, TCG_CALL_NO_RWG, void, env, i64)
+DEF_HELPER_FLAGS_1(stfl, TCG_CALL_NO_RWG, void, env)
 
 DEF_HELPER_2(xsch, void, env, i64)
 DEF_HELPER_2(csch, void, env, i64)
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 1e4d3c8526..4afd90b969 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -475,61 +475,57 @@ void HELPER(per_ifetch)(CPUS390XState *env, uint64_t addr)
 }
 #endif
 
-/* The maximum bit defined at the moment is 129.  */
-#define MAX_STFL_WORDS  3
+static uint8_t stfl_bytes[2048];
+static unsigned int used_stfl_bytes;
 
-/* Canonicalize the current cpu's features into the 64-bit words required
-   by STFLE.  Return the index-1 of the max word that is non-zero.  */
-static unsigned do_stfle(CPUS390XState *env, uint64_t words[MAX_STFL_WORDS])
+static void prepare_stfl(void)
 {
-    S390CPU *cpu = s390_env_get_cpu(env);
-    const unsigned long *features = cpu->model->features;
-    unsigned max_bit = 0;
-    S390Feat feat;
-
-    memset(words, 0, sizeof(uint64_t) * MAX_STFL_WORDS);
+    static bool initialized;
+    int i;
 
-    if (test_bit(S390_FEAT_ZARCH, features)) {
-        /* z/Architecture is always active if around */
-        words[0] = 1ull << (63 - 2);
+    /* racy, but we don't care, the same values are always written */
+    if (initialized) {
+        return;
     }
 
-    for (feat = find_first_bit(features, S390_FEAT_MAX);
-         feat < S390_FEAT_MAX;
-         feat = find_next_bit(features, S390_FEAT_MAX, feat + 1)) {
-        const S390FeatDef *def = s390_feat_def(feat);
-        if (def->type == S390_FEAT_TYPE_STFL) {
-            unsigned bit = def->bit;
-            if (bit > max_bit) {
-                max_bit = bit;
-            }
-            assert(bit / 64 < MAX_STFL_WORDS);
-            words[bit / 64] |= 1ULL << (63 - bit % 64);
+    s390_get_feat_block(S390_FEAT_TYPE_STFL, stfl_bytes);
+    for (i = 0; i < sizeof(stfl_bytes); i++) {
+        if (stfl_bytes[i]) {
+            used_stfl_bytes = i + 1;
         }
     }
-
-    return max_bit / 64;
+    initialized = true;
 }
 
+#ifndef CONFIG_USER_ONLY
 void HELPER(stfl)(CPUS390XState *env)
 {
-    uint64_t words[MAX_STFL_WORDS];
+    LowCore *lowcore;
 
-    do_stfle(env, words);
-    cpu_stl_data(env, 200, words[0] >> 32);
+    lowcore = cpu_map_lowcore(env);
+    prepare_stfl();
+    memcpy(&lowcore->stfl_fac_list, stfl_bytes, sizeof(lowcore->stfl_fac_list));
+    cpu_unmap_lowcore(lowcore);
 }
+#endif
 
 uint32_t HELPER(stfle)(CPUS390XState *env, uint64_t addr)
 {
-    uint64_t words[MAX_STFL_WORDS];
-    unsigned count_m1 = env->regs[0] & 0xff;
-    unsigned max_m1 = do_stfle(env, words);
-    unsigned i;
+    const uintptr_t ra = GETPC();
+    const int count_bytes = ((env->regs[0] & 0xff) + 1) * 8;
+    const int max_bytes = ROUND_UP(used_stfl_bytes, 8);
+    int i;
+
+    if (addr & 0x7) {
+        cpu_restore_state(ENV_GET_CPU(env), ra);
+        program_interrupt(env, PGM_SPECIFICATION, 4);
+    }
 
-    for (i = 0; i <= count_m1; ++i) {
-        cpu_stq_data(env, addr + 8 * i, words[i]);
+    prepare_stfl();
+    for (i = 0; i < count_bytes; ++i) {
+        cpu_stb_data_ra(env, addr + i, stfl_bytes[i], ra);
     }
 
-    env->regs[0] = deposit64(env->regs[0], 0, 8, max_m1);
-    return (count_m1 >= max_m1 ? 0 : 3);
+    env->regs[0] = deposit64(env->regs[0], 0, 8, (max_bytes / 8) - 1);
+    return count_bytes >= max_bytes ? 0 : 3;
 }
diff --git a/target/s390x/translate.c b/target/s390x/translate.c
index abf2feb7aa..0e05942fe9 100644
--- a/target/s390x/translate.c
+++ b/target/s390x/translate.c
@@ -4082,7 +4082,6 @@ static ExitStatus op_sturg(DisasContext *s, DisasOps *o)
 
 static ExitStatus op_stfle(DisasContext *s, DisasOps *o)
 {
-    potential_page_fault(s);
     gen_helper_stfle(cc_op, cpu_env, o->in2);
     set_cc_static(s);
     return NO_EXIT;
-- 
2.13.5

  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 ` [Qemu-devel] [PATCH v1 23/27] s390x/tcg: implement STOP and RESET interrupts for TCG David Hildenbrand
2017-09-18 20:00   ` 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 ` David Hildenbrand [this message]
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-28-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).