qemu-riscv
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v7 12/15] target/riscv: Add Zvkg ISA extension support


From: Max Chou
Subject: Re: [PATCH v7 12/15] target/riscv: Add Zvkg ISA extension support
Date: Wed, 12 Jul 2023 01:12:24 +0800
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.13.0

On 2023/7/11 11:57 AM, Max Chou wrote:

On 2023/7/11 11:15 AM, Alistair Francis wrote:

On Mon, Jul 10, 2023 at 6:37 PM Max Chou <max.chou@sifive.com> wrote:
On 2023/7/8 5:25 PM, Daniel Henrique Barboza wrote:

Hi,

This patch breaks some gitlab runners because of this:

On 7/2/23 12:53, Max Chou wrote:
From: Nazar Kazakov <nazar.kazakov@codethink.co.uk>

This commit adds support for the Zvkg vector-crypto extension, which
consists of the following instructions:

* vgmul.vv
* vghsh.vv

Translation functions are defined in
`target/riscv/insn_trans/trans_rvvk.c.inc` and helpers are defined in
`target/riscv/vcrypto_helper.c`.

Co-authored-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
[max.chou@sifive.com: Replaced vstart checking by TCG op]
Signed-off-by: Lawrence Hunter <lawrence.hunter@codethink.co.uk>
Signed-off-by: Nazar Kazakov <nazar.kazakov@codethink.co.uk>
Signed-off-by: Max Chou <max.chou@sifive.com>
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
[max.chou@sifive.com: Exposed x-zvkg property]
---
  target/riscv/cpu.c                       |  6 +-
  target/riscv/cpu_cfg.h                   |  1 +
  target/riscv/helper.h                    |  3 +
  target/riscv/insn32.decode               |  4 ++
  target/riscv/insn_trans/trans_rvvk.c.inc | 30 ++++++++++
  target/riscv/vcrypto_helper.c            | 72 ++++++++++++++++++++++++
  6 files changed, 114 insertions(+), 2 deletions(-)

diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 08b8355f52..699ab5e9fa 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -118,6 +118,7 @@ static const struct isa_ext_data isa_edata_arr[] = {
      ISA_EXT_DATA_ENTRY(zve64d, PRIV_VERSION_1_10_0, ext_zve64d),
      ISA_EXT_DATA_ENTRY(zvfh, PRIV_VERSION_1_12_0, ext_zvfh),
      ISA_EXT_DATA_ENTRY(zvfhmin, PRIV_VERSION_1_12_0, ext_zvfhmin),
+    ISA_EXT_DATA_ENTRY(zvkg, PRIV_VERSION_1_12_0, ext_zvkg),
      ISA_EXT_DATA_ENTRY(zvkned, PRIV_VERSION_1_12_0, ext_zvkned),
      ISA_EXT_DATA_ENTRY(zvknha, PRIV_VERSION_1_12_0, ext_zvknha),
      ISA_EXT_DATA_ENTRY(zvknhb, PRIV_VERSION_1_12_0, ext_zvknhb),
@@ -1194,8 +1195,8 @@ void riscv_cpu_validate_set_extensions(RISCVCPU
*cpu, Error **errp)
       * In principle Zve*x would also suffice here, were they supported
       * in qemu
       */
-    if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkned ||
cpu->cfg.ext_zvknha ||
-         cpu->cfg.ext_zvksh) && !cpu->cfg.ext_zve32f) {
+    if ((cpu->cfg.ext_zvbb || cpu->cfg.ext_zvkg ||
cpu->cfg.ext_zvkned ||
+         cpu->cfg.ext_zvknha || cpu->cfg.ext_zvksh) &&
!cpu->cfg.ext_zve32f) {
          error_setg(errp,
                     "Vector crypto extensions require V or Zve*
extensions");
          return;
@@ -1710,6 +1711,7 @@ static Property riscv_cpu_extensions[] = {
      /* Vector cryptography extensions */
      DEFINE_PROP_BOOL("x-zvbb", RISCVCPU, cfg.ext_zvbb, false),
      DEFINE_PROP_BOOL("x-zvbc", RISCVCPU, cfg.ext_zvbc, false),
+    DEFINE_PROP_BOOL("x-zvkg", RISCVCPU, cfg.ext_zvkg, false),
      DEFINE_PROP_BOOL("x-zvkned", RISCVCPU, cfg.ext_zvkned, false),
      DEFINE_PROP_BOOL("x-zvknha", RISCVCPU, cfg.ext_zvknha, false),
      DEFINE_PROP_BOOL("x-zvknhb", RISCVCPU, cfg.ext_zvknhb, false),
diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
index 27062b12a8..960761c479 100644
--- a/target/riscv/cpu_cfg.h
+++ b/target/riscv/cpu_cfg.h
@@ -85,6 +85,7 @@ struct RISCVCPUConfig {
      bool ext_zve64d;
      bool ext_zvbb;
      bool ext_zvbc;
+    bool ext_zvkg;
      bool ext_zvkned;
      bool ext_zvknha;
      bool ext_zvknhb;
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
index 172c91c65c..238343cb42 100644
--- a/target/riscv/helper.h
+++ b/target/riscv/helper.h
@@ -1244,3 +1244,6 @@ DEF_HELPER_5(vsha2cl64_vv, void, ptr, ptr, ptr,
env, i32)
    DEF_HELPER_5(vsm3me_vv, void, ptr, ptr, ptr, env, i32)
  DEF_HELPER_5(vsm3c_vi, void, ptr, ptr, i32, env, i32)
+
+DEF_HELPER_5(vghsh_vv, void, ptr, ptr, ptr, env, i32)
+DEF_HELPER_4(vgmul_vv, void, ptr, ptr, env, i32)
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
index 5ca83e8462..b10497afd3 100644
--- a/target/riscv/insn32.decode
+++ b/target/riscv/insn32.decode
@@ -957,3 +957,7 @@ vsha2cl_vv  101111 1 ..... ..... 010 .....
1110111 @r_vm_1
  # *** Zvksh vector crypto extension ***
  vsm3me_vv   100000 1 ..... ..... 010 ..... 1110111 @r_vm_1
  vsm3c_vi    101011 1 ..... ..... 010 ..... 1110111 @r_vm_1
+
+# *** Zvkg vector crypto extension ***
+vghsh_vv    101100 1 ..... ..... 010 ..... 1110111 @r_vm_1
+vgmul_vv    101000 1 ..... 10001 010 ..... 1110111 @r2_vm_1
diff --git a/target/riscv/insn_trans/trans_rvvk.c.inc
b/target/riscv/insn_trans/trans_rvvk.c.inc
index 6469dd2f02..af7cd62e7d 100644
--- a/target/riscv/insn_trans/trans_rvvk.c.inc
+++ b/target/riscv/insn_trans/trans_rvvk.c.inc
@@ -531,3 +531,33 @@ static inline bool vsm3c_check(DisasContext *s,
arg_rmrr *a)
    GEN_VV_UNMASKED_TRANS(vsm3me_vv, vsm3me_check, ZVKSH_EGS)
  GEN_VI_UNMASKED_TRANS(vsm3c_vi, vsm3c_check, ZVKSH_EGS)
+
+/*
+ * Zvkg
+ */
+
+#define ZVKG_EGS 4
+
+static bool vgmul_check(DisasContext *s, arg_rmr *a)
+{
+    int egw_bytes = ZVKG_EGS << s->sew;
+    return s->cfg_ptr->ext_zvkg == true &&
+           vext_check_isa_ill(s) &&
+           require_rvv(s) &&
+           MAXSZ(s) >= egw_bytes &&
+           vext_check_ss(s, a->rd, a->rs2, a->vm) &&
+           s->sew == MO_32;
+}
+
+GEN_V_UNMASKED_TRANS(vgmul_vv, vgmul_check, ZVKG_EGS)
+
+static bool vghsh_check(DisasContext *s, arg_rmrr *a)
+{
+    int egw_bytes = ZVKG_EGS << s->sew;
+    return s->cfg_ptr->ext_zvkg == true &&
+           opivv_check(s, a) &&
+           MAXSZ(s) >= egw_bytes &&
+           s->sew == MO_32;
+}
+
+GEN_VV_UNMASKED_TRANS(vghsh_vv, vghsh_check, ZVKG_EGS)
diff --git a/target/riscv/vcrypto_helper.c
b/target/riscv/vcrypto_helper.c
index ff7fb11928..f127fc0d3a 100644
--- a/target/riscv/vcrypto_helper.c
+++ b/target/riscv/vcrypto_helper.c
@@ -769,3 +769,75 @@ void HELPER(vsm3c_vi)(void *vd_vptr, void
*vs2_vptr, uint32_t uimm,
      vext_set_elems_1s(vd_vptr, vta, env->vl * esz, total_elems * esz);
      env->vstart = 0;
  }
+
+void HELPER(vghsh_vv)(void *vd_vptr, void *vs1_vptr, void *vs2_vptr,
+                      CPURISCVState *env, uint32_t desc)
+{
+    uint64_t *vd = vd_vptr;
+    uint64_t *vs1 = vs1_vptr;
+    uint64_t *vs2 = vs2_vptr;
+    uint32_t vta = vext_vta(desc);
+    uint32_t total_elems = vext_get_total_elems(env, desc, 4);
+
+    for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
+        uint64_t Y[2] = {vd[i * 2 + 0], vd[i * 2 + 1]};
+        uint64_t H[2] = {brev8(vs2[i * 2 + 0]), brev8(vs2[i * 2 + 1])};
+        uint64_t X[2] = {vs1[i * 2 + 0], vs1[i * 2 + 1]};
+        uint64_t Z[2] = {0, 0};
+
+        uint64_t S[2] = {brev8(Y[0] ^ X[0]), brev8(Y[1] ^ X[1])};
+
+        for (uint j = 0; j < 128; j++) {
^

and this

    FAILED:
    libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj
    i686-w64-mingw32-gcc -m32 -Ilibqemu-riscv64-softmmu.fa.p -I. -I..
    -Itarget/riscv -I../target/riscv -Isubprojects/dtc/libfdt
    -I../subprojects/dtc/libfdt -Iqapi -Itrace -Iui -Iui/shader
    -I/usr/i686-w64-mingw32/sys-root/mingw/include/pixman-1
    -I/usr/i686-w64-mingw32/sys-root/mingw/include/glib-2.0
    -I/usr/i686-w64-mingw32/sys-root/mingw/lib/glib-2.0/include
    -fdiagnostics-color=auto -Wall -Winvalid-pch -Werror -std=gnu11
-O2 -g
    -fstack-protector-strong -Wundef -Wwrite-strings -Wmissing-prototypes
    -Wstrict-prototypes -Wredundant-decls -Wold-style-declaration
    -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k
    -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs
    -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2
    -Wmissing-format-attribute -Wno-missing-include-dirs
    -Wno-shift-negative-value -Wno-psabi -iquote . -iquote
    /builds/danielhb/qemu -iquote /builds/danielhb/qemu/include -iquote
    /builds/danielhb/qemu/host/include/i386 -iquote
    /builds/danielhb/qemu/host/include/generic -iquote
    /builds/danielhb/qemu/tcg/i386 -mms-bitfields -D_GNU_SOURCE
    -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing
    -fno-common -fwrapv -fno-pie -no-pie -DNEED_CPU_H
    '-DCONFIG_TARGET="riscv64-softmmu-config-target.h"'
    '-DCONFIG_DEVICES="riscv64-softmmu-config-devices.h"' -MD -MQ
    libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj -MF
libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj.d -o
    libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj -c
    ../target/riscv/vcrypto_helper.c
    ../target/riscv/vcrypto_helper.c: In function 'helper_vghsh_vv':
    ../target/riscv/vcrypto_helper.c:791:14: error: unknown type name
    'uint'; did you mean 'u_int'?
      791 |         for (uint j = 0; j < 128; j++) {
          |              ^~~~
          |              u_int
    ../target/riscv/vcrypto_helper.c: In function 'helper_vgmul_vv':
    ../target/riscv/vcrypto_helper.c:825:14: error: unknown type name
    'uint'; did you mean 'u_int'?
      825 |         for (uint j = 0; j < 128; j++) {
          |              ^~~~
          |              u_int
    [2503/3700] Compiling C object
    libqemu-riscv64-softmmu.fa.p/target_riscv_vector_helper.c.obj


If you want to take a look yourself:

https://gitlab.com/danielhb/qemu/-/jobs/4615946161

The fix is to use 'int' instead of 'uint' in both cases.

I apologize for noticing the error this late. I haven't had the chance
to run
Gitlab runners in these patches until now.

Alistair, in case you decide to take this series you'll have to amend
this
in-tree I'm afraid. It's too late to ask for another review.


Thanks,


Daniel
Hi Daniel,

Thanks you for the testing and notification.
If this series are not be taken at the 8.1 feature freeze (July 11th),
I'll provide the next version with the fix.
Hey Max,

Thanks for the patches. Unfortunately they won't make the feature
freeze. They depend on other patches and I haven't gotten a chance to
look at them yet. If you can send a new version I can start reviewing
and apply them to my tree in preparation of the next release

Alistair
Hi Alistair,

No problem, I'll send a new version based on the riscv-to-apply.next branch.

Thanks,
Max
Hi Alistair,

The v8 patches rebase to the riscv-to-apply.next branch and include the
fix of the cross win32 build issue.
20230711165917.2629866-1-max.chou@sifive.com/">https://patchew.org/QEMU/20230711165917.2629866-1-max.chou@sifive.com/

Thanks,
Max


      
Thanks,

Max

+            if ((S[j / 64] >> (j % 64)) & 1) {
+                Z[0] ^= H[0];
+                Z[1] ^= H[1];
+            }
+            bool reduce = ((H[1] >> 63) & 1);
+            H[1] = H[1] << 1 | H[0] >> 63;
+            H[0] = H[0] << 1;
+            if (reduce) {
+                H[0] ^= 0x87;
+            }
+        }
+
+        vd[i * 2 + 0] = brev8(Z[0]);
+        vd[i * 2 + 1] = brev8(Z[1]);
+    }
+    /* set tail elements to 1s */
+    vext_set_elems_1s(vd, vta, env->vl * 4, total_elems * 4);
+    env->vstart = 0;
+}
+
+void HELPER(vgmul_vv)(void *vd_vptr, void *vs2_vptr, CPURISCVState
*env,
+                      uint32_t desc)
+{
+    uint64_t *vd = vd_vptr;
+    uint64_t *vs2 = vs2_vptr;
+    uint32_t vta = vext_vta(desc);
+    uint32_t total_elems = vext_get_total_elems(env, desc, 4);
+
+    for (uint32_t i = env->vstart / 4; i < env->vl / 4; i++) {
+        uint64_t Y[2] = {brev8(vd[i * 2 + 0]), brev8(vd[i * 2 + 1])};
+        uint64_t H[2] = {brev8(vs2[i * 2 + 0]), brev8(vs2[i * 2 + 1])};
+        uint64_t Z[2] = {0, 0};
+
+        for (uint j = 0; j < 128; j++) {
^

The error being thrown:

    FAILED:
    libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj
    i686-w64-mingw32-gcc -m32 -Ilibqemu-riscv64-softmmu.fa.p -I. -I..
    -Itarget/riscv -I../target/riscv -Isubprojects/dtc/libfdt
    -I../subprojects/dtc/libfdt -Iqapi -Itrace -Iui -Iui/shader
    -I/usr/i686-w64-mingw32/sys-root/mingw/include/pixman-1
    -I/usr/i686-w64-mingw32/sys-root/mingw/include/glib-2.0
    -I/usr/i686-w64-mingw32/sys-root/mingw/lib/glib-2.0/include
    -fdiagnostics-color=auto -Wall -Winvalid-pch -Werror -std=gnu11
-O2 -g
    -fstack-protector-strong -Wundef -Wwrite-strings -Wmissing-prototypes
    -Wstrict-prototypes -Wredundant-decls -Wold-style-declaration
    -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k
    -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs
    -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2
    -Wmissing-format-attribute -Wno-missing-include-dirs
    -Wno-shift-negative-value -Wno-psabi -iquote . -iquote
    /builds/danielhb/qemu -iquote /builds/danielhb/qemu/include -iquote
    /builds/danielhb/qemu/host/include/i386 -iquote
    /builds/danielhb/qemu/host/include/generic -iquote
    /builds/danielhb/qemu/tcg/i386 -mms-bitfields -D_GNU_SOURCE
    -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing
    -fno-common -fwrapv -fno-pie -no-pie -DNEED_CPU_H
    '-DCONFIG_TARGET="riscv64-softmmu-config-target.h"'
    '-DCONFIG_DEVICES="riscv64-softmmu-config-devices.h"' -MD -MQ
    libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj -MF
libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj.d -o
    libqemu-riscv64-softmmu.fa.p/target_riscv_vcrypto_helper.c.obj -c
    ../target/riscv/vcrypto_helper.c
    ../target/riscv/vcrypto_helper.c: In function 'helper_vghsh_vv':
    ../target/riscv/vcrypto_helper.c:791:14: error: unknown type name
    'uint'; did you mean 'u_int'?
      791 |         for (uint j = 0; j < 128; j++) {
          |              ^~~~
          |              u_int
    ../target/riscv/vcrypto_helper.c: In function 'helper_vgmul_vv':
    ../target/riscv/vcrypto_helper.c:825:14: error: unknown type name
    'uint'; did you mean 'u_int'?
      825 |         for (uint j = 0; j < 128; j++) {
          |              ^~~~
          |              u_int
    [2503/3700] Compiling C object
    libqemu-riscv64-softmmu.fa.p/target_riscv_vector_helper.c.obj


+            if ((Y[j / 64] >> (j % 64)) & 1) {
+                Z[0] ^= H[0];
+                Z[1] ^= H[1];
+            }
+            bool reduce = ((H[1] >> 63) & 1);
+            H[1] = H[1] << 1 | H[0] >> 63;
+            H[0] = H[0] << 1;
+            if (reduce) {
+                H[0] ^= 0x87;
+            }
+        }
+
+        vd[i * 2 + 0] = brev8(Z[0]);
+        vd[i * 2 + 1] = brev8(Z[1]);
+    }
+    /* set tail elements to 1s */
+    vext_set_elems_1s(vd, vta, env->vl * 4, total_elems * 4);
+    env->vstart = 0;
+}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]