[U-Boot] [PATCH 1/2] x86: Add a 'pause' instruction in __udelay() for QEMU target
Bin Meng
bmeng.cn at gmail.com
Mon Jul 27 13:16:07 CEST 2015
From: Miao Yan <yanmiaobest at gmail.com>
When running SMP configuration on QEMU (tcg mode, no kvm), there is
a busy loop in start_aps(), calling udelay(), that waits for APs to
show up online. However, there is a chance that VCPU1 will be timeout
waiting, IOW the secondary VCPUs haven't started their execution yet.
This patch adds a 'pause' instruction in __udelay() only for QEMU
target, to give other VCPUs a chance to run. When QEMU sees the
'pause' instruction, it will yeild the execution to other CPUs.
Signed-off-by: Miao Yan <yanmiaobest at gmail.com>
Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
---
arch/x86/lib/tsc_timer.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/x86/lib/tsc_timer.c b/arch/x86/lib/tsc_timer.c
index 7f5ba2c..0df1af2 100644
--- a/arch/x86/lib/tsc_timer.c
+++ b/arch/x86/lib/tsc_timer.c
@@ -355,7 +355,15 @@ void __udelay(unsigned long usec)
stop = now + usec * get_tbclk_mhz();
while ((int64_t)(stop - get_ticks()) > 0)
+#if defined(CONFIG_QEMU) && defined(CONFIG_SMP)
+ /*
+ * Add a 'pause' instruction on qemu target,
+ * to give other VCPUs a chance to run.
+ */
+ asm volatile("pause");
+#else
;
+#endif
}
int timer_init(void)
--
1.8.2.1
More information about the U-Boot
mailing list