[ipxe-devel] [PATCH 1/1] efi: provide possibility to disable cpu_nap
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed Jul 12 17:45:08 UTC 2017
U-Boot runs single-threaded without interrupts.
When cpu_nap is called the process is never woken up again.
With the patch we can use environment variable CPUNONAP
to disable cpu_nap when building iPXE, e.g.
CPUNONAP=1
Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
src/Makefile.housekeeping | 5 +++++
src/core/console.c | 2 ++
src/core/gdbudp.c | 2 ++
src/core/getkey.c | 2 ++
src/core/timer.c | 2 ++
src/doc/build_sys.dox | 13 +++++++++++++
6 files changed, 26 insertions(+)
diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping
index f09db372..2c47f691 100644
--- a/src/Makefile.housekeeping
+++ b/src/Makefile.housekeeping
@@ -769,6 +769,11 @@ ifneq ($(PROFILE),)
CFLAGS += -DPROFILING=$(PROFILE)
endif
+# Do not let the cpu sleep when waiting for input
+ifneq ($(CPUNONAP),)
+CFLAGS += -DCPUNONAP=1
+endif
+
include/ipxe/profile.h : $(PROFILE_LIST)
$(Q)$(TOUCH) $@
diff --git a/src/core/console.c b/src/core/console.c
index 7fd00036..1cab3db8 100644
--- a/src/core/console.c
+++ b/src/core/console.c
@@ -98,7 +98,9 @@ int getchar ( void ) {
* makes Etherboot waiting for user interaction waste a lot
* less CPU time in a VMware session.
*/
+#ifndef CPUNODEF
cpu_nap();
+#endif
/* Keep processing background tasks while we wait for
* input.
diff --git a/src/core/gdbudp.c b/src/core/gdbudp.c
index e4613d13..af23f859 100644
--- a/src/core/gdbudp.c
+++ b/src/core/gdbudp.c
@@ -156,7 +156,9 @@ static size_t gdbudp_recv ( char *buf, size_t len ) {
bad_packet:
free_iob ( iob );
}
+#ifndef CPUNODEF
cpu_nap();
+#endif
}
}
diff --git a/src/core/getkey.c b/src/core/getkey.c
index 0c280d23..f515c340 100644
--- a/src/core/getkey.c
+++ b/src/core/getkey.c
@@ -51,7 +51,9 @@ static int getchar_timeout ( unsigned long timeout ) {
step();
if ( iskey() )
return getchar();
+#ifndef CPUNONAP
cpu_nap();
+#endif
}
return -1;
diff --git a/src/core/timer.c b/src/core/timer.c
index 24745cef..720966fa 100644
--- a/src/core/timer.c
+++ b/src/core/timer.c
@@ -106,7 +106,9 @@ static unsigned int sleep_interruptible ( unsigned int secs,
step();
if ( interrupted && interrupted() )
return secs;
+#ifndef CPUNONAP
cpu_nap();
+#endif
}
start = now;
}
diff --git a/src/doc/build_sys.dox b/src/doc/build_sys.dox
index 9466f662..28350c46 100644
--- a/src/doc/build_sys.dox
+++ b/src/doc/build_sys.dox
@@ -77,6 +77,19 @@ You can see the full list of object files that will be built using
@endcode
+ at subsection comp_envir Environment variables influencing compilation
+
+In some loops function cpu_nap() is used to wait for an interrupt.
+In single threaded environments without interrupt like U-Boot EFI
+iPXE will never be woken up. cpu_nap() can be disabled by defining
+the following environment variable value before calling make:
+
+ at code
+
+ CPUNONAP=1
+
+ at endcode
+
@subsection comp_ar After compilation
Once all objects have been compiled, they will be collected into a
--
2.11.0
More information about the ipxe-devel
mailing list