]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[rng] Check for TSC support before using RTC entropy source
authorMichael Brown <mcb30@ipxe.org>
Wed, 12 May 2021 09:24:00 +0000 (10:24 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 12 May 2021 09:24:00 +0000 (10:24 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/include/ipxe/cpuid.h
src/arch/x86/interface/pcbios/rtc_entropy.c

index b5403bd9d4aa046a252c0715cac72f9d3840a672..3983dfb896f3409a4b518d9cb1bb055750dcfa86 100644 (file)
@@ -42,6 +42,9 @@ struct x86_features {
 /** Hypervisor is present */
 #define CPUID_FEATURES_INTEL_ECX_HYPERVISOR 0x80000000UL
 
+/** TSC is present */
+#define CPUID_FEATURES_INTEL_EDX_TSC 0x00000010UL
+
 /** FXSAVE and FXRSTOR are supported */
 #define CPUID_FEATURES_INTEL_EDX_FXSR 0x01000000UL
 
index e9e6baa591b79e60aa112c6f466b3c6285587adb..e0c17568537aebdaf2a301b5c98b9808820d7e0f 100644 (file)
@@ -36,6 +36,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <biosint.h>
 #include <pic8259.h>
 #include <rtc.h>
+#include <ipxe/cpuid.h>
 #include <ipxe/entropy.h>
 
 /** Maximum time to wait for an RTC interrupt, in milliseconds */
@@ -174,8 +175,17 @@ static int rtc_entropy_check ( void ) {
  * @ret rc             Return status code
  */
 static int rtc_entropy_enable ( void ) {
+       struct x86_features features;
        int rc;
 
+       /* Check that TSC is supported */
+       x86_features ( &features );
+       if ( ! ( features.intel.edx & CPUID_FEATURES_INTEL_EDX_TSC ) ) {
+               DBGC ( &rtc_flag, "RTC has no TSC\n" );
+               rc = -ENOTSUP;
+               goto err_no_tsc;
+       }
+
        /* Hook ISR and enable RTC interrupts */
        rtc_hook_isr();
        enable_irq ( RTC_IRQ );
@@ -191,6 +201,7 @@ static int rtc_entropy_enable ( void ) {
        rtc_disable_int();
        disable_irq ( RTC_IRQ );
        rtc_unhook_isr();
+ err_no_tsc:
        return rc;
 }