223 quint32 *end = scratch;
225 auto foldPointer = [](quintptr v) {
226 if (
sizeof(quintptr) ==
sizeof(quint32)) {
234 return quint32(v >> (32 - 24));
240 *end++ = foldPointer(quintptr(&seed));
241 *end++ = foldPointer(quintptr(&scratch));
242 *end++ = foldPointer(quintptr(&errno));
243 *end++ = foldPointer(quintptr(
reinterpret_cast<
void*>(strerror)));
245#ifndef QT_BOOTSTRAPPED
246 quint64 nsecs = QDeadlineTimer::current(Qt::PreciseTimer).deadline();
247 *end++ = quint32(nsecs);
250 if (quint32 v = seed.loadRelaxed())
253#if QT_CONFIG(getauxval)
258 ulong auxvSeed = getauxval(AT_RANDOM);
260 memcpy(end,
reinterpret_cast<
void *>(auxvSeed), 16);
270 ulong base = getauxval(AT_BASE);
272 *end++ = foldPointer(base);
274# ifdef AT_SYSINFO_EHDR
276 ulong sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
278 *end++ = foldPointer(sysinfo_ehdr);
285 std::seed_seq sseq(scratch, end);
286 std::mt19937 generator(sseq);
287 std::generate(ptr, ptr + left, generator);
289 fallback_update_seed(*ptr);
296 quint32 *buffer = begin;
297 qsizetype count = end - begin;
299 if (Q_UNLIKELY(uint(qt_randomdevice_control.loadAcquire()) &
SetRandomData)) {
300 uint value = uint(qt_randomdevice_control.loadAcquire()) &
RandomDataMask;
301 std::fill_n(buffer, count, value);
305 qsizetype filled = 0;
306 if ((uint(qt_randomdevice_control.loadAcquire()) &
SkipSystemRNG) == 0) {
307 qsizetype bytesFilled =
308 fillBuffer(buffer + filled, (count - filled) * qsizetype(
sizeof(*buffer)));
309 filled += bytesFilled / qsizetype(
sizeof(*buffer));
312 fallback_update_seed(*buffer);
314 if (Q_UNLIKELY(filled != count)) {
316 fallback_fill(buffer + filled, count - filled);
1298#if QT_CONFIG(getauxval) && defined(AT_RANDOM)
1299 auto at_random_ptr =
reinterpret_cast<size_t *>(getauxval(AT_RANDOM));
1301 return qFromUnaligned<QRandomGenerator::InitialRandomData>(at_random_ptr);
1306 QRandomGenerator::InitialRandomData v;
1307 for (
int attempts = 16; attempts; --attempts) {
1309 auto fillBuffer = &Generator::fillBuffer;
1310 if (callFillBuffer<Generator>(fillBuffer, &v) !=
sizeof(v))
1316 quint32 data[
sizeof(v) /
sizeof(quint32)];
1317 fallback_fill(data,
std::size(data));
1318 memcpy(v.data, data,
sizeof(v.data));