@@ -192,24 +192,20 @@ uint64_t GetRdSeed() noexcept
192
192
#elif defined(__aarch64__) && defined(HWCAP2_RNG)
193
193
194
194
bool g_rndr_supported = false ;
195
- bool g_rndrrs_supported = false ;
196
195
197
196
void InitHardwareRand ()
198
197
{
199
198
if (getauxval (AT_HWCAP2) & HWCAP2_RNG) {
200
199
g_rndr_supported = true ;
201
- g_rndrrs_supported = VerifyRNDRRS ();
202
200
}
203
201
}
204
202
205
203
void ReportHardwareRand ()
206
204
{
207
205
// This must be done in a separate function, as InitHardwareRand() may be indirectly called
208
206
// from global constructors, before logging is initialized.
209
- if (g_rndr_supported && g_rndrrs_supported ) {
207
+ if (g_rndr_supported) {
210
208
LogPrintf (" Using RNDR and RNDRRS as additional entropy sources\n " );
211
- } else if (g_rndr_supported) {
212
- LogPrintf (" Using RNDR as an additional entropy source\n " );
213
209
}
214
210
}
215
211
@@ -231,43 +227,24 @@ uint64_t GetRNDR() noexcept
231
227
return r1;
232
228
}
233
229
234
- // Helper function to retrieve random value using RNDRRS
235
- bool GetRNDRRSInternal (uint64_t &r1) noexcept
236
- {
237
- uint8_t ok = 0 ;
238
- __asm__ volatile (" mrs %0, s3_3_c2_c4_1; cset %w1, ne;"
239
- : " =r" (r1), " =r" (ok)::" cc" );
240
- return ok != 0 ;
241
- }
242
-
243
-
244
- /* * Read 64 bits of entropy using RNDRRS.
230
+ /* * Read 64 bits of entropy using rndrrs.
231
+ *
245
232
* Must only be called when RNDRRS is supported.
246
233
*/
247
234
uint64_t GetRNDRRS () noexcept
248
235
{
236
+ uint8_t ok = 0 ;
249
237
uint64_t r1;
250
- while (!GetRNDRRSInternal (r1)) {
238
+ do {
239
+ // https://developer.arm.com/documentation/ddi0601/2022-12/AArch64-Registers/RNDRRS--Reseeded-Random-Number
240
+ __asm__ volatile (" mrs %0, s3_3_c2_c4_1; cset %w1, ne;"
241
+ : " =r" (r1), " =r" (ok)::" cc" );
242
+ if (ok) break ;
251
243
__asm__ volatile (" yield" );
252
- }
244
+ } while ( true );
253
245
return r1;
254
246
}
255
247
256
- /* * Verify if RNDRRS is supported and functional.
257
- * Return true if it works within the retry limit.
258
- */
259
- bool VerifyRNDRRS () noexcept
260
- {
261
- uint64_t test;
262
- for (int retry = 0 ; retry < 10 ; ++retry) {
263
- if (GetRNDRRSInternal (test)) {
264
- return true ;
265
- }
266
- __asm__ volatile (" yield" );
267
- }
268
- return false ;
269
- }
270
-
271
248
#else
272
249
/* Access to other hardware random number generators could be added here later,
273
250
* assuming it is sufficiently fast (in the order of a few hundred CPU cycles).
@@ -318,7 +295,7 @@ void SeedHardwareSlow(CSHA512& hasher) noexcept {
318
295
return ;
319
296
}
320
297
#elif defined(__aarch64__) && defined(HWCAP2_RNG)
321
- if (g_rndrrs_supported ) {
298
+ if (g_rndr_supported ) {
322
299
for (int i = 0 ; i < 4 ; ++i) {
323
300
uint64_t out = GetRNDRRS ();
324
301
hasher.Write ((const unsigned char *)&out, sizeof (out));
0 commit comments