From: Harald Freudenberger <freude@linux.ibm.com>
To: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: qemu-s390x@nongnu.org, qemu-devel@nongnu.org, thuth@redhat.com,
david@redhat.com,
Richard Henderson <richard.henderson@linaro.org>,
Cornelia Huck <cohuck@redhat.com>,
Holger Dengler <dengler@linux.ibm.com>
Subject: Re: [PATCH v2] target/s390x: support PRNO_TRNG instruction
Date: Tue, 02 Aug 2022 13:54:31 +0200 [thread overview]
Message-ID: <c9b21f72ffa0415b31322ffc24ab438f@linux.ibm.com> (raw)
In-Reply-To: <20220719114307.102643-1-Jason@zx2c4.com>
On 2022-07-19 13:43, Jason A. Donenfeld wrote:
> In order for hosts running inside of TCG to initialize the kernel's
> random number generator, we should support the PRNO_TRNG instruction,
> backed in the usual way with the qemu_guest_getrandom helper. This is
> confirmed working on Linux 5.19-rc6.
>
> Cc: Thomas Huth <thuth@redhat.com>
> Cc: David Hildenbrand <david@redhat.com>
> Cc: Richard Henderson <richard.henderson@linaro.org>
> Cc: Cornelia Huck <cohuck@redhat.com>
> Cc: Harald Freudenberger <freude@linux.ibm.com>
> Cc: Holger Dengler <dengler@linux.ibm.com>
> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
> ---
> target/s390x/cpu_models.c | 2 --
> target/s390x/gen-features.c | 2 ++
> target/s390x/tcg/crypto_helper.c | 32 ++++++++++++++++++++++++++++++++
> 3 files changed, 34 insertions(+), 2 deletions(-)
>
> diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
> index 1a562d2801..90aac3d795 100644
> --- a/target/s390x/cpu_models.c
> +++ b/target/s390x/cpu_models.c
> @@ -421,8 +421,6 @@ static void check_consistency(const S390CPUModel
> *model)
> { S390_FEAT_DFP_FAST, S390_FEAT_DFP },
> { S390_FEAT_TRANSACTIONAL_EXE, S390_FEAT_STFLE_49 },
> { S390_FEAT_EDAT_2, S390_FEAT_EDAT},
> - { S390_FEAT_MSA_EXT_5, S390_FEAT_KIMD_SHA_512 },
> - { S390_FEAT_MSA_EXT_5, S390_FEAT_KLMD_SHA_512 },
> { S390_FEAT_MSA_EXT_4, S390_FEAT_MSA_EXT_3 },
> { S390_FEAT_SIE_CMMA, S390_FEAT_CMM },
> { S390_FEAT_SIE_CMMA, S390_FEAT_SIE_GSLS },
> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
> index ad140184b9..3d333e2789 100644
> --- a/target/s390x/gen-features.c
> +++ b/target/s390x/gen-features.c
> @@ -749,6 +749,8 @@ static uint16_t qemu_V7_0[] = {
> */
> static uint16_t qemu_MAX[] = {
> S390_FEAT_VECTOR_ENH2,
> + S390_FEAT_MSA_EXT_5,
> + S390_FEAT_PRNO_TRNG,
> };
>
> /****** END FEATURE DEFS ******/
> diff --git a/target/s390x/tcg/crypto_helper.c
> b/target/s390x/tcg/crypto_helper.c
> index 138d9e7ad9..dccce7f707 100644
> --- a/target/s390x/tcg/crypto_helper.c
> +++ b/target/s390x/tcg/crypto_helper.c
> @@ -12,12 +12,30 @@
>
> #include "qemu/osdep.h"
> #include "qemu/main-loop.h"
> +#include "qemu/guest-random.h"
> #include "s390x-internal.h"
> #include "tcg_s390x.h"
> #include "exec/helper-proto.h"
> #include "exec/exec-all.h"
> #include "exec/cpu_ldst.h"
>
> +static void fill_buf_random(CPUS390XState *env, uintptr_t ra,
> + uint64_t buf, uint64_t len)
> +{
> + uint8_t tmp[256];
> +
> + if (!(env->psw.mask & PSW_MASK_64))
> + len = (uint32_t)len;
> +
> + while (len) {
> + size_t block = MIN(len, sizeof(tmp));
> + qemu_guest_getrandom_nofail(tmp, block);
> + for (size_t i = 0; i < block; ++i)
> + cpu_stb_data_ra(env, wrap_address(env,
> buf++), tmp[i], ra);
> + len -= block;
> + }
> +}
> +
> uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2,
> uint32_t r3,
> uint32_t type)
> {
> @@ -52,6 +70,20 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t
> r1, uint32_t r2, uint32_t r3,
> cpu_stb_data_ra(env, param_addr, subfunc[i], ra);
> }
> break;
> + case 114:
> + if (r1 & 1 || !r1 || r2 & 1 || !r2) {
> + tcg_s390_program_interrupt(env, PGM_SPECIFICATION,
> ra);
> + break;
> + }
> +
> + fill_buf_random(env, ra, env->regs[r1], env->regs[r1 + 1]);
> + fill_buf_random(env, ra, env->regs[r2], env->regs[r2 + 1]);
> +
> + env->regs[r1] += env->regs[r1 + 1];
> + env->regs[r1 + 1] = 0;
> + env->regs[r2] += env->regs[r2 + 1];
> + env->regs[r2 + 1] = 0;
> + break;
> default:
> /* we don't implement any other subfunction yet */
> g_assert_not_reached();
I am absolutely no expert in this qemu code - in fact seen in just now
but
my feeling is that there should be some more than just handling then 114
subfunction.
For example something like this:
diff --git a/target/s390x/tcg/crypto_helper.c
b/target/s390x/tcg/crypto_helper.c
index 138d9e7ad9..a0163675b2 100644
--- a/target/s390x/tcg/crypto_helper.c
+++ b/target/s390x/tcg/crypto_helper.c
@@ -12,12 +12,30 @@
#include "qemu/osdep.h"
#include "qemu/main-loop.h"
+#include "qemu/guest-random.h"
#include "s390x-internal.h"
#include "tcg_s390x.h"
#include "exec/helper-proto.h"
#include "exec/exec-all.h"
#include "exec/cpu_ldst.h"
+static void fill_buf_random(CPUS390XState *env, uintptr_t ra,
+ uint64_t buf, uint64_t len)
+{
+ uint8_t tmp[256];
+
+ if (!(env->psw.mask & PSW_MASK_64))
+ len = (uint32_t)len;
+
+ while (len) {
+ size_t block = MIN(len, sizeof(tmp));
+ qemu_guest_getrandom_nofail(tmp, block);
+ for (size_t i = 0; i < block; ++i)
+ cpu_stb_data_ra(env, wrap_address(env, buf++),
tmp[i], ra);
+ len -= block;
+ }
+}
+
uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2,
uint32_t r3,
uint32_t type)
{
@@ -45,16 +63,39 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t
r1, uint32_t r2, uint32_t r3,
tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
}
- switch (fc) {
- case 0: /* query subfunction */
+ /* handle query subfunction */
+ if (fc == 0) {
for (i = 0; i < 16; i++) {
param_addr = wrap_address(env, env->regs[1] + i);
cpu_stb_data_ra(env, param_addr, subfunc[i], ra);
}
+ return 0;
+ }
+
+ switch (type) {
+ case S390_FEAT_PRNO_TRNG:
+ switch (fc) {
+ case 114: /* CPACF_PRNO_TRNG */
+ if (r1 & 1 || !r1 || r2 & 1 || !r2) {
+ tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
+ break;
+ }
+ fill_buf_random(env, ra, env->regs[r1], env->regs[r1 + 1]);
+ fill_buf_random(env, ra, env->regs[r2], env->regs[r2 + 1]);
+ env->regs[r1] += env->regs[r1 + 1];
+ env->regs[r1 + 1] = 0;
+ env->regs[r2] += env->regs[r2 + 1];
+ env->regs[r2 + 1] = 0;
+ break;
+ default:
+ /* we don't implement any other subfunctions yet */
+ g_assert_not_reached();
+ }
break;
default:
- /* we don't implement any other subfunction yet */
- g_assert_not_reached();
+ /* we don't implement any other functions yet */
+ g_assert_not_reached();
+ }
}
return 0;
And ... it is valid to have each of the two buffer pointers NULL. Not
sure
how this env->regs[x] thing here handles this.
next prev parent reply other threads:[~2022-08-02 13:00 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-12 16:46 [PATCH qemu] target/s390x: support PRNO_TRNG instruction Jason A. Donenfeld
2022-07-19 9:54 ` David Hildenbrand
2022-07-19 11:23 ` Jason A. Donenfeld
2022-07-19 11:43 ` [PATCH v2] " Jason A. Donenfeld
2022-07-20 11:43 ` David Hildenbrand
2022-07-20 11:58 ` Jason A. Donenfeld
2022-07-20 12:08 ` [PATCH v3] " Jason A. Donenfeld
2022-07-20 18:41 ` David Hildenbrand
2022-07-20 19:44 ` Jason A. Donenfeld
2022-07-27 1:35 ` Jason A. Donenfeld
2022-07-27 6:32 ` Thomas Huth
2022-07-27 11:58 ` Jason A. Donenfeld
2022-08-02 13:26 ` Christian Borntraeger
2022-08-02 13:54 ` David Hildenbrand
2022-08-02 14:01 ` Christian Borntraeger
2022-08-02 14:53 ` David Hildenbrand
2022-08-02 15:15 ` Christian Borntraeger
2022-08-02 15:16 ` David Hildenbrand
2022-08-02 15:28 ` Jason A. Donenfeld
2022-08-02 15:32 ` David Hildenbrand
2022-08-02 18:59 ` Jason A. Donenfeld
2022-08-02 19:00 ` [PATCH v4 0/2] MSA EXT 5 for s390x Jason A. Donenfeld
2022-08-02 19:00 ` [PATCH v4 1/2] target/s390x: support PRNO_TRNG instruction Jason A. Donenfeld
2022-08-02 19:00 ` [PATCH v4 2/2] target/s390x: support SHA-512 extensions Jason A. Donenfeld
2022-08-03 11:55 ` David Hildenbrand
2022-08-03 12:14 ` Jason A. Donenfeld
2022-08-03 12:47 ` Jason A. Donenfeld
2022-08-03 12:51 ` [PATCH v5 1/2] target/s390x: support PRNO_TRNG instruction Jason A. Donenfeld
2022-08-03 12:51 ` [PATCH v5 2/2] target/s390x: support SHA-512 extensions Jason A. Donenfeld
2022-08-03 17:15 ` [PATCH 1/2] target/s390x: support PRNO_TRNG instruction Jason A. Donenfeld
2022-08-03 17:15 ` [PATCH 2/2] target/s390x: support SHA-512 extensions Jason A. Donenfeld
2022-08-03 17:15 ` [PATCH v6 1/2] target/s390x: support PRNO_TRNG instruction Jason A. Donenfeld
2022-08-03 17:15 ` [PATCH v6 2/2] target/s390x: support SHA-512 extensions Jason A. Donenfeld
2022-08-05 11:28 ` David Hildenbrand
2022-08-05 13:01 ` Jason A. Donenfeld
2022-08-09 15:03 ` [PATCH v7 1/2] " Jason A. Donenfeld
2022-08-09 15:03 ` [PATCH v7 2/2] target/s390x: support PRNO_TRNG instruction Jason A. Donenfeld
2022-08-26 11:28 ` Thomas Huth
2022-08-29 16:29 ` Jason A. Donenfeld
2022-09-21 10:59 ` Thomas Huth
2022-08-26 10:21 ` [PATCH v7 1/2] target/s390x: support SHA-512 extensions Thomas Huth
2022-08-29 16:27 ` Jason A. Donenfeld
2022-08-11 16:37 ` [PATCH v6 2/2] " David Hildenbrand
2022-08-04 6:51 ` [PATCH v4 " Harald Freudenberger
2022-08-04 6:56 ` Christian Borntraeger
2022-08-04 12:09 ` Jason A. Donenfeld
2022-08-04 8:10 ` David Hildenbrand
2022-08-04 12:07 ` Jason A. Donenfeld
2022-08-02 17:55 ` [PATCH v3] target/s390x: support PRNO_TRNG instruction Jason A. Donenfeld
2022-07-20 18:01 ` [PATCH v2] " David Hildenbrand
2022-08-02 11:54 ` Harald Freudenberger [this message]
2022-07-19 10:00 ` [PATCH qemu] " Thomas Huth
2022-07-19 11:27 ` Jason A. Donenfeld
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=c9b21f72ffa0415b31322ffc24ab438f@linux.ibm.com \
--to=freude@linux.ibm.com \
--cc=Jason@zx2c4.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=dengler@linux.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@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 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.