]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[undi] Read TSC only when profiling
authorMichael Brown <mcb30@ipxe.org>
Wed, 12 May 2021 09:55:17 +0000 (10:55 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 12 May 2021 10:03:01 +0000 (11:03 +0100)
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>
src/arch/x86/drivers/net/undinet.c

index 9b7d6d8492707efbd81a078dfe985771cbc16358..43cb18bfe106b77f99e80d619b260c5735cf8d45 100644 (file)
@@ -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 */ )