Hi all,

after a long day of experimenting with a new tracer revision (will get
posted later), I'm looking now for some external wisdom.

I changed the instrumentation for high-domain stall times such that I
now attach to local_irq_disable_hw & friends instead. In case the
hard-IRQ status doesn't change, only a ipipe_trace_special is issued, a
trace_begin/end otherwise. Additionally, I grab the entering and exiting
of __ipipe_handle_irq and suppress two IRQ on/off points in
arch/i386/kernel/ipipe-root.c. See attached patch (will likely become
part of the tracer).

Ok, this works significantly better than the previous approach. I just
tormented an Athlon 800 MHz box with Xenomai 2.1 revision 357 (old ipipe
IRQ layer) about 50 minutes with

        latency -p1000 -t1
        dd if=/dev/hda of=/dev/null
        ping -f -s 1400 [from external]
        cachebench [part of llcbench]

The result was a maximum latency of 38 us (in-kernel periodic task) and
some traces which correlate quite well. I attached two of them, showing
the similarity between the final and last but one outputs of
/proc/ipipe/trace/max. Note that the instrumentation and the trace
recording add some overhead, how much is just going to be measured.

So far so good. But I still have at least one virtual IRQ leakage in my
instrumenation, see the third trace. This is where the "external wisdom"
would be welcome. I know, I'm not tracing all IRQ offs and ons to make
life easier. This one is like an IRQ-reenable-on-iret when return to
userspace (the following IRQ hits a userspace address). Any ideas how to
catch this without rewriting entry.S - where modifications are real
*slowly* maturing?

Thanks,
Jan


PS: The removal of rthal_irq_trampoline() should not cause noticable
positive effects on such mid-range platforms, I'm afraid. But this will
get checked later. And there is a "nice" Pentium I 133 MHz sitting next
to me. I guess he will like this more. :)

PPS: "later" may not mean "soon".
I-pipe worst-case tracing service on 2.6.14.3/ipipe-1.1-00
------------------------------------------------------------
Begin: 1068123402870 cycles, Trace Points: 44 (-10/+5), Length: 36 us

  Type   User Val.   Time    Delay  Function (Parent)
  fn                   -3    0.381  losyscall_event+0xc 
(__ipipe_dispatch_event+0x88)
  begin  0x80000001    -3    0.252  __ipipe_dispatch_event+0xb0 
(__ipipe_syscall_root+0x31)
  end    0x80000001    -3    0.399  __ipipe_dispatch_event+0x160 
(__ipipe_syscall_root+0x31)
  fn                   -2    0.136  sys_write+0xd (syscall_call+0x7)
  fn                   -2    0.295  fget_light+0xb (sys_write+0x1d)
  fn                   -2    0.402  vfs_write+0xc (sys_write+0x41)
  fn                   -1    0.186  rw_verify_area+0xb (vfs_write+0x67)
  fn                   -1    0.160  write_null+0x8 (vfs_write+0x8a)
  fn                   -1    0.400  dnotify_parent+0xa (vfs_write+0xb5)
  fn                   -1    1.053  inotify_dentry_parent_queue_event+0xa 
(vfs_write+0xd5)
>|begin  0x80000002     0    0.451  common_interrupt+0x21 (__ipipe_trace+0x160)
:|fn                    0    0.904  __ipipe_handle_irq+0xe 
(common_interrupt+0x29)
:|fn                    1    0.438  __ipipe_ack_common_irq+0xb 
(__ipipe_handle_irq+0xf5)
:|fn                    1    0.392  mask_and_ack_8259A+0xc 
(__ipipe_ack_common_irq+0xa4)
:|(0x11) 0x80000001     2!  13.393  mask_and_ack_8259A+0x9f 
(__ipipe_ack_common_irq+0xa4)
:|(0x22) 0x80000001    15    0.267  mask_and_ack_8259A+0x124 
(__ipipe_ack_common_irq+0xa4)
:|fn                   15+   1.448  __ipipe_sync_stage+0xe 
(__ipipe_handle_irq+0x225)
:|begin  0x80000002    17    0.163  common_interrupt+0x21 
(__ipipe_sync_stage+0xdd)
:|fn                   17    0.423  __ipipe_handle_irq+0xe 
(common_interrupt+0x29)
:|fn                   17    0.158  __ipipe_ack_common_irq+0xb 
(__ipipe_handle_irq+0xf5)
:|fn                   18    0.178  mask_and_ack_8259A+0xc 
(__ipipe_ack_common_irq+0xa4)
:|(0x11) 0x80000001    18+   1.712  mask_and_ack_8259A+0x9f 
(__ipipe_ack_common_irq+0xa4)
:|(0x22) 0x80000001    19    0.350  mask_and_ack_8259A+0x124 
(__ipipe_ack_common_irq+0xa4)
:|fn                   20    0.198  ipipe_suspend_domain+0xc 
(__ipipe_handle_irq+0x1cc)
:|(0x11) 0x80000001    20    0.349  ipipe_suspend_domain+0xac 
(__ipipe_handle_irq+0x1cc)
:|fn                   20    0.285  __ipipe_sync_stage+0xe 
(ipipe_suspend_domain+0x68)
:|fn                   21    0.311  rthal_irq_trampoline+0x8 
(__ipipe_sync_stage+0xc1)
:|fn                   21    0.155  xnintr_clock_handler+0x8 
(rthal_irq_trampoline+0x2c)
:|fn                   21    0.195  xnintr_irq_handler+0xb 
(xnintr_clock_handler+0x18)
:|fn                   21    0.454  xnpod_announce_tick+0xb 
(xnintr_irq_handler+0x28)
:|(0x11) 0x80000000    22    0.220  xnpod_announce_tick+0x214 
(xnintr_irq_handler+0x28)
:|fn                   22    0.298  xntimer_do_tick_aperiodic+0xe 
(xnpod_announce_tick+0xb8)
:|fn                   22    0.425  xnthread_timeout_handler+0x8 
(xntimer_do_tick_aperiodic+0x273)
:|fn                   23    0.148  xnpod_resume_thread+0xc 
(xnthread_timeout_handler+0x22)
:|(0x11) 0x80000000    23    0.362  xnpod_resume_thread+0x350 
(xnthread_timeout_handler+0x22)
:|(0x11) 0x80000000    23    0.319  xnpod_resume_thread+0x21b 
(xnthread_timeout_handler+0x22)
:|(0x11) 0x80000001    24+   2.933  xntimer_do_tick_aperiodic+0x20c 
(xnpod_announce_tick+0xb8)
:|(0x22) 0x80000001    26    0.320  xntimer_do_tick_aperiodic+0x233 
(xnpod_announce_tick+0xb8)
:|(0x11) 0x80000000    27    0.202  xnpod_announce_tick+0x183 
(xnintr_irq_handler+0x28)
:|fn                   27    0.159  xnpod_schedule+0xe (xnintr_irq_handler+0xa5)
:|(0x11) 0x80000000    27+   1.029  xnpod_schedule+0x68a 
(xnintr_irq_handler+0xa5)
:|(0x11) 0x80000000    28    0.214  xnpod_schedule+0x985 
(xnpod_suspend_thread+0x2b7)
:|(0x11) 0x80000000    28    0.325  xnpod_suspend_thread+0x1ba 
(rtdm_task_sleep_until+0x99 [xeno_rtdm])
:|(0x11) 0x80000000    29    0.194  rtdm_task_sleep_until+0xe4 [xeno_rtdm] 
(timer_task_proc+0x12c [xeno_timerbench])
:|fn                   29    0.190  ipipe_unstall_pipeline_from+0xd 
(timer_task_proc+0x145 [xeno_timerbench])
:|(0x11) 0x80000001    29+   1.144  ipipe_unstall_pipeline_from+0x90 
(timer_task_proc+0x145 [xeno_timerbench])
:|begin  0x80000002    30    0.162  common_interrupt+0x21 
(ipipe_unstall_pipeline_from+0xff)
:|fn                   30    0.237  __ipipe_handle_irq+0xe 
(common_interrupt+0x29)
:|fn                   31    0.397  __ipipe_ack_common_irq+0xb 
(__ipipe_handle_irq+0xf5)
:|(0x11) 0x80000000    31    0.176  __ipipe_ack_common_irq+0xd3 
(__ipipe_handle_irq+0xf5)
:|fn                   31    0.315  mask_and_ack_8259A+0xc 
(__ipipe_ack_common_irq+0x40)
:|(0x11) 0x80000001    32+   4.283  mask_and_ack_8259A+0x9f 
(__ipipe_ack_common_irq+0x40)
:|(0x22) 0x80000001    36    0.300  mask_and_ack_8259A+0x124 
(__ipipe_ack_common_irq+0x40)
<|end    0x80000002    36    0.470  common_interrupt+0x34 
(ipipe_unstall_pipeline_from+0xff)
  end    0x80000000    37    0.236  ipipe_unstall_pipeline_from+0x104 
(timer_task_proc+0x145 [xeno_timerbench])
  fn                   37    0.186  xnpod_get_time+0x8 (timer_task_proc+0x8c 
[xeno_timerbench])
  fn                   37    0.575  xntimer_get_jiffies_aperiodic+0xe 
(xnpod_get_time+0x10)
  fn                   38    0.202  eval_inner_loop+0xb [xeno_timerbench] 
(timer_task_proc+0xb2 [xeno_timerbench])
  begin  0x80000000    38    0.000  timer_task_proc+0x166 [xeno_timerbench] 
(xnarch_thread_redirect+0x97)
I-pipe worst-case tracing service on 2.6.14.3/ipipe-1.1-00
------------------------------------------------------------
Begin: 1625655337641 cycles, Trace Points: 44 (-10/+5), Length: 38 us

  Type   User Val.   Time    Delay  Function (Parent)
  fn                   -5    0.126  __ipipe_unstall_root+0x8 
(find_get_page+0x3b)
  begin  0x80000000    -5    0.368  __ipipe_unstall_root+0x19 
(find_get_page+0x3b)
  end    0x80000000    -5    0.225  __ipipe_unstall_root+0x43 
(find_get_page+0x3b)
  fn                   -5    0.387  file_read_actor+0xd 
(do_generic_mapping_read+0x3c8)
  fn                   -4    2.175  __copy_to_user_ll+0xa (file_read_actor+0x77)
  fn                   -2    0.311  update_atime+0xc 
(do_generic_mapping_read+0x41b)
  fn                   -2    0.394  current_fs_time+0xe (update_atime+0x51)
  fn                   -1    0.215  timespec_trunc+0xb (current_fs_time+0x65)
  fn                   -1    0.206  dnotify_parent+0xa (vfs_read+0xb5)
  fn                   -1    1.337  inotify_dentry_parent_queue_event+0xa 
(vfs_read+0xd5)
>|begin  0x80000002     0    0.226  common_interrupt+0x21 (mcount+0x29)
:|fn                    0    0.907  __ipipe_handle_irq+0xe 
(common_interrupt+0x29)
:|fn                    1    0.417  __ipipe_ack_common_irq+0xb 
(__ipipe_handle_irq+0xf5)
:|fn                    1    0.136  mask_and_ack_8259A+0xc 
(__ipipe_ack_common_irq+0xa4)
:|(0x11) 0x80000001     1!  12.181  mask_and_ack_8259A+0x9f 
(__ipipe_ack_common_irq+0xa4)
:|(0x22) 0x80000001    13    0.283  mask_and_ack_8259A+0x124 
(__ipipe_ack_common_irq+0xa4)
:|fn                   14+   1.431  __ipipe_sync_stage+0xe 
(__ipipe_handle_irq+0x225)
:|begin  0x80000002    15    0.371  common_interrupt+0x21 
(__ipipe_sync_stage+0xdd)
:|fn                   15    0.219  __ipipe_handle_irq+0xe 
(common_interrupt+0x29)
:|fn                   16    0.313  __ipipe_ack_common_irq+0xb 
(__ipipe_handle_irq+0xf5)
:|fn                   16    0.176  mask_and_ack_8259A+0xc 
(__ipipe_ack_common_irq+0xa4)
:|(0x11) 0x80000001    16+   3.290  mask_and_ack_8259A+0x9f 
(__ipipe_ack_common_irq+0xa4)
:|(0x22) 0x80000001    19    0.577  mask_and_ack_8259A+0x124 
(__ipipe_ack_common_irq+0xa4)
:|fn                   20    0.201  ipipe_suspend_domain+0xc 
(__ipipe_handle_irq+0x1cc)
:|(0x11) 0x80000001    20    0.200  ipipe_suspend_domain+0xac 
(__ipipe_handle_irq+0x1cc)
:|fn                   20    0.529  __ipipe_sync_stage+0xe 
(ipipe_suspend_domain+0x68)
:|fn                   21    0.217  rthal_irq_trampoline+0x8 
(__ipipe_sync_stage+0xc1)
:|fn                   21    0.358  xnintr_clock_handler+0x8 
(rthal_irq_trampoline+0x2c)
:|fn                   22    0.199  xnintr_irq_handler+0xb 
(xnintr_clock_handler+0x18)
:|fn                   22    0.220  xnpod_announce_tick+0xb 
(xnintr_irq_handler+0x28)
:|(0x11) 0x80000000    22    0.585  xnpod_announce_tick+0x214 
(xnintr_irq_handler+0x28)
:|fn                   23    0.311  xntimer_do_tick_aperiodic+0xe 
(xnpod_announce_tick+0xb8)
:|fn                   23    0.205  xnthread_timeout_handler+0x8 
(xntimer_do_tick_aperiodic+0x273)
:|fn                   23    0.475  xnpod_resume_thread+0xc 
(xnthread_timeout_handler+0x22)
:|(0x11) 0x80000000    24    0.361  xnpod_resume_thread+0x350 
(xnthread_timeout_handler+0x22)
:|(0x11) 0x80000000    24    0.373  xnpod_resume_thread+0x21b 
(xnthread_timeout_handler+0x22)
:|(0x11) 0x80000001    24+   2.892  xntimer_do_tick_aperiodic+0x20c 
(xnpod_announce_tick+0xb8)
:|(0x22) 0x80000001    27    0.209  xntimer_do_tick_aperiodic+0x233 
(xnpod_announce_tick+0xb8)
:|(0x11) 0x80000000    27    0.474  xnpod_announce_tick+0x183 
(xnintr_irq_handler+0x28)
:|fn                   28    0.363  xnpod_schedule+0xe (xnintr_irq_handler+0xa5)
:|(0x11) 0x80000000    28    0.936  xnpod_schedule+0x68a 
(xnintr_irq_handler+0xa5)
:|(0x11) 0x80000000    29    0.550  xnpod_schedule+0x985 
(xnpod_suspend_thread+0x2b7)
:|(0x11) 0x80000000    30    0.288  xnpod_suspend_thread+0x1ba 
(rtdm_task_sleep_until+0x99 [xeno_rtdm])
:|(0x11) 0x80000000    30    0.334  rtdm_task_sleep_until+0xe4 [xeno_rtdm] 
(timer_task_proc+0x12c [xeno_timerbench])
:|fn                   30    0.186  ipipe_unstall_pipeline_from+0xd 
(timer_task_proc+0x145 [xeno_timerbench])
:|(0x11) 0x80000001    31    0.912  ipipe_unstall_pipeline_from+0x90 
(timer_task_proc+0x145 [xeno_timerbench])
:|begin  0x80000002    31    0.303  common_interrupt+0x21 
(ipipe_unstall_pipeline_from+0xff)
:|fn                   32    0.226  __ipipe_handle_irq+0xe 
(common_interrupt+0x29)
:|fn                   32    0.191  __ipipe_ack_common_irq+0xb 
(__ipipe_handle_irq+0xf5)
:|(0x11) 0x80000000    32    0.417  __ipipe_ack_common_irq+0xd3 
(__ipipe_handle_irq+0xf5)
:|fn                   33    0.136  mask_and_ack_8259A+0xc 
(__ipipe_ack_common_irq+0x40)
:|(0x11) 0x80000001    33+   4.519  mask_and_ack_8259A+0x9f 
(__ipipe_ack_common_irq+0x40)
:|(0x22) 0x80000001    37    0.290  mask_and_ack_8259A+0x124 
(__ipipe_ack_common_irq+0x40)
<|end    0x80000002    38    0.306  common_interrupt+0x34 
(ipipe_unstall_pipeline_from+0xff)
  end    0x80000000    38    0.397  ipipe_unstall_pipeline_from+0x104 
(timer_task_proc+0x145 [xeno_timerbench])
  fn                   38    0.165  xnpod_get_time+0x8 (timer_task_proc+0x8c 
[xeno_timerbench])
  fn                   38    0.313  xntimer_get_jiffies_aperiodic+0xe 
(xnpod_get_time+0x10)
  fn                   39    0.638  eval_inner_loop+0xb [xeno_timerbench] 
(timer_task_proc+0xb2 [xeno_timerbench])
  begin  0x80000000    39    0.000  timer_task_proc+0x166 [xeno_timerbench] 
(xnarch_thread_redirect+0x97)
  Type   User Val.   Time    Delay  Function (Parent)
  fn                   -9    0.149  activate_task+0xb (try_to_wake_up+0x100)
  fn                   -9    0.836  sched_clock+0xd (activate_task+0x13)
  fn                   -8    1.616  recalc_task_prio+0xe (activate_task+0x1f)
  fn                   -6    0.250  effective_prio+0x8 (recalc_task_prio+0x17d)
  fn                   -6    0.825  enqueue_task+0xa (activate_task+0x59)
  fn                   -5    0.136  __ipipe_restore_root+0x8 
(try_to_wake_up+0x4d)
  fn                   -5    0.309  __ipipe_stall_root+0x8 
(__ipipe_restore_root+0x11)
  fn                   -5    0.527  preempt_schedule+0xb (try_to_wake_up+0x8b)
  fn                   -4    0.175  xnpod_schedule+0xe (lostage_handler+0x115)
  fn                   -4    0.720  ipipe_trigger_irq+0xe (xnpod_schedule+0x660)
  begin  0x80000001    -3    0.430  ipipe_trigger_irq+0xac 
(xnpod_schedule+0x660)
 |fn                   -3    0.566  __ipipe_handle_irq+0xe 
(ipipe_trigger_irq+0x55)
 |fn                   -2    0.315  ipipe_suspend_domain+0xc 
(__ipipe_handle_irq+0x1cc)
 |fn                   -2    0.455  __ipipe_sync_stage+0xe 
(ipipe_suspend_domain+0x59)
 |fn                   -2    0.165  xnpod_schedule_handler+0x8 
(__ipipe_sync_stage+0xca)
 |fn                   -1    0.694  xnpod_schedule+0xe 
(xnpod_schedule_handler+0x17)
  end    0x80000001    -1    0.332  ipipe_trigger_irq+0x7a 
(xnpod_schedule+0x660)
  fn                    0    0.228  __ipipe_stall_root+0x8 (resume_kernel+0x5)
  fn                    0    0.518  __ipipe_unstall_iret_root+0x8 
(restore_raw+0x0)
  fn                    0    0.189  irq_exit+0x8 (__ipipe_sync_stage+0x177)
> begin  0x80000000     0! 874.819  __ipipe_sync_stage+0x120 
> (__ipipe_unstall_iret_root+0x42)
:|begin  0x80000002   874    0.157  common_interrupt+0x21 (<b7f2a1e3>)
:|fn                  874    0.356  __ipipe_handle_irq+0xe 
(common_interrupt+0x29)
:|fn                  875    0.888  __ipipe_ack_common_irq+0xb 
(__ipipe_handle_irq+0xf5)
:|fn                  876+   1.780  mask_and_ack_8259A+0xc 
(__ipipe_ack_common_irq+0xa4)
:|fn                  878    0.152  ipipe_suspend_domain+0xc 
(__ipipe_handle_irq+0x1cc)
:|fn                  878    0.502  __ipipe_sync_stage+0xe 
(ipipe_suspend_domain+0x59)
:|fn                  878    0.181  rthal_irq_trampoline+0x8 
(__ipipe_sync_stage+0xca)
:|fn                  878    0.315  xnintr_clock_handler+0x8 
(rthal_irq_trampoline+0x2c)
:|fn                  879    0.179  xnintr_irq_handler+0xb 
(xnintr_clock_handler+0x18)
:|fn                  879    0.290  xnpod_announce_tick+0xb 
(xnintr_irq_handler+0x28)
:|fn                  879    0.597  xntimer_do_tick_aperiodic+0xe 
(xnpod_announce_tick+0xb8)
:|fn                  880    0.139  xnthread_timeout_handler+0x8 
(xntimer_do_tick_aperiodic+0x240)
:|fn                  880+   3.327  xnpod_resume_thread+0xc 
(xnthread_timeout_handler+0x22)
:|fn                  883+   1.346  xnpod_schedule+0xe (xnintr_irq_handler+0xa5)
:|fn                  885    0.188  ipipe_unstall_pipeline_from+0xd 
(timer_task_proc+0x145 [xeno_timerbench])
< end    0x80000000   885    0.375  ipipe_unstall_pipeline_from+0xd3 
(timer_task_proc+0x145 [xeno_timerbench])
  fn                  885    0.137  xnpod_get_time+0x8 (timer_task_proc+0x8c 
[xeno_timerbench])
  fn                  885    0.293  xntimer_get_jiffies_aperiodic+0xe 
(xnpod_get_time+0x10)
  fn                  886    0.516  eval_inner_loop+0xb [xeno_timerbench] 
(timer_task_proc+0xb2 [xeno_timerbench])
  begin  0x80000000   886    0.000  timer_task_proc+0x166 [xeno_timerbench] 
(xnarch_thread_redirect+0x97)
--- linux-2.6.14.3//arch/i386/kernel/ipipe-root.c.orig  2006-01-02 
20:42:58.000000000 +0100
+++ linux-2.6.14.3//arch/i386/kernel/ipipe-root.c       2006-01-04 
01:26:16.000000000 +0100
@@ -283,7 +283,7 @@ asmlinkage int __ipipe_kpreempt_root(str
        }
 
        __ipipe_stall_root();
-       local_irq_enable_hw();
+       local_irq_enable_hw_notrace();
 
        return 1;               /* Ok, may reschedule now. */
 }
@@ -294,7 +294,7 @@ asmlinkage void __ipipe_unstall_iret_roo
 
        /* Emulate IRET's handling of the interrupt flag. */
 
-       local_irq_disable_hw();
+       local_irq_disable_hw_notrace();
 
        ipipe_load_cpuid();
 
--- linux-2.6.14.3//include/asm-i386/system.h.orig      2006-01-03 
19:05:32.000000000 +0100
+++ linux-2.6.14.3//include/asm-i386/system.h   2006-01-04 22:15:53.000000000 
+0100
@@ -481,18 +481,82 @@ void fastcall __ipipe_restore_root(unsig
 
 #define irqs_disabled()                __ipipe_test_root()
 
+#define halt() __asm__ __volatile__("hlt": : :"memory")
+
+#ifdef CONFIG_IPIPE_TRACE_IRQSOFF
+
+#include <linux/ipipe_trace.h>
+
 #define safe_halt() do { \
-    __ipipe_unstall_root(); \
-    __asm__ __volatile__("sti; hlt": : :"memory"); \
+       __ipipe_unstall_root(); \
+       __asm__ __volatile__("sti": : :"memory"); \
+       ipipe_trace_end(0x8000000E); \
+       __asm__ __volatile__("hlt": : :"memory"); \
 } while(0)
 
-#define halt() __asm__ __volatile__("hlt": : :"memory")
+#define ipipe_hw_save_flags_and_sti(x) do { \
+       __asm__ __volatile__("pushfl ; popl %0 ; sti":"=g" (x): /* no input */ 
:"memory"); \
+       ipipe_trace_end(0x8000000F); \
+} while (0)
+#define local_irq_disable_hw() do { \
+       if (!irqs_disabled_hw()) { \
+               ipipe_trace_begin(0x80000000); \
+               __asm__ __volatile__("cli": : :"memory"); \
+       } else \
+               ipipe_trace_special(0x11, 0x80000000); \
+} while (0)
+#define local_irq_enable_hw() do { \
+       if (irqs_disabled_hw()) { \
+               __asm__ __volatile__("sti": : :"memory"); \
+               ipipe_trace_end(0x80000000); \
+       } else \
+               ipipe_trace_special(0x22, 0x80000000); \
+} while (0)
+#define local_irq_save_hw(x) do { \
+       local_save_flags_hw(x); \
+       if (local_test_iflag_hw(x)) { \
+               ipipe_trace_begin(0x80000001); \
+               __asm__ __volatile__("cli": : :"memory"); \
+       } else \
+               ipipe_trace_special(0x11, 0x80000001); \
+} while (0)
+#define local_irq_restore_hw(x) do { \
+       __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" 
(x):"memory", "cc"); \
+       if (local_test_iflag_hw(x)) \
+               ipipe_trace_end(0x80000001); \
+       else \
+               ipipe_trace_special(0x22, 0x80000001); \
+} while (0)
+
+#define local_irq_disable_hw_notrace() \
+       __asm__ __volatile__("cli": : :"memory")
+#define local_irq_enable_hw_notrace() \
+       __asm__ __volatile__("sti": : :"memory")
+#define local_irq_save_hw_notrace(x) \
+       __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ 
:"memory")
+#define local_irq_restore_hw_notrace(x) \
+       __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" 
(x):"memory", "cc")
+
+#else /* !CONFIG_IPIPE_TRACE_IRQSOFF */
+
+#define safe_halt() do { \
+       __ipipe_unstall_root(); \
+       __asm__ __volatile__("sti; hlt": : :"memory"); \
+} while(0)
 
 #define ipipe_hw_save_flags_and_sti(x) __asm__ __volatile__("pushfl ; popl %0 
; sti":"=g" (x): /* no input */ :"memory")
 #define local_irq_disable_hw()                         __asm__ 
__volatile__("cli": : :"memory")
 #define local_irq_enable_hw()                  __asm__ __volatile__("sti": : 
:"memory")
 #define local_irq_save_hw(x)    __asm__ __volatile__("pushfl ; popl %0 ; 
cli":"=g" (x): /* no input */ :"memory")
 #define local_irq_restore_hw(x) __asm__ __volatile__("pushl %0 ; popfl": /* no 
output */ :"g" (x):"memory", "cc")
+
+#define local_irq_disable_hw_notrace    local_irq_disable_hw
+#define local_irq_enable_hw_notrace     local_irq_enable_hw
+#define local_irq_save_hw_notrace       local_irq_save_hw
+#define local_irq_restore_hw_notrace    local_irq_restore_hw
+
+#endif /* CONFIG_IPIPE_TRACE_IRQSOFF */
+
 #define local_save_flags_hw(x)   __asm__ __volatile__("pushfl ; popl %0":"=g" 
(x): /* no input */)
 #define local_test_iflag_hw(x)   ((x) & (1<<9))
 #define irqs_disabled_hw()     \

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to