summaryrefslogtreecommitdiffstats
path: root/src/arch/x86/interface
diff options
context:
space:
mode:
authorMichael Brown2021-05-12 11:24:00 +0200
committerMichael Brown2021-05-12 11:24:00 +0200
commit05fcf1a2f0809b8d87ca5affea1f1bfe0996235b (patch)
treebfa6c7eb41d6f0879f2fa33f7926d30f480fedbe /src/arch/x86/interface
parent[prefix] Specify i486 architecture for LZMA decompressor (diff)
downloadipxe-05fcf1a2f0809b8d87ca5affea1f1bfe0996235b.tar.gz
ipxe-05fcf1a2f0809b8d87ca5affea1f1bfe0996235b.tar.xz
ipxe-05fcf1a2f0809b8d87ca5affea1f1bfe0996235b.zip
[rng] Check for TSC support before using RTC entropy source
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/x86/interface')
-rw-r--r--src/arch/x86/interface/pcbios/rtc_entropy.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/arch/x86/interface/pcbios/rtc_entropy.c b/src/arch/x86/interface/pcbios/rtc_entropy.c
index e9e6baa59..e0c175685 100644
--- a/src/arch/x86/interface/pcbios/rtc_entropy.c
+++ b/src/arch/x86/interface/pcbios/rtc_entropy.c
@@ -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;
}