Module: xenomai-gch Branch: for-2.4 Commit: 95636e0d6016db707ff355052262d0848d332b42 URL: http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=95636e0d6016db707ff355052262d0848d332b42
Author: Philippe Gerum <r...@xenomai.org> Date: Sun Dec 20 17:00:10 2009 +0100 x86: upgrade I-pipe support to 2.6.30.8-x86-2.4-09 --- ...patch => adeos-ipipe-2.6.30.8-x86-2.4-09.patch} | 256 +++++++++++++------- 1 file changed, 170 insertions(+), 86 deletions(-) diff --git a/ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-06.patch b/ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-09.patch similarity index 98% rename from ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-06.patch rename to ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-09.patch index b2ab1d8..44b8e0f 100644 --- a/ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-06.patch +++ b/ksrc/arch/x86/patches/adeos-ipipe-2.6.30.8-x86-2.4-09.patch @@ -215,7 +215,7 @@ index 0b72282..6574056 100644 /* diff --git a/arch/x86/include/asm/ipipe.h b/arch/x86/include/asm/ipipe.h new file mode 100644 -index 0000000..017417c +index 0000000..3a531f5 --- /dev/null +++ b/arch/x86/include/asm/ipipe.h @@ -0,0 +1,156 @@ @@ -246,7 +246,7 @@ index 0000000..017417c +#ifdef CONFIG_IPIPE + +#ifndef IPIPE_ARCH_STRING -+#define IPIPE_ARCH_STRING "2.4-06" ++#define IPIPE_ARCH_STRING "2.4-09" +#define IPIPE_MAJOR_NUMBER 2 +#define IPIPE_MINOR_NUMBER 4 +#define IPIPE_PATCH_NUMBER 6 @@ -705,10 +705,10 @@ index 0000000..956c4de +#endif /* !__X86_IPIPE_64_H */ diff --git a/arch/x86/include/asm/ipipe_base.h b/arch/x86/include/asm/ipipe_base.h new file mode 100644 -index 0000000..05338e4 +index 0000000..e512c51 --- /dev/null +++ b/arch/x86/include/asm/ipipe_base.h -@@ -0,0 +1,97 @@ +@@ -0,0 +1,105 @@ +/* -*- linux-c -*- + * arch/x86/include/asm/ipipe_base.h + * @@ -762,7 +762,9 @@ index 0000000..05338e4 +#define ex_do_simd_coprocessor_error 19 +#define ex_do_iret_error 32 + -+#if !defined(__ASSEMBLY__) && !defined(CONFIG_SMP) ++#ifndef __ASSEMBLY__ ++ ++#ifndef CONFIG_SMP + +#if __GNUC__ >= 4 +/* Alias to ipipe_root_cpudom_var(status) */ @@ -803,7 +805,13 @@ index 0000000..05338e4 + return oldbit; +} + -+#endif /* !__ASSEMBLY__ && !CONFIG_SMP */ ++#endif /* !CONFIG_SMP */ ++ ++void __ipipe_halt_root(void); ++ ++void __ipipe_serial_debug(const char *fmt, ...); ++ ++#endif /* !__ASSEMBLY__ */ + +#endif /* !__X86_IPIPE_BASE_H */ diff --git a/arch/x86/include/asm/ipipe_base_32.h b/arch/x86/include/asm/ipipe_base_32.h @@ -1083,7 +1091,7 @@ index 3cbd79b..79a5ea1 100644 /* * Local APIC timer IRQ vector is on a different priority level, diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h -index c6ccbe7..71ede94 100644 +index c6ccbe7..da1e655 100644 --- a/arch/x86/include/asm/irqflags.h +++ b/arch/x86/include/asm/irqflags.h @@ -4,6 +4,10 @@ @@ -1108,7 +1116,7 @@ index c6ccbe7..71ede94 100644 /* * Note: this needs to be "=r" not "=rm", because we have the * stack offset from what gcc expects at the time the "pop" is -@@ -23,30 +31,50 @@ static inline unsigned long native_save_fl(void) +@@ -23,31 +31,53 @@ static inline unsigned long native_save_fl(void) : "=r" (flags) : /* no input */ : "memory"); @@ -1153,13 +1161,16 @@ index c6ccbe7..71ede94 100644 static inline void native_safe_halt(void) { -+#ifdef CONFIG_IPIPE_TRACE_IRQSOFF -+ ipipe_trace_end(0x8000000E); -+#endif ++#ifdef CONFIG_IPIPE ++ barrier(); ++ __ipipe_halt_root(); ++#else asm volatile("sti; hlt": : :"memory"); ++#endif } -@@ -72,6 +100,71 @@ static inline void raw_local_irq_restore(unsigned long flags) + static inline void native_halt(void) +@@ -72,6 +102,71 @@ static inline void raw_local_irq_restore(unsigned long flags) native_restore_fl(flags); } @@ -1231,7 +1242,7 @@ index c6ccbe7..71ede94 100644 static inline void raw_local_irq_disable(void) { native_irq_disable(); -@@ -105,16 +198,38 @@ static inline void halt(void) +@@ -105,16 +200,40 @@ static inline void halt(void) */ static inline unsigned long __raw_local_irq_save(void) { @@ -1260,19 +1271,21 @@ index c6ccbe7..71ede94 100644 +#define ENABLE_INTERRUPTS(clobbers) sti +#endif /* CONFIG_X86_64 */ +#define ENABLE_INTERRUPTS_HW_COND sti ++#define DISABLE_INTERRUPTS_HW_COND cli +#define DISABLE_INTERRUPTS_HW(clobbers) cli +#define ENABLE_INTERRUPTS_HW(clobbers) sti +#else /* !CONFIG_IPIPE */ +#define ENABLE_INTERRUPTS(x) sti +#define DISABLE_INTERRUPTS(x) cli +#define ENABLE_INTERRUPTS_HW_COND ++#define DISABLE_INTERRUPTS_HW_COND +#define DISABLE_INTERRUPTS_HW(clobbers) DISABLE_INTERRUPTS(clobbers) +#define ENABLE_INTERRUPTS_HW(clobbers) ENABLE_INTERRUPTS(clobbers) +#endif /* !CONFIG_IPIPE */ #ifdef CONFIG_X86_64 #define SWAPGS swapgs -@@ -157,8 +272,10 @@ static inline unsigned long __raw_local_irq_save(void) +@@ -157,8 +276,10 @@ static inline unsigned long __raw_local_irq_save(void) #define raw_local_save_flags(flags) \ do { (flags) = __raw_local_save_flags(); } while (0) @@ -2605,7 +2618,7 @@ index c929add..f2e94fa 100644 jmp error_code CFI_ENDPROC diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S -index 38946c6..66112f0 100644 +index 38946c6..8a67c34 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -48,6 +48,7 @@ @@ -2779,16 +2792,24 @@ index 38946c6..66112f0 100644 restore_args: RESTORE_ARGS 0,8,0 -@@ -952,7 +1022,7 @@ ENTRY(retint_kernel) +@@ -952,7 +1022,15 @@ ENTRY(retint_kernel) jnc retint_restore_args bt $9,EFLAGS-ARGOFFSET(%rsp) /* interrupts off? */ jnc retint_restore_args - call preempt_schedule_irq ++#ifdef CONFIG_IPIPE ++ /* ++ * We may have preempted call_softirq before __do_softirq raised or ++ * after it lowered the preemption counter. ++ */ ++ cmpl $0,PER_CPU_VAR(irq_count) ++ jge retint_restore_args ++#endif + PREEMPT_SCHEDULE_IRQ jmp exit_intr #endif -@@ -962,16 +1032,31 @@ END(common_interrupt) +@@ -962,16 +1040,31 @@ END(common_interrupt) /* * APIC interrupts. */ @@ -2821,7 +2842,7 @@ index 38946c6..66112f0 100644 #ifdef CONFIG_SMP apicinterrupt IRQ_MOVE_CLEANUP_VECTOR \ -@@ -994,6 +1079,7 @@ apicinterrupt INVALIDATE_TLB_VECTOR_START+1 \ +@@ -994,6 +1087,7 @@ apicinterrupt INVALIDATE_TLB_VECTOR_START+1 \ invalidate_interrupt1 smp_invalidate_interrupt apicinterrupt INVALIDATE_TLB_VECTOR_START+2 \ invalidate_interrupt2 smp_invalidate_interrupt @@ -2829,7 +2850,7 @@ index 38946c6..66112f0 100644 apicinterrupt INVALIDATE_TLB_VECTOR_START+3 \ invalidate_interrupt3 smp_invalidate_interrupt apicinterrupt INVALIDATE_TLB_VECTOR_START+4 \ -@@ -1004,6 +1090,7 @@ apicinterrupt INVALIDATE_TLB_VECTOR_START+6 \ +@@ -1004,6 +1098,7 @@ apicinterrupt INVALIDATE_TLB_VECTOR_START+6 \ invalidate_interrupt6 smp_invalidate_interrupt apicinterrupt INVALIDATE_TLB_VECTOR_START+7 \ invalidate_interrupt7 smp_invalidate_interrupt @@ -2837,7 +2858,7 @@ index 38946c6..66112f0 100644 #endif apicinterrupt THRESHOLD_APIC_VECTOR \ -@@ -1028,7 +1115,7 @@ apicinterrupt SPURIOUS_APIC_VECTOR \ +@@ -1028,7 +1123,7 @@ apicinterrupt SPURIOUS_APIC_VECTOR \ /* * Exception entry points. */ @@ -2846,7 +2867,7 @@ index 38946c6..66112f0 100644 ENTRY(\sym) INTR_FRAME PARAVIRT_ADJUST_EXCEPTION_FRAME -@@ -1039,13 +1126,26 @@ ENTRY(\sym) +@@ -1039,13 +1134,26 @@ ENTRY(\sym) DEFAULT_FRAME 0 movq %rsp,%rdi /* pt_regs pointer */ xorl %esi,%esi /* no error code */ @@ -2874,7 +2895,7 @@ index 38946c6..66112f0 100644 ENTRY(\sym) INTR_FRAME PARAVIRT_ADJUST_EXCEPTION_FRAME -@@ -1055,14 +1155,27 @@ ENTRY(\sym) +@@ -1055,14 +1163,27 @@ ENTRY(\sym) call save_paranoid TRACE_IRQS_OFF movq %rsp,%rdi /* pt_regs pointer */ @@ -2903,7 +2924,7 @@ index 38946c6..66112f0 100644 ENTRY(\sym) INTR_FRAME PARAVIRT_ADJUST_EXCEPTION_FRAME -@@ -1072,17 +1185,30 @@ ENTRY(\sym) +@@ -1072,17 +1193,30 @@ ENTRY(\sym) call save_paranoid TRACE_IRQS_OFF movq %rsp,%rdi /* pt_regs pointer */ @@ -2935,7 +2956,7 @@ index 38946c6..66112f0 100644 ENTRY(\sym) XCPT_FRAME PARAVIRT_ADJUST_EXCEPTION_FRAME -@@ -1093,14 +1219,27 @@ ENTRY(\sym) +@@ -1093,14 +1227,27 @@ ENTRY(\sym) movq %rsp,%rdi /* pt_regs pointer */ movq ORIG_RAX(%rsp),%rsi /* get error code */ movq $-1,ORIG_RAX(%rsp) /* no syscall to restart */ @@ -2964,7 +2985,7 @@ index 38946c6..66112f0 100644 ENTRY(\sym) XCPT_FRAME PARAVIRT_ADJUST_EXCEPTION_FRAME -@@ -1110,27 +1249,40 @@ ENTRY(\sym) +@@ -1110,27 +1257,40 @@ ENTRY(\sym) DEFAULT_FRAME 0 TRACE_IRQS_OFF movq %rsp,%rdi /* pt_regs pointer */ @@ -3017,7 +3038,26 @@ index 38946c6..66112f0 100644 /* Reload gs selector with exception handling */ /* edi: new selector */ -@@ -1376,11 +1528,11 @@ END(xen_failsafe_callback) +@@ -1260,14 +1420,18 @@ ENTRY(call_softirq) + CFI_REL_OFFSET rbp,0 + mov %rsp,%rbp + CFI_DEF_CFA_REGISTER rbp ++ DISABLE_INTERRUPTS_HW_COND + incl PER_CPU_VAR(irq_count) + cmove PER_CPU_VAR(irq_stack_ptr),%rsp ++ ENABLE_INTERRUPTS_HW_COND + push %rbp # backlink for old unwinder + call __do_softirq ++ DISABLE_INTERRUPTS_HW_COND + leaveq + CFI_DEF_CFA_REGISTER rsp + CFI_ADJUST_CFA_OFFSET -8 + decl PER_CPU_VAR(irq_count) ++ ENABLE_INTERRUPTS_HW_COND + ret + CFI_ENDPROC + END(call_softirq) +@@ -1376,11 +1540,11 @@ END(xen_failsafe_callback) */ .pushsection .kprobes.text, "ax" @@ -3033,7 +3073,7 @@ index 38946c6..66112f0 100644 #ifdef CONFIG_X86_MCE paranoidzeroentry machine_check do_machine_check #endif -@@ -1403,8 +1555,13 @@ ENTRY(paranoid_exit) +@@ -1403,8 +1567,13 @@ ENTRY(paranoid_exit) INTR_FRAME DISABLE_INTERRUPTS(CLBR_NONE) TRACE_IRQS_OFF @@ -3139,10 +3179,10 @@ index df89102..cfb29a2 100644 handle_real_irq: diff --git a/arch/x86/kernel/ipipe.c b/arch/x86/kernel/ipipe.c new file mode 100644 -index 0000000..dcf9764 +index 0000000..c92592a --- /dev/null +++ b/arch/x86/kernel/ipipe.c -@@ -0,0 +1,964 @@ +@@ -0,0 +1,991 @@ +/* -*- linux-c -*- + * linux/arch/x86/kernel/ipipe.c + * @@ -3725,6 +3765,29 @@ index 0000000..dcf9764 + +#endif /* !CONFIG_X86_32 */ + ++void __ipipe_halt_root(void) ++{ ++ struct ipipe_percpu_domain_data *p; ++ ++ /* Emulate sti+hlt sequence over the root domain. */ ++ ++ local_irq_disable_hw(); ++ ++ p = ipipe_root_cpudom_ptr(); ++ ++ clear_bit(IPIPE_STALL_FLAG, &p->status); ++ ++ if (unlikely(p->irqpend_himask != 0)) { ++ __ipipe_sync_pipeline(IPIPE_IRQMASK_ANY); ++ local_irq_enable_hw(); ++ } else { ++#ifdef CONFIG_IPIPE_TRACE_IRQSOFF ++ ipipe_trace_end(0x8000000E); ++#endif /* CONFIG_IPIPE_TRACE_IRQSOFF */ ++ asm volatile("sti; hlt": : :"memory"); ++ } ++} ++ +static void do_machine_check_vector(struct pt_regs *regs, long error_code) +{ +#ifdef CONFIG_X86_MCE @@ -4097,16 +4160,20 @@ index 0000000..dcf9764 +EXPORT_SYMBOL_GPL(__switch_to); +EXPORT_SYMBOL_GPL(show_stack); + -+#ifdef CONFIG_X86_32 +EXPORT_PER_CPU_SYMBOL_GPL(init_tss); +#ifdef CONFIG_SMP +EXPORT_PER_CPU_SYMBOL_GPL(cpu_tlbstate); +#endif /* CONFIG_SMP */ -+#endif /* !CONFIG_X86_32 */ + +#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) +EXPORT_SYMBOL(tasklist_lock); +#endif /* CONFIG_SMP || CONFIG_DEBUG_SPINLOCK */ ++ ++#ifdef CONFIG_CC_STACKPROTECTOR ++EXPORT_PER_CPU_SYMBOL_GPL(irq_stack_union); ++#endif ++ ++EXPORT_SYMBOL(__ipipe_halt_root); diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index c3fe010..1c5ca71 100644 --- a/arch/x86/kernel/irq.c @@ -4242,18 +4309,10 @@ index ca98915..aa44a9e 100644 * One CPU supports mwait => All CPUs supports mwait */ diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c -index 76f8f84..2019f5f 100644 +index 76f8f84..6da32b6 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c -@@ -117,6 +117,7 @@ void cpu_idle(void) - local_irq_disable(); - /* Don't trace irqs off for idle */ - stop_critical_timings(); -+ ipipe_suspend_domain(); - pm_idle(); - start_critical_timings(); - } -@@ -310,10 +311,12 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) +@@ -310,10 +310,12 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) regs->cs = __USER_CS; regs->ip = new_ip; regs->sp = new_sp; @@ -4266,7 +4325,7 @@ index 76f8f84..2019f5f 100644 } EXPORT_SYMBOL_GPL(start_thread); -@@ -350,7 +353,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) +@@ -350,7 +352,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) { struct thread_struct *prev = &prev_p->thread, *next = &next_p->thread; @@ -4276,7 +4335,7 @@ index 76f8f84..2019f5f 100644 /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c -index b751a41..b6c779b 100644 +index b751a41..78b1b99 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -64,6 +64,8 @@ EXPORT_PER_CPU_SYMBOL(current_task); @@ -4288,15 +4347,7 @@ index b751a41..b6c779b 100644 unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED; static ATOMIC_NOTIFIER_HEAD(idle_notifier); -@@ -146,6 +148,7 @@ void cpu_idle(void) - enter_idle(); - /* Don't trace irqs off for idle */ - stop_critical_timings(); -+ ipipe_suspend_domain(); - pm_idle(); - start_critical_timings(); - /* In many cases the interrupt that ended idle -@@ -298,6 +301,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, +@@ -298,6 +300,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, p->thread.sp = (unsigned long) childregs; p->thread.sp0 = (unsigned long) (childregs+1); p->thread.usersp = me->thread.usersp; @@ -4304,7 +4355,7 @@ index b751a41..b6c779b 100644 set_tsk_thread_flag(p, TIF_FORK); -@@ -363,10 +367,12 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) +@@ -363,10 +366,12 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) regs->ss = __USER_DS; regs->flags = 0x200; set_fs(USER_DS); @@ -4317,7 +4368,7 @@ index b751a41..b6c779b 100644 } EXPORT_SYMBOL_GPL(start_thread); -@@ -385,7 +391,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) +@@ -385,7 +390,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) { struct thread_struct *prev = &prev_p->thread; struct thread_struct *next = &next_p->thread; @@ -4804,6 +4855,35 @@ index 42414e5..4d1fc09 100644 task_unlock(tsk); arch_pick_mmap_layout(mm); if (old_mm) { +diff --git a/include/asm-generic/bitops/atomic.h b/include/asm-generic/bitops/atomic.h +index 4657f3e..4b23b45 100644 +--- a/include/asm-generic/bitops/atomic.h ++++ b/include/asm-generic/bitops/atomic.h +@@ -20,20 +20,20 @@ extern raw_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned; + * this is the substitute */ + #define _atomic_spin_lock_irqsave(l,f) do { \ + raw_spinlock_t *s = ATOMIC_HASH(l); \ +- local_irq_save(f); \ ++ local_irq_save_hw(f); \ + __raw_spin_lock(s); \ + } while(0) + + #define _atomic_spin_unlock_irqrestore(l,f) do { \ + raw_spinlock_t *s = ATOMIC_HASH(l); \ + __raw_spin_unlock(s); \ +- local_irq_restore(f); \ ++ local_irq_restore_hw(f); \ + } while(0) + + + #else +-# define _atomic_spin_lock_irqsave(l,f) do { local_irq_save(f); } while (0) +-# define _atomic_spin_unlock_irqrestore(l,f) do { local_irq_restore(f); } while (0) ++# define _atomic_spin_lock_irqsave(l,f) do { local_irq_save_hw(f); } while (0) ++# define _atomic_spin_unlock_irqrestore(l,f) do { local_irq_restore_hw(f); } while (0) + #endif + + /* diff --git a/include/asm-generic/cmpxchg-local.h b/include/asm-generic/cmpxchg-local.h index b2ba2fc..ed01ab9 100644 --- a/include/asm-generic/cmpxchg-local.h @@ -4924,7 +5004,7 @@ index 4525747..0ceffc3 100644 #endif /* LINUX_HARDIRQ_H */ diff --git a/include/linux/ipipe.h b/include/linux/ipipe.h new file mode 100644 -index 0000000..8983e2c +index 0000000..8cbcb53 --- /dev/null +++ b/include/linux/ipipe.h @@ -0,0 +1,688 @@ @@ -5087,7 +5167,7 @@ index 0000000..8983e2c + ipipe_event_handler_t evhand[IPIPE_NR_EVENTS]; /* Event handlers. */ + unsigned long long evself; /* Self-monitored event bits. */ + -+ struct { ++ struct ipipe_irqdesc { + unsigned long control; + ipipe_irq_ackfn_t acknowledge; + ipipe_irq_handler_t handler; @@ -5618,10 +5698,10 @@ index 0000000..8983e2c +#endif /* !__LINUX_IPIPE_H */ diff --git a/include/linux/ipipe_base.h b/include/linux/ipipe_base.h new file mode 100644 -index 0000000..2960ecf +index 0000000..6ade9d6 --- /dev/null +++ b/include/linux/ipipe_base.h -@@ -0,0 +1,89 @@ +@@ -0,0 +1,102 @@ +/* -*- linux-c -*- + * include/linux/ipipe_base.h + * @@ -5683,8 +5763,21 @@ index 0000000..2960ecf + +void __ipipe_restore_root(unsigned long x); + -+#define ipipe_preempt_disable(flags) local_irq_save_hw(flags) -+#define ipipe_preempt_enable(flags) local_irq_restore_hw(flags) ++#define ipipe_preempt_disable(flags) \ ++ do { \ ++ local_irq_save_hw(flags); \ ++ if (__ipipe_root_domain_p) \ ++ preempt_disable(); \ ++ } while (0) ++#define ipipe_preempt_enable(flags) \ ++ do { \ ++ if (__ipipe_root_domain_p) { \ ++ preempt_enable_no_resched(); \ ++ local_irq_restore_hw(flags); \ ++ preempt_check_resched(); \ ++ } else \ ++ local_irq_restore_hw(flags); \ ++ } while (0) + +#ifdef CONFIG_IPIPE_DEBUG_CONTEXT +void ipipe_check_context(struct ipipe_domain *border_ipd); @@ -6630,10 +6723,10 @@ index f4be1ee..1ac44c0 100644 diff --git a/kernel/ipipe/Kconfig b/kernel/ipipe/Kconfig new file mode 100644 -index 0000000..de5e6a3 +index 0000000..934d57c --- /dev/null +++ b/kernel/ipipe/Kconfig -@@ -0,0 +1,35 @@ +@@ -0,0 +1,30 @@ +config IPIPE + bool "Interrupt pipeline" + default y @@ -6664,11 +6757,6 @@ index 0000000..de5e6a3 + bool + depends on IPIPE + default n -+ -+config IPIPE_UNMASKED_CONTEXT_SWITCH -+ bool -+ depends on IPIPE -+ default n diff --git a/kernel/ipipe/Kconfig.debug b/kernel/ipipe/Kconfig.debug new file mode 100644 index 0000000..c9b8abc @@ -6782,7 +6870,7 @@ index 0000000..6257dfa +obj-$(CONFIG_IPIPE_TRACE) += tracer.o diff --git a/kernel/ipipe/core.c b/kernel/ipipe/core.c new file mode 100644 -index 0000000..ffaceaa +index 0000000..aa2e5a0 --- /dev/null +++ b/kernel/ipipe/core.c @@ -0,0 +1,1794 @@ @@ -7100,7 +7188,7 @@ index 0000000..ffaceaa + +#ifdef CONFIG_IPIPE_DEBUG_INTERNAL + /* This helps catching bad usage from assembly call sites. */ -+ BUG_ON(!__ipipe_root_domain_p); ++ BUG_ON(!__ipipe_root_domain_p && !oops_in_progress); +#endif + + p = ipipe_root_cpudom_ptr(); @@ -7116,7 +7204,7 @@ index 0000000..ffaceaa +void __ipipe_restore_root(unsigned long x) +{ +#ifdef CONFIG_IPIPE_DEBUG_INTERNAL -+ BUG_ON(!ipipe_root_domain_p); ++ BUG_ON(!ipipe_root_domain_p && !oops_in_progress); +#endif + + if (x) @@ -8464,7 +8552,7 @@ index 0000000..ffaceaa + + ipipe_context_check_off(); + ipipe_trace_panic_freeze(); -+ ipipe_set_printk_sync(__ipipe_current_domain); ++ oops_in_progress = 1; + + if (this_domain->priority > border_domain->priority) + printk(KERN_ERR "I-pipe: Detected illicit call from domain " @@ -10823,7 +10911,7 @@ index cffffad..0a3eac6 100644 * This function runs timers and the timer-tq in bottom half context. */ diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c -index f1ed080..aa45f71 100644 +index f1ed080..28fbd5b 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -28,6 +28,7 @@ @@ -10858,30 +10946,26 @@ index f1ed080..aa45f71 100644 ret = ftrace_arch_code_modify_post_process(); FTRACE_WARN_ON(ret); -@@ -2189,9 +2199,9 @@ static int ftrace_convert_nops(struct module *mod, - } +@@ -2190,7 +2200,9 @@ static int ftrace_convert_nops(struct module *mod, /* disable interrupts to prevent kstop machine */ -- local_irq_save(flags); -+ local_irq_save_hw_notrace(flags); + local_irq_save(flags); ++ local_irq_disable_hw(); ftrace_update_code(mod); -- local_irq_restore(flags); -+ local_irq_restore_hw_notrace(flags); ++ local_irq_enable_hw(); + local_irq_restore(flags); mutex_unlock(&ftrace_lock); - return 0; -@@ -2216,9 +2226,9 @@ void __init ftrace_init(void) - /* Keep the ftrace pointer to the stub */ +@@ -2217,7 +2229,9 @@ void __init ftrace_init(void) addr = (unsigned long)ftrace_stub; -- local_irq_save(flags); -+ local_irq_save_hw_notrace(flags); + local_irq_save(flags); ++ local_irq_disable_hw(); ftrace_dyn_arch_init(&addr); -- local_irq_restore(flags); -+ local_irq_restore_hw_notrace(flags); ++ local_irq_enable_hw(); + local_irq_restore(flags); /* ftrace_dyn_arch_init places the return code in addr */ - if (addr) diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 3be4b7c..c970fab 100644 --- a/lib/Kconfig.debug _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git