]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/kern/ia32/apic-ia32-mp.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / apic-ia32-mp.cpp
index 42ca49cbfa260cb7b60ab200ed5bca4b55c62d51..ddfcb98ac889e7f0121a0a517ec6946ea1f85dc9 100644 (file)
@@ -61,6 +61,15 @@ Apic::mp_ipi_idle_timeout(Cpu const *c, Unsigned32 wait)
   return mp_ipi_idle();
 }
 
+PRIVATE static inline
+void
+Apic::delay(Cpu const *c, Unsigned32 wait)
+{
+  Unsigned64 wait_till = c->time_us() + wait;
+  while (c->time_us() < wait_till)
+    Proc::pause();
+}
+
 PUBLIC static inline NEEDS [<cassert>]
 void
 Apic::mp_send_ipi(Unsigned32 dest, Unsigned32 vect,
@@ -133,6 +142,8 @@ Apic::mp_startup(Cpu const *current_cpu, Unsigned32 dest, Address tramp_page)
   // Send INIT IPI
   mp_send_ipi(dest, 0, APIC_IPI_INIT);
 
+  delay(current_cpu, 200);
+
   // delay for 10ms (=10,000us)
   if (!mp_ipi_idle_timeout(current_cpu, 10000))
     return;