Skip to content

Commit 3e9b12b

Browse files
committed
Revert "Merge bitcoin/bitcoin#31826: random: Check GetRNDRRS is supported in InitHardwareRand to avoid infinite loop"
This reverts commit 1396400, reversing changes made to dc3a714.
1 parent 785649f commit 3e9b12b

File tree

1 file changed

+11
-34
lines changed

1 file changed

+11
-34
lines changed

src/random.cpp

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -192,24 +192,20 @@ uint64_t GetRdSeed() noexcept
192192
#elif defined(__aarch64__) && defined(HWCAP2_RNG)
193193

194194
bool g_rndr_supported = false;
195-
bool g_rndrrs_supported = false;
196195

197196
void InitHardwareRand()
198197
{
199198
if (getauxval(AT_HWCAP2) & HWCAP2_RNG) {
200199
g_rndr_supported = true;
201-
g_rndrrs_supported = VerifyRNDRRS();
202200
}
203201
}
204202

205203
void ReportHardwareRand()
206204
{
207205
// This must be done in a separate function, as InitHardwareRand() may be indirectly called
208206
// from global constructors, before logging is initialized.
209-
if (g_rndr_supported && g_rndrrs_supported) {
207+
if (g_rndr_supported) {
210208
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");
213209
}
214210
}
215211

@@ -231,43 +227,24 @@ uint64_t GetRNDR() noexcept
231227
return r1;
232228
}
233229

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+
*
245232
* Must only be called when RNDRRS is supported.
246233
*/
247234
uint64_t GetRNDRRS() noexcept
248235
{
236+
uint8_t ok = 0;
249237
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;
251243
__asm__ volatile("yield");
252-
}
244+
} while (true);
253245
return r1;
254246
}
255247

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-
271248
#else
272249
/* Access to other hardware random number generators could be added here later,
273250
* assuming it is sufficiently fast (in the order of a few hundred CPU cycles).
@@ -318,7 +295,7 @@ void SeedHardwareSlow(CSHA512& hasher) noexcept {
318295
return;
319296
}
320297
#elif defined(__aarch64__) && defined(HWCAP2_RNG)
321-
if (g_rndrrs_supported) {
298+
if (g_rndr_supported) {
322299
for (int i = 0; i < 4; ++i) {
323300
uint64_t out = GetRNDRRS();
324301
hasher.Write((const unsigned char*)&out, sizeof(out));

0 commit comments

Comments
 (0)