diff options
| author | Michael Brown | 2021-05-12 11:55:17 +0200 |
|---|---|---|
| committer | Michael Brown | 2021-05-12 12:03:01 +0200 |
| commit | a6a8bb1a9a58becb82dfacc7bc27cf645d0e216c (patch) | |
| tree | 9e38c4c1d3508b6821a3f70a96f2fee03889876d /src/arch/x86 | |
| parent | [rng] Check for TSC support before using RTC entropy source (diff) | |
| download | ipxe-a6a8bb1a9a58becb82dfacc7bc27cf645d0e216c.tar.gz ipxe-a6a8bb1a9a58becb82dfacc7bc27cf645d0e216c.tar.xz ipxe-a6a8bb1a9a58becb82dfacc7bc27cf645d0e216c.zip | |
[undi] Read TSC only when profiling
Avoid using the "rdtsc" instruction unless profiling is enabled. This
allows the non-debug build of the UNDI driver to be used on a CPU such
as a 486 that does not support the TSC.
Reported-by: Nikolai Zhubr <n-a-zhubr@yandex.ru>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/x86')
| -rw-r--r-- | src/arch/x86/drivers/net/undinet.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/arch/x86/drivers/net/undinet.c b/src/arch/x86/drivers/net/undinet.c index 9b7d6d849..43cb18bfe 100644 --- a/src/arch/x86/drivers/net/undinet.c +++ b/src/arch/x86/drivers/net/undinet.c @@ -104,6 +104,13 @@ static union u_PXENV_ANY __bss16 ( undinet_params ); SEGOFF16_t __bss16 ( undinet_entry_point ); #define undinet_entry_point __use_data16 ( undinet_entry_point ) +/* Read TSC in real mode only when profiling */ +#if PROFILING +#define RDTSC_IF_PROFILING "rdtsc\n\t" +#else +#define RDTSC_IF_PROFILING "" +#endif + /** IRQ profiler */ static struct profiler undinet_irq_profiler __profiler = { .name = "undinet.irq" }; @@ -288,14 +295,14 @@ static int undinet_call ( struct undi_nic *undinic, unsigned int function, */ profile_start ( &profiler->total ); __asm__ __volatile__ ( REAL_CODE ( "pushl %%ebp\n\t" /* gcc bug */ - "rdtsc\n\t" + RDTSC_IF_PROFILING "pushl %%eax\n\t" "pushw %%es\n\t" "pushw %%di\n\t" "pushw %%bx\n\t" "lcall *undinet_entry_point\n\t" "movw %%ax, %%bx\n\t" - "rdtsc\n\t" + RDTSC_IF_PROFILING "addw $6, %%sp\n\t" "popl %%edx\n\t" "popl %%ebp\n\t" /* gcc bug */ ) |
