1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:28:12 +00:00

Kernel: Use HPET as entropy source if CPU doesn't support RDRAND

We don't have anything better for these CPUs for now.
This commit is contained in:
Maciej Zygmanowski 2021-01-22 17:11:08 +01:00 committed by Andreas Kling
parent ceb5682b54
commit 0a61924727

View file

@ -29,6 +29,7 @@
#include <Kernel/Arch/i386/CPU.h>
#include <Kernel/Devices/RandomDevice.h>
#include <Kernel/Random.h>
#include <Kernel/Time/HPET.h>
#include <Kernel/Time/TimeManagement.h>
namespace Kernel {
@ -45,6 +46,7 @@ KernelRng::KernelRng()
bool supports_rdseed = Processor::current().has_feature(CPUFeature::RDSEED);
bool supports_rdrand = Processor::current().has_feature(CPUFeature::RDRAND);
if (supports_rdseed || supports_rdrand) {
klog() << "KernelRng: Using RDSEED or RDRAND as entropy source";
for (size_t i = 0; i < resource().pool_count * resource().reseed_threshold; ++i) {
u32 value = 0;
if (supports_rdseed) {
@ -63,6 +65,14 @@ KernelRng::KernelRng()
this->resource().add_random_event(value, i % 32);
}
} else {
// Add HPET as entropy source if we don't have anything better.
klog() << "KernelRng: Using HPET as entropy source (bad!)";
for (size_t i = 0; i < resource().pool_count * resource().reseed_threshold; ++i) {
u64 hpet_time = HPET::the().read_main_counter();
this->resource().add_random_event(hpet_time, i % 32);
}
}
}