Jan Kiszka wrote: > The following changes since commit 14023bef1806dd640030d3eaf73c26736345bc30: > Philippe Gerum (1): > ipipe-2.6.32.7-x86-2.6-01 > > are available in the git repository at: > > git://git.kiszka.org/ipipe-2.6 queues/2.6.32-x86 > > Found while making KVM work over I-pipe/Xenomai. Its hardware > activation code triggered a planned #GP in IRQ context. > > > Jan Kiszka (1): > x86: Fix up regs unconditionally on exceptions > > arch/x86/kernel/ipipe.c | 24 +++++++++++++----------- > 1 files changed, 13 insertions(+), 11 deletions(-) > > ------ > > x86: Fix up regs unconditionally on exceptions > > Some Linux exception handlers - at least do_general_protection - > evaluate regs->flags, and that on both x86-32 and -64. So we should fix > up the flags according to the pipeline state unconditionally.
Forgotten or intentionally skipped for 2.6-02? Hmm, I see that even the fixed-up comment in __ipipe_handle_exception is not correct anymore. I can push an updated version if you're fine with picking this up. Jan > > Signed-off-by: Jan Kiszka <[email protected]> > --- > arch/x86/kernel/ipipe.c | 24 +++++++++++++----------- > 1 files changed, 13 insertions(+), 11 deletions(-) > > diff --git a/arch/x86/kernel/ipipe.c b/arch/x86/kernel/ipipe.c > index 36cd591..dfb76ad 100644 > --- a/arch/x86/kernel/ipipe.c > +++ b/arch/x86/kernel/ipipe.c > @@ -495,8 +495,6 @@ out: > local_irq_restore_hw(flags); > } > > -#ifdef CONFIG_X86_32 > - > static inline void __fixup_if(int s, struct pt_regs *regs) > { > /* > @@ -510,6 +508,8 @@ static inline void __fixup_if(int s, struct pt_regs *regs) > regs->flags |= X86_EFLAGS_IF; > } > > +#ifdef CONFIG_X86_32 > + > /* > * Check the stall bit of the root domain to make sure the existing > * preemption opportunity upon in-kernel resumption could be > @@ -571,10 +571,6 @@ asmlinkage void __ipipe_unstall_iret_root(struct pt_regs > regs) > > #else /* !CONFIG_X86_32 */ > > -static inline void __fixup_if(int s, struct pt_regs *regs) > -{ > -} > - > #ifdef CONFIG_PREEMPT > > asmlinkage void preempt_schedule_irq(void); > @@ -746,11 +742,11 @@ int __ipipe_handle_exception(struct pt_regs *regs, long > error_code, int vector) > > if (likely(ipipe_root_domain_p)) { > /* > - * 32-bit: In case we faulted in the iret path, regs.flags do > - * not match the root domain state as the low-level return > - * code will evaluate it. Fix this up, either by the root > - * state sampled on entry or, if we migrated to root, with the > - * current state. > + * In case we faulted in the iret path, regs.flags do not > + * match the root domain state. The fault handler or the > + * low-level return code may evaluate it. Fix this up, either > + * by the root state sampled on entry or, if we migrated to > + * root, with the current state. > */ > __fixup_if(root_entry ? raw_irqs_disabled_flags(flags) : > raw_irqs_disabled(), regs); > @@ -876,7 +872,13 @@ int __ipipe_syscall_root(struct pt_regs *regs) > > local_irq_save_hw(flags); > p = ipipe_root_cpudom_ptr(); > +#ifdef CONFIG_X86_32 > + /* > + * Fix-up only required on 32-bit as only here the IRET return code > + * will evaluate the flags. > + */ > __fixup_if(test_bit(IPIPE_STALL_FLAG, &p->status), regs); > +#endif > /* > * If allowed, sync pending VIRQs before _TIF_NEED_RESCHED is > * tested.
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Adeos-main mailing list [email protected] https://mail.gna.org/listinfo/adeos-main
