mirror of https://github.com/ipxe/ipxe.git
[rng] Check for TSC support before using RTC entropy source
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/373/head
parent
13c1abe10a
commit
05fcf1a2f0
|
@ -42,6 +42,9 @@ struct x86_features {
|
||||||
/** Hypervisor is present */
|
/** Hypervisor is present */
|
||||||
#define CPUID_FEATURES_INTEL_ECX_HYPERVISOR 0x80000000UL
|
#define CPUID_FEATURES_INTEL_ECX_HYPERVISOR 0x80000000UL
|
||||||
|
|
||||||
|
/** TSC is present */
|
||||||
|
#define CPUID_FEATURES_INTEL_EDX_TSC 0x00000010UL
|
||||||
|
|
||||||
/** FXSAVE and FXRSTOR are supported */
|
/** FXSAVE and FXRSTOR are supported */
|
||||||
#define CPUID_FEATURES_INTEL_EDX_FXSR 0x01000000UL
|
#define CPUID_FEATURES_INTEL_EDX_FXSR 0x01000000UL
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#include <biosint.h>
|
#include <biosint.h>
|
||||||
#include <pic8259.h>
|
#include <pic8259.h>
|
||||||
#include <rtc.h>
|
#include <rtc.h>
|
||||||
|
#include <ipxe/cpuid.h>
|
||||||
#include <ipxe/entropy.h>
|
#include <ipxe/entropy.h>
|
||||||
|
|
||||||
/** Maximum time to wait for an RTC interrupt, in milliseconds */
|
/** 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
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int rtc_entropy_enable ( void ) {
|
static int rtc_entropy_enable ( void ) {
|
||||||
|
struct x86_features features;
|
||||||
int rc;
|
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 */
|
/* Hook ISR and enable RTC interrupts */
|
||||||
rtc_hook_isr();
|
rtc_hook_isr();
|
||||||
enable_irq ( RTC_IRQ );
|
enable_irq ( RTC_IRQ );
|
||||||
|
@ -191,6 +201,7 @@ static int rtc_entropy_enable ( void ) {
|
||||||
rtc_disable_int();
|
rtc_disable_int();
|
||||||
disable_irq ( RTC_IRQ );
|
disable_irq ( RTC_IRQ );
|
||||||
rtc_unhook_isr();
|
rtc_unhook_isr();
|
||||||
|
err_no_tsc:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue