Quellcode durchsuchen

Kernel: Use existing assembly snippets for x86-64 RDSEED & RDRAND calls

konrad vor 2 Jahren
Ursprung
Commit
d7d233ab04
1 geänderte Dateien mit 9 neuen und 19 gelöschten Zeilen
  1. 9 19
      Kernel/Random.cpp

+ 9 - 19
Kernel/Random.cpp

@@ -29,27 +29,17 @@ KernelRng& KernelRng::the()
 UNMAP_AFTER_INIT KernelRng::KernelRng()
 {
 #if ARCH(X86_64)
-    bool supports_rdseed = Processor::current().has_feature(CPUFeature::RDSEED);
-    bool supports_rdrand = Processor::current().has_feature(CPUFeature::RDRAND);
-    if (supports_rdseed || supports_rdrand) {
-        dmesgln("KernelRng: Using RDSEED or RDRAND as entropy source");
+    if (Processor::current().has_feature(CPUFeature::RDSEED)) {
+        dmesgln("KernelRng: Using RDSEED as entropy source");
+
         for (size_t i = 0; i < pool_count * reseed_threshold; ++i) {
-            u32 value = 0;
-            if (supports_rdseed) {
-                asm volatile(
-                    "1:\n"
-                    "rdseed %0\n"
-                    "jnc 1b\n"
-                    : "=r"(value));
-            } else {
-                asm volatile(
-                    "1:\n"
-                    "rdrand %0\n"
-                    "jnc 1b\n"
-                    : "=r"(value));
-            }
+            add_random_event(Kernel::rdseed(), i % 32);
+        }
+    } else if (Processor::current().has_feature(CPUFeature::RDRAND)) {
+        dmesgln("KernelRng: Using RDRAND as entropy source");
 
-            add_random_event(value, i % 32);
+        for (size_t i = 0; i < pool_count * reseed_threshold; ++i) {
+            add_random_event(Kernel::rdrand(), i % 32);
         }
     } else if (TimeManagement::the().can_query_precise_time()) {
         // Add HPET as entropy source if we don't have anything better.