@samitouri / QOSamiQemu / commits / fcc2699d41

target/s390x: Have MSA helper pass a mmu_idx argument

Next commit will use the cpu_ld/st_mmu() API and thus will also use a @mmu_idx. In order to keep it simple to review, propate @mmu_idx in a preliminary step. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com> Message-Id: <20260423135035.50126-8-philmd@linaro.org>

Philippe Mathieu-Daudé committed Apr 23, 2026 at 12:25 UTC fcc2699d41ede314e76c9f0fe5ddb5a1156620ae
1 file changed +22 -19
target/s390x/tcg/crypto_helper.c
+22 -19
@@ -18,6 +18,7 @@
18 #include "tcg_s390x.h"
19 #include "exec/helper-proto.h"
20 #include "accel/tcg/cpu-ldst.h"
21 +#include "accel/tcg/cpu-mmu-index.h"
22
23 static uint64_t R(uint64_t x, int c)
24 {
@@ -119,8 +120,8 @@ static void sha512_bda_be64(uint64_t a[8], uint64_t w[16])
120 sha512_bda(a, t);
121 }
122
122 -static void sha512_read_icv(CPUS390XState *env, uint64_t addr,
123 - uint64_t a[8], uintptr_t ra)
123 +static void sha512_read_icv(CPUS390XState *env, const int mmu_idx,
124 + uint64_t addr, uint64_t a[8], uintptr_t ra)
125 {
126 int i;
127
@@ -130,8 +131,8 @@ static void sha512_read_icv(CPUS390XState *env, uint64_t addr,
131 }
132 }
133
133 -static void sha512_write_ocv(CPUS390XState *env, uint64_t addr,
134 - uint64_t a[8], uintptr_t ra)
134 +static void sha512_write_ocv(CPUS390XState *env, const int mmu_idx,
135 + uint64_t addr, uint64_t a[8], uintptr_t ra)
136 {
137 int i;
138
@@ -141,8 +142,8 @@ static void sha512_write_ocv(CPUS390XState *env, uint64_t addr,
142 }
143 }
144
144 -static void sha512_read_block(CPUS390XState *env, uint64_t addr,
145 - uint64_t a[16], uintptr_t ra)
145 +static void sha512_read_block(CPUS390XState *env, const int mmu_idx,
146 + uint64_t addr, uint64_t a[16], uintptr_t ra)
147 {
148 int i;
149
@@ -152,8 +153,8 @@ static void sha512_read_block(CPUS390XState *env, uint64_t addr,
153 }
154 }
155
155 -static void sha512_read_mbl_be64(CPUS390XState *env, uint64_t addr,
156 - uint8_t a[16], uintptr_t ra)
156 +static void sha512_read_mbl_be64(CPUS390XState *env, const int mmu_idx,
157 + uint64_t addr, uint8_t a[16], uintptr_t ra)
158 {
159 int i;
160
@@ -163,8 +164,9 @@ static void sha512_read_mbl_be64(CPUS390XState *env, uint64_t addr,
164 }
165 }
166
166 -static int cpacf_sha512(CPUS390XState *env, uintptr_t ra, uint64_t param_addr,
167 - uint64_t *message_reg, uint64_t *len_reg, uint32_t type)
167 +static int cpacf_sha512(CPUS390XState *env, const int mmu_idx, uintptr_t ra,
168 + uint64_t param_addr, uint64_t *message_reg,
169 + uint64_t *len_reg, uint32_t type)
170 {
171 enum { MAX_BLOCKS_PER_RUN = 64 }; /* Arbitrary: keep interactivity. */
172 uint64_t len = *len_reg, a[8], processed = 0;
@@ -182,7 +184,7 @@ static int cpacf_sha512(CPUS390XState *env, uintptr_t ra, uint64_t param_addr,
184 tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
185 }
186
185 - sha512_read_icv(env, param_addr, a, ra);
187 + sha512_read_icv(env, mmu_idx, param_addr, a, ra);
188
189 /* Process full blocks first. */
190 for (; len >= 128; len -= 128, processed += 128) {
@@ -192,7 +194,7 @@ static int cpacf_sha512(CPUS390XState *env, uintptr_t ra, uint64_t param_addr,
194 break;
195 }
196
195 - sha512_read_block(env, *message_reg + processed, w, ra);
197 + sha512_read_block(env, mmu_idx, *message_reg + processed, w, ra);
198 sha512_bda(a, w);
199 }
200
@@ -215,13 +217,13 @@ static int cpacf_sha512(CPUS390XState *env, uintptr_t ra, uint64_t param_addr,
217 * or use an additional one.
218 */
219 if (len < 112) {
218 - sha512_read_mbl_be64(env, param_addr + 64, x + 112, ra);
220 + sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, ra);
221 }
222 sha512_bda_be64(a, (uint64_t *)x);
223
224 if (len >= 112) {
225 memset(x, 0, 112);
224 - sha512_read_mbl_be64(env, param_addr + 64, x + 112, ra);
226 + sha512_read_mbl_be64(env, mmu_idx, param_addr + 64, x + 112, ra);
227 sha512_bda_be64(a, (uint64_t *)x);
228 }
229
@@ -236,14 +238,14 @@ static int cpacf_sha512(CPUS390XState *env, uintptr_t ra, uint64_t param_addr,
238 * TODO: if writing fails halfway through (e.g., when crossing page
239 * boundaries), we're in trouble. We'd need something like access_prepare().
240 */
239 - sha512_write_ocv(env, param_addr, a, ra);
241 + sha512_write_ocv(env, mmu_idx, param_addr, a, ra);
242 *message_reg = deposit64(*message_reg, 0, message_reg_len,
243 *message_reg + processed);
244 *len_reg -= processed;
245 return !len ? 0 : 3;
246 }
247
246 -static void fill_buf_random(CPUS390XState *env, uintptr_t ra,
248 +static void fill_buf_random(CPUS390XState *env, const int mmu_idx, uintptr_t ra,
249 uint64_t *buf_reg, uint64_t *len_reg)
250 {
251 uint8_t tmp[256];
@@ -271,6 +273,7 @@ static void fill_buf_random(CPUS390XState *env, uintptr_t ra,
273 uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_t r3,
274 uint32_t type)
275 {
276 + const int mmu_idx = cpu_mmu_index(env_cpu(env), false);
277 const uintptr_t ra = GETPC();
278 const uint8_t mod = env->regs[0] & 0x80ULL;
279 const uint8_t fc = env->regs[0] & 0x7fULL;
@@ -303,11 +306,11 @@ uint32_t HELPER(msa)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_t r3,
306 }
307 break;
308 case 3: /* CPACF_*_SHA_512 */
306 - return cpacf_sha512(env, ra, env->regs[1], &env->regs[r2],
309 + return cpacf_sha512(env, mmu_idx, ra, env->regs[1], &env->regs[r2],
310 &env->regs[r2 + 1], type);
311 case 114: /* CPACF_PRNO_TRNG */
309 - fill_buf_random(env, ra, &env->regs[r1], &env->regs[r1 + 1]);
310 - fill_buf_random(env, ra, &env->regs[r2], &env->regs[r2 + 1]);
312 + fill_buf_random(env, mmu_idx, ra, &env->regs[r1], &env->regs[r1 + 1]);
313 + fill_buf_random(env, mmu_idx, ra, &env->regs[r2], &env->regs[r2 + 1]);
314 break;
315 default:
316 /* we don't implement any other subfunction yet */