From: Jan Kiszka <jan.kiszka@domain.hid>
To: xenomai-core <xenomai@xenomai.org>
Subject: [Xenomai-core] enjoying the trace
Date: Wed, 04 Jan 2006 22:50:04 +0100 [thread overview]
Message-ID: <43BC430C.5080204@domain.hid> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 1954 bytes --]
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".
[-- Attachment #1.2: xeno-2.1-athlon800.trace --]
[-- Type: text/plain, Size: 5539 bytes --]
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)
[-- Attachment #1.3: xeno-2.1-athlon800.trace2 --]
[-- Type: text/plain, Size: 5570 bytes --]
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)
[-- Attachment #1.4: leaking-irq.trace --]
[-- Type: text/plain, Size: 3626 bytes --]
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)
[-- Attachment #1.5: ipipe_trace.instr2 --]
[-- Type: text/plain, Size: 4016 bytes --]
--- 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 #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 256 bytes --]
next reply other threads:[~2006-01-04 21:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-01-04 21:50 Jan Kiszka [this message]
2006-01-04 22:45 ` [Xenomai-core] enjoying the trace Jan Kiszka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=43BC430C.5080204@domain.hid \
--to=jan.kiszka@domain.hid \
--cc=xenomai@xenomai.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.