All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg
@ 2018-02-01 17:19 Cornelia Huck
  2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 1/2] s390x/tcg: wire up pci instructions Cornelia Huck
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Cornelia Huck @ 2018-02-01 17:19 UTC (permalink / raw)
  To: qemu-s390x, qemu-devel; +Cc: rth, agraf, david, Cornelia Huck

More cleanup, as suggested by David, and also a fixed-up SIC. We can
now turn on ais as well and run with a pre-4.15 kernel and pci devices.

Branch at git://github.com/cohuck/qemu pci-tcg updated.

Changes v2->v3:
- SIC should depend on AIS, which is now supported for tcg as well
- fixup calling css_do_sic()
- no need to check return codes for the pci instruction handlers
- minor cleanup

Cornelia Huck (2):
  s390x/tcg: wire up pci instructions
  s390x/cpumodel: allow zpci features in qemu model

 target/s390x/cpu_models.c   |   6 +++
 target/s390x/gen-features.c |   6 ++-
 target/s390x/helper.h       |   9 ++++
 target/s390x/insn-data.def  |  13 ++++++
 target/s390x/misc_helper.c  |  89 ++++++++++++++++++++++++++++++++++++++
 target/s390x/translate.c    | 102 ++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 224 insertions(+), 1 deletion(-)

-- 
2.13.6

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH v3 1/2] s390x/tcg: wire up pci instructions
  2018-02-01 17:19 [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg Cornelia Huck
@ 2018-02-01 17:19 ` Cornelia Huck
  2018-02-01 17:21   ` David Hildenbrand
  2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 2/2] s390x/cpumodel: allow zpci features in qemu model Cornelia Huck
  2018-02-05 14:35 ` [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg Cornelia Huck
  2 siblings, 1 reply; 5+ messages in thread
From: Cornelia Huck @ 2018-02-01 17:19 UTC (permalink / raw)
  To: qemu-s390x, qemu-devel; +Cc: rth, agraf, david, Cornelia Huck

On s390x, pci support is implemented via a set of instructions
(no mmio). Unfortunately, none of them are documented in the
PoP; the code is based upon the existing implementation for KVM
and the Linux zpci driver.

Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/helper.h      |   9 ++++
 target/s390x/insn-data.def |  13 ++++++
 target/s390x/misc_helper.c |  89 +++++++++++++++++++++++++++++++++++++++
 target/s390x/translate.c   | 102 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 213 insertions(+)

diff --git a/target/s390x/helper.h b/target/s390x/helper.h
index 05d52ff309..59cba86a27 100644
--- a/target/s390x/helper.h
+++ b/target/s390x/helper.h
@@ -173,4 +173,13 @@ DEF_HELPER_3(stsch, void, env, i64, i64)
 DEF_HELPER_2(tpi, i32, env, i64)
 DEF_HELPER_3(tsch, void, env, i64, i64)
 DEF_HELPER_2(chsc, void, env, i64)
+
+DEF_HELPER_2(clp, void, env, i32)
+DEF_HELPER_3(pcilg, void, env, i32, i32)
+DEF_HELPER_3(pcistg, void, env, i32, i32)
+DEF_HELPER_4(stpcifc, void, env, i32, i64, i32)
+DEF_HELPER_3(sic, void, env, i64, i64)
+DEF_HELPER_3(rpcit, void, env, i32, i32)
+DEF_HELPER_5(pcistb, void, env, i32, i32, i64, i32)
+DEF_HELPER_4(mpcifc, void, env, i32, i64, i32)
 #endif
diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def
index c06c3884c0..621e10d615 100644
--- a/target/s390x/insn-data.def
+++ b/target/s390x/insn-data.def
@@ -1068,4 +1068,17 @@
     /* ??? Not listed in PoO ninth edition, but there's a linux driver that
        uses it: "A CHSC subchannel is usually present on LPAR only."  */
     C(0xb25f, CHSC,  RRE,     Z,   0, insn, 0, 0, chsc, 0)
+
+/* zPCI Instructions */
+    /* None of these instructions are documented in the PoP, so this is all
+       based upon target/s390x/kvm.c and Linux code and likely incomplete */
+    C(0xebd0, PCISTB, RSY_a, PCI, la2, 0, 0, 0, pcistb, 0)
+    C(0xebd1, SIC, RSY_a, AIS, r1, r3, 0, 0, sic, 0)
+    C(0xb9a0, CLP, RRF_c, PCI, 0, 0, 0, 0, clp, 0)
+    C(0xb9d0, PCISTG, RRE, PCI, 0, 0, 0, 0, pcistg, 0)
+    C(0xb9d2, PCILG, RRE, PCI, 0, 0, 0, 0, pcilg, 0)
+    C(0xb9d3, RPCIT, RRE, PCI, 0, 0, 0, 0, rpcit, 0)
+    C(0xe3d0, MPCIFC, RXY_a, PCI, la2, 0, 0, 0, mpcifc, 0)
+    C(0xe3d4, STPCIFC, RXY_a, PCI, la2, 0, 0, 0, stpcifc, 0)
+
 #endif /* CONFIG_USER_ONLY */
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 45cab8c463..e0b23c1fd1 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -38,6 +38,7 @@
 #include "hw/s390x/sclp.h"
 #include "hw/s390x/s390_flic.h"
 #include "hw/s390x/ioinst.h"
+#include "hw/s390x/s390-pci-inst.h"
 #include "hw/boards.h"
 #endif
 
@@ -632,3 +633,91 @@ uint32_t HELPER(stfle)(CPUS390XState *env, uint64_t addr)
     env->regs[0] = deposit64(env->regs[0], 0, 8, (max_bytes / 8) - 1);
     return count_bytes >= max_bytes ? 0 : 3;
 }
+
+#ifndef CONFIG_USER_ONLY
+/*
+ * Note: we ignore any return code of the functions called for the pci
+ * instructions, as the only time they return !0 is when the stub is
+ * called, and in that case we didn't even offer the zpci facility.
+ * The only exception is SIC, where program checks need to be handled
+ * by the caller.
+ */
+void HELPER(clp)(CPUS390XState *env, uint32_t r2)
+{
+    S390CPU *cpu = s390_env_get_cpu(env);
+
+    qemu_mutex_lock_iothread();
+    clp_service_call(cpu, r2, GETPC());
+    qemu_mutex_unlock_iothread();
+}
+
+void HELPER(pcilg)(CPUS390XState *env, uint32_t r1, uint32_t r2)
+{
+    S390CPU *cpu = s390_env_get_cpu(env);
+
+    qemu_mutex_lock_iothread();
+    pcilg_service_call(cpu, r1, r2, GETPC());
+    qemu_mutex_unlock_iothread();
+}
+
+void HELPER(pcistg)(CPUS390XState *env, uint32_t r1, uint32_t r2)
+{
+    S390CPU *cpu = s390_env_get_cpu(env);
+
+    qemu_mutex_lock_iothread();
+    pcistg_service_call(cpu, r1, r2, GETPC());
+    qemu_mutex_unlock_iothread();
+}
+
+void HELPER(stpcifc)(CPUS390XState *env, uint32_t r1, uint64_t fiba,
+                     uint32_t ar)
+{
+    S390CPU *cpu = s390_env_get_cpu(env);
+
+    qemu_mutex_lock_iothread();
+    stpcifc_service_call(cpu, r1, fiba, ar, GETPC());
+    qemu_mutex_unlock_iothread();
+}
+
+void HELPER(sic)(CPUS390XState *env, uint64_t r1, uint64_t r3)
+{
+    int r;
+
+    qemu_mutex_lock_iothread();
+    r = css_do_sic(env, (r3 >> 27) & 0x7, r1 & 0xffff);
+    qemu_mutex_unlock_iothread();
+    /* css_do_sic() may actually return a PGM_xxx value to inject */
+    if (r) {
+        s390_program_interrupt(env, -r, 4, GETPC());
+    }
+}
+
+void HELPER(rpcit)(CPUS390XState *env, uint32_t r1, uint32_t r2)
+{
+    S390CPU *cpu = s390_env_get_cpu(env);
+
+    qemu_mutex_lock_iothread();
+    rpcit_service_call(cpu, r1, r2, GETPC());
+    qemu_mutex_unlock_iothread();
+}
+
+void HELPER(pcistb)(CPUS390XState *env, uint32_t r1, uint32_t r3,
+                    uint64_t gaddr, uint32_t ar)
+{
+    S390CPU *cpu = s390_env_get_cpu(env);
+
+    qemu_mutex_lock_iothread();
+    pcistb_service_call(cpu, r1, r3, gaddr, ar, GETPC());
+    qemu_mutex_unlock_iothread();
+}
+
+void HELPER(mpcifc)(CPUS390XState *env, uint32_t r1, uint64_t fiba,
+                    uint32_t ar)
+{
+    S390CPU *cpu = s390_env_get_cpu(env);
+
+    qemu_mutex_lock_iothread();
+    mpcifc_service_call(cpu, r1, fiba, ar, GETPC());
+    qemu_mutex_unlock_iothread();
+}
+#endif
diff --git a/target/s390x/translate.c b/target/s390x/translate.c
index 81abe40673..b470d691d3 100644
--- a/target/s390x/translate.c
+++ b/target/s390x/translate.c
@@ -4785,6 +4785,106 @@ static ExitStatus op_zero2(DisasContext *s, DisasOps *o)
     return NO_EXIT;
 }
 
+#ifndef CONFIG_USER_ONLY
+static ExitStatus op_clp(DisasContext *s, DisasOps *o)
+{
+    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
+
+    check_privileged(s);
+    gen_helper_clp(cpu_env, r2);
+    tcg_temp_free_i32(r2);
+    set_cc_static(s);
+    return NO_EXIT;
+}
+
+static ExitStatus op_pcilg(DisasContext *s, DisasOps *o)
+{
+    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
+    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
+
+    check_privileged(s);
+    gen_helper_pcilg(cpu_env, r1, r2);
+    tcg_temp_free_i32(r1);
+    tcg_temp_free_i32(r2);
+    set_cc_static(s);
+    return NO_EXIT;
+}
+
+static ExitStatus op_pcistg(DisasContext *s, DisasOps *o)
+{
+    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
+    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
+
+    check_privileged(s);
+    gen_helper_pcistg(cpu_env, r1, r2);
+    tcg_temp_free_i32(r1);
+    tcg_temp_free_i32(r2);
+    set_cc_static(s);
+    return NO_EXIT;
+}
+
+static ExitStatus op_stpcifc(DisasContext *s, DisasOps *o)
+{
+    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
+    TCGv_i32 ar = tcg_const_i32(get_field(s->fields, b2));
+
+    check_privileged(s);
+    gen_helper_stpcifc(cpu_env, r1, o->addr1, ar);
+    tcg_temp_free_i32(ar);
+    tcg_temp_free_i32(r1);
+    set_cc_static(s);
+    return NO_EXIT;
+}
+
+static ExitStatus op_sic(DisasContext *s, DisasOps *o)
+{
+    check_privileged(s);
+    gen_helper_sic(cpu_env, o->in1, o->in2);
+    return NO_EXIT;
+}
+
+static ExitStatus op_rpcit(DisasContext *s, DisasOps *o)
+{
+    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
+    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
+
+    check_privileged(s);
+    gen_helper_rpcit(cpu_env, r1, r2);
+    tcg_temp_free_i32(r1);
+    tcg_temp_free_i32(r2);
+    set_cc_static(s);
+    return NO_EXIT;
+}
+
+static ExitStatus op_pcistb(DisasContext *s, DisasOps *o)
+{
+    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
+    TCGv_i32 r3 = tcg_const_i32(get_field(s->fields, r3));
+    TCGv_i32 ar = tcg_const_i32(get_field(s->fields, b2));
+
+    check_privileged(s);
+    gen_helper_pcistb(cpu_env, r1, r3, o->addr1, ar);
+    tcg_temp_free_i32(ar);
+    tcg_temp_free_i32(r1);
+    tcg_temp_free_i32(r3);
+    set_cc_static(s);
+    return NO_EXIT;
+}
+
+static ExitStatus op_mpcifc(DisasContext *s, DisasOps *o)
+{
+    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
+    TCGv_i32 ar = tcg_const_i32(get_field(s->fields, b2));
+
+    check_privileged(s);
+    gen_helper_mpcifc(cpu_env, r1, o->addr1, ar);
+    tcg_temp_free_i32(ar);
+    tcg_temp_free_i32(r1);
+    set_cc_static(s);
+    return NO_EXIT;
+}
+#endif
+
 /* ====================================================================== */
 /* The "Cc OUTput" generators.  Given the generated output (and in some cases
    the original inputs), update the various cc data structures in order to
@@ -5716,6 +5816,8 @@ enum DisasInsnEnum {
 #define FAC_MSA4        S390_FEAT_MSA_EXT_4 /* msa-extension-4 facility */
 #define FAC_MSA5        S390_FEAT_MSA_EXT_5 /* msa-extension-5 facility */
 #define FAC_ECT         S390_FEAT_EXTRACT_CPU_TIME
+#define FAC_PCI         S390_FEAT_ZPCI /* z/PCI facility */
+#define FAC_AIS         S390_FEAT_ADAPTER_INT_SUPPRESSION
 
 static const DisasInsn insn_info[] = {
 #include "insn-data.def"
-- 
2.13.6

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH v3 2/2] s390x/cpumodel: allow zpci features in qemu model
  2018-02-01 17:19 [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg Cornelia Huck
  2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 1/2] s390x/tcg: wire up pci instructions Cornelia Huck
@ 2018-02-01 17:19 ` Cornelia Huck
  2018-02-05 14:35 ` [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg Cornelia Huck
  2 siblings, 0 replies; 5+ messages in thread
From: Cornelia Huck @ 2018-02-01 17:19 UTC (permalink / raw)
  To: qemu-s390x, qemu-devel; +Cc: rth, agraf, david, Cornelia Huck

AEN and AIS can be provided unconditionally, ZPCI should be turned on
manually.

With -cpu qemu,zpci=on, the guest kernel can now successfully detect
virtio-pci devices under tcg.

Also fixup the order of the MSA_EXT_{3,4} flags while at it.

Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
---
 target/s390x/cpu_models.c   | 6 ++++++
 target/s390x/gen-features.c | 6 +++++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 212a5f0697..250d931d7e 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -23,6 +23,7 @@
 #include "qapi/qmp/qbool.h"
 #ifndef CONFIG_USER_ONLY
 #include "sysemu/arch_init.h"
+#include "hw/pci/pci.h"
 #endif
 
 #define CPUDEF_INIT(_type, _gen, _ec_ga, _mha_pow, _hmfai, _name, _desc) \
@@ -1271,6 +1272,11 @@ static void register_types(void)
 
     /* init all bitmaps from gnerated data initially */
     s390_init_feat_bitmap(qemu_max_cpu_feat_init, qemu_max_cpu_feat);
+#ifndef CONFIG_USER_ONLY
+    if (!pci_available) {
+        clear_bit(S390_FEAT_ZPCI, qemu_max_cpu_feat);
+    }
+#endif
     for (i = 0; i < ARRAY_SIZE(s390_cpu_defs); i++) {
         s390_init_feat_bitmap(s390_cpu_defs[i].base_init,
                               s390_cpu_defs[i].base_feat);
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
index 0570f597ec..89a140c9a7 100644
--- a/target/s390x/gen-features.c
+++ b/target/s390x/gen-features.c
@@ -572,8 +572,10 @@ static uint16_t qemu_LATEST[] = {
     S390_FEAT_STFLE_49,
     S390_FEAT_LOCAL_TLB_CLEARING,
     S390_FEAT_INTERLOCKED_ACCESS_2,
-    S390_FEAT_MSA_EXT_4,
+    S390_FEAT_ADAPTER_EVENT_NOTIFICATION,
+    S390_FEAT_ADAPTER_INT_SUPPRESSION,
     S390_FEAT_MSA_EXT_3,
+    S390_FEAT_MSA_EXT_4,
 };
 
 /* add all new definitions before this point */
@@ -582,6 +584,8 @@ static uint16_t qemu_MAX[] = {
     S390_FEAT_STFLE_53,
     /* generates a dependency warning, leave it out for now */
     S390_FEAT_MSA_EXT_5,
+    /* only with CONFIG_PCI */
+    S390_FEAT_ZPCI,
 };
 
 /****** END FEATURE DEFS ******/
-- 
2.13.6

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/2] s390x/tcg: wire up pci instructions
  2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 1/2] s390x/tcg: wire up pci instructions Cornelia Huck
@ 2018-02-01 17:21   ` David Hildenbrand
  0 siblings, 0 replies; 5+ messages in thread
From: David Hildenbrand @ 2018-02-01 17:21 UTC (permalink / raw)
  To: Cornelia Huck, qemu-s390x, qemu-devel; +Cc: rth, agraf

On 01.02.2018 18:19, Cornelia Huck wrote:
> On s390x, pci support is implemented via a set of instructions
> (no mmio). Unfortunately, none of them are documented in the
> PoP; the code is based upon the existing implementation for KVM
> and the Linux zpci driver.
> 
> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
> ---
>  target/s390x/helper.h      |   9 ++++
>  target/s390x/insn-data.def |  13 ++++++
>  target/s390x/misc_helper.c |  89 +++++++++++++++++++++++++++++++++++++++
>  target/s390x/translate.c   | 102 +++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 213 insertions(+)
> 
> diff --git a/target/s390x/helper.h b/target/s390x/helper.h
> index 05d52ff309..59cba86a27 100644
> --- a/target/s390x/helper.h
> +++ b/target/s390x/helper.h
> @@ -173,4 +173,13 @@ DEF_HELPER_3(stsch, void, env, i64, i64)
>  DEF_HELPER_2(tpi, i32, env, i64)
>  DEF_HELPER_3(tsch, void, env, i64, i64)
>  DEF_HELPER_2(chsc, void, env, i64)
> +
> +DEF_HELPER_2(clp, void, env, i32)
> +DEF_HELPER_3(pcilg, void, env, i32, i32)
> +DEF_HELPER_3(pcistg, void, env, i32, i32)
> +DEF_HELPER_4(stpcifc, void, env, i32, i64, i32)
> +DEF_HELPER_3(sic, void, env, i64, i64)
> +DEF_HELPER_3(rpcit, void, env, i32, i32)
> +DEF_HELPER_5(pcistb, void, env, i32, i32, i64, i32)
> +DEF_HELPER_4(mpcifc, void, env, i32, i64, i32)
>  #endif
> diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def
> index c06c3884c0..621e10d615 100644
> --- a/target/s390x/insn-data.def
> +++ b/target/s390x/insn-data.def
> @@ -1068,4 +1068,17 @@
>      /* ??? Not listed in PoO ninth edition, but there's a linux driver that
>         uses it: "A CHSC subchannel is usually present on LPAR only."  */
>      C(0xb25f, CHSC,  RRE,     Z,   0, insn, 0, 0, chsc, 0)
> +
> +/* zPCI Instructions */
> +    /* None of these instructions are documented in the PoP, so this is all
> +       based upon target/s390x/kvm.c and Linux code and likely incomplete */
> +    C(0xebd0, PCISTB, RSY_a, PCI, la2, 0, 0, 0, pcistb, 0)
> +    C(0xebd1, SIC, RSY_a, AIS, r1, r3, 0, 0, sic, 0)
> +    C(0xb9a0, CLP, RRF_c, PCI, 0, 0, 0, 0, clp, 0)
> +    C(0xb9d0, PCISTG, RRE, PCI, 0, 0, 0, 0, pcistg, 0)
> +    C(0xb9d2, PCILG, RRE, PCI, 0, 0, 0, 0, pcilg, 0)
> +    C(0xb9d3, RPCIT, RRE, PCI, 0, 0, 0, 0, rpcit, 0)
> +    C(0xe3d0, MPCIFC, RXY_a, PCI, la2, 0, 0, 0, mpcifc, 0)
> +    C(0xe3d4, STPCIFC, RXY_a, PCI, la2, 0, 0, 0, stpcifc, 0)
> +
>  #endif /* CONFIG_USER_ONLY */
> diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
> index 45cab8c463..e0b23c1fd1 100644
> --- a/target/s390x/misc_helper.c
> +++ b/target/s390x/misc_helper.c
> @@ -38,6 +38,7 @@
>  #include "hw/s390x/sclp.h"
>  #include "hw/s390x/s390_flic.h"
>  #include "hw/s390x/ioinst.h"
> +#include "hw/s390x/s390-pci-inst.h"
>  #include "hw/boards.h"
>  #endif
>  
> @@ -632,3 +633,91 @@ uint32_t HELPER(stfle)(CPUS390XState *env, uint64_t addr)
>      env->regs[0] = deposit64(env->regs[0], 0, 8, (max_bytes / 8) - 1);
>      return count_bytes >= max_bytes ? 0 : 3;
>  }
> +
> +#ifndef CONFIG_USER_ONLY
> +/*
> + * Note: we ignore any return code of the functions called for the pci
> + * instructions, as the only time they return !0 is when the stub is
> + * called, and in that case we didn't even offer the zpci facility.
> + * The only exception is SIC, where program checks need to be handled
> + * by the caller.
> + */
> +void HELPER(clp)(CPUS390XState *env, uint32_t r2)
> +{
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    qemu_mutex_lock_iothread();
> +    clp_service_call(cpu, r2, GETPC());
> +    qemu_mutex_unlock_iothread();
> +}
> +
> +void HELPER(pcilg)(CPUS390XState *env, uint32_t r1, uint32_t r2)
> +{
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    qemu_mutex_lock_iothread();
> +    pcilg_service_call(cpu, r1, r2, GETPC());
> +    qemu_mutex_unlock_iothread();
> +}
> +
> +void HELPER(pcistg)(CPUS390XState *env, uint32_t r1, uint32_t r2)
> +{
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    qemu_mutex_lock_iothread();
> +    pcistg_service_call(cpu, r1, r2, GETPC());
> +    qemu_mutex_unlock_iothread();
> +}
> +
> +void HELPER(stpcifc)(CPUS390XState *env, uint32_t r1, uint64_t fiba,
> +                     uint32_t ar)
> +{
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    qemu_mutex_lock_iothread();
> +    stpcifc_service_call(cpu, r1, fiba, ar, GETPC());
> +    qemu_mutex_unlock_iothread();
> +}
> +
> +void HELPER(sic)(CPUS390XState *env, uint64_t r1, uint64_t r3)
> +{
> +    int r;
> +
> +    qemu_mutex_lock_iothread();
> +    r = css_do_sic(env, (r3 >> 27) & 0x7, r1 & 0xffff);
> +    qemu_mutex_unlock_iothread();
> +    /* css_do_sic() may actually return a PGM_xxx value to inject */
> +    if (r) {
> +        s390_program_interrupt(env, -r, 4, GETPC());
> +    }
> +}
> +
> +void HELPER(rpcit)(CPUS390XState *env, uint32_t r1, uint32_t r2)
> +{
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    qemu_mutex_lock_iothread();
> +    rpcit_service_call(cpu, r1, r2, GETPC());
> +    qemu_mutex_unlock_iothread();
> +}
> +
> +void HELPER(pcistb)(CPUS390XState *env, uint32_t r1, uint32_t r3,
> +                    uint64_t gaddr, uint32_t ar)
> +{
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    qemu_mutex_lock_iothread();
> +    pcistb_service_call(cpu, r1, r3, gaddr, ar, GETPC());
> +    qemu_mutex_unlock_iothread();
> +}
> +
> +void HELPER(mpcifc)(CPUS390XState *env, uint32_t r1, uint64_t fiba,
> +                    uint32_t ar)
> +{
> +    S390CPU *cpu = s390_env_get_cpu(env);
> +
> +    qemu_mutex_lock_iothread();
> +    mpcifc_service_call(cpu, r1, fiba, ar, GETPC());
> +    qemu_mutex_unlock_iothread();
> +}
> +#endif
> diff --git a/target/s390x/translate.c b/target/s390x/translate.c
> index 81abe40673..b470d691d3 100644
> --- a/target/s390x/translate.c
> +++ b/target/s390x/translate.c
> @@ -4785,6 +4785,106 @@ static ExitStatus op_zero2(DisasContext *s, DisasOps *o)
>      return NO_EXIT;
>  }
>  
> +#ifndef CONFIG_USER_ONLY
> +static ExitStatus op_clp(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
> +
> +    check_privileged(s);
> +    gen_helper_clp(cpu_env, r2);
> +    tcg_temp_free_i32(r2);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +
> +static ExitStatus op_pcilg(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
> +    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
> +
> +    check_privileged(s);
> +    gen_helper_pcilg(cpu_env, r1, r2);
> +    tcg_temp_free_i32(r1);
> +    tcg_temp_free_i32(r2);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +
> +static ExitStatus op_pcistg(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
> +    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
> +
> +    check_privileged(s);
> +    gen_helper_pcistg(cpu_env, r1, r2);
> +    tcg_temp_free_i32(r1);
> +    tcg_temp_free_i32(r2);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +
> +static ExitStatus op_stpcifc(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
> +    TCGv_i32 ar = tcg_const_i32(get_field(s->fields, b2));
> +
> +    check_privileged(s);
> +    gen_helper_stpcifc(cpu_env, r1, o->addr1, ar);
> +    tcg_temp_free_i32(ar);
> +    tcg_temp_free_i32(r1);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +
> +static ExitStatus op_sic(DisasContext *s, DisasOps *o)
> +{
> +    check_privileged(s);
> +    gen_helper_sic(cpu_env, o->in1, o->in2);
> +    return NO_EXIT;
> +}
> +
> +static ExitStatus op_rpcit(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
> +    TCGv_i32 r2 = tcg_const_i32(get_field(s->fields, r2));
> +
> +    check_privileged(s);
> +    gen_helper_rpcit(cpu_env, r1, r2);
> +    tcg_temp_free_i32(r1);
> +    tcg_temp_free_i32(r2);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +
> +static ExitStatus op_pcistb(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
> +    TCGv_i32 r3 = tcg_const_i32(get_field(s->fields, r3));
> +    TCGv_i32 ar = tcg_const_i32(get_field(s->fields, b2));
> +
> +    check_privileged(s);
> +    gen_helper_pcistb(cpu_env, r1, r3, o->addr1, ar);
> +    tcg_temp_free_i32(ar);
> +    tcg_temp_free_i32(r1);
> +    tcg_temp_free_i32(r3);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +
> +static ExitStatus op_mpcifc(DisasContext *s, DisasOps *o)
> +{
> +    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));
> +    TCGv_i32 ar = tcg_const_i32(get_field(s->fields, b2));
> +
> +    check_privileged(s);
> +    gen_helper_mpcifc(cpu_env, r1, o->addr1, ar);
> +    tcg_temp_free_i32(ar);
> +    tcg_temp_free_i32(r1);
> +    set_cc_static(s);
> +    return NO_EXIT;
> +}
> +#endif
> +
>  /* ====================================================================== */
>  /* The "Cc OUTput" generators.  Given the generated output (and in some cases
>     the original inputs), update the various cc data structures in order to
> @@ -5716,6 +5816,8 @@ enum DisasInsnEnum {
>  #define FAC_MSA4        S390_FEAT_MSA_EXT_4 /* msa-extension-4 facility */
>  #define FAC_MSA5        S390_FEAT_MSA_EXT_5 /* msa-extension-5 facility */
>  #define FAC_ECT         S390_FEAT_EXTRACT_CPU_TIME
> +#define FAC_PCI         S390_FEAT_ZPCI /* z/PCI facility */
> +#define FAC_AIS         S390_FEAT_ADAPTER_INT_SUPPRESSION
>  
>  static const DisasInsn insn_info[] = {
>  #include "insn-data.def"
> 

Reviewed-by: David Hildenbrand <david@redhat.com>

-- 

Thanks,

David / dhildenb

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg
  2018-02-01 17:19 [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg Cornelia Huck
  2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 1/2] s390x/tcg: wire up pci instructions Cornelia Huck
  2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 2/2] s390x/cpumodel: allow zpci features in qemu model Cornelia Huck
@ 2018-02-05 14:35 ` Cornelia Huck
  2 siblings, 0 replies; 5+ messages in thread
From: Cornelia Huck @ 2018-02-05 14:35 UTC (permalink / raw)
  To: qemu-s390x, qemu-devel; +Cc: rth, agraf, david

On Thu,  1 Feb 2018 18:19:33 +0100
Cornelia Huck <cohuck@redhat.com> wrote:

> More cleanup, as suggested by David, and also a fixed-up SIC. We can
> now turn on ais as well and run with a pre-4.15 kernel and pci devices.
> 
> Branch at git://github.com/cohuck/qemu pci-tcg updated.
> 
> Changes v2->v3:
> - SIC should depend on AIS, which is now supported for tcg as well
> - fixup calling css_do_sic()
> - no need to check return codes for the pci instruction handlers
> - minor cleanup
> 
> Cornelia Huck (2):
>   s390x/tcg: wire up pci instructions
>   s390x/cpumodel: allow zpci features in qemu model
> 
>  target/s390x/cpu_models.c   |   6 +++
>  target/s390x/gen-features.c |   6 ++-
>  target/s390x/helper.h       |   9 ++++
>  target/s390x/insn-data.def  |  13 ++++++
>  target/s390x/misc_helper.c  |  89 ++++++++++++++++++++++++++++++++++++++
>  target/s390x/translate.c    | 102 ++++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 224 insertions(+), 1 deletion(-)
> 

OK, queued to s390-next. Let's see what breaks :)

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-02-05 14:36 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-01 17:19 [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg Cornelia Huck
2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 1/2] s390x/tcg: wire up pci instructions Cornelia Huck
2018-02-01 17:21   ` David Hildenbrand
2018-02-01 17:19 ` [Qemu-devel] [PATCH v3 2/2] s390x/cpumodel: allow zpci features in qemu model Cornelia Huck
2018-02-05 14:35 ` [Qemu-devel] [PATCH v3 0/2] s390x: support zpci in tcg Cornelia Huck

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.