I'm getting a thread crash where an unaligned floating point access occurs. I
tracked the cause down to enable_kernel_fp within the fix_alignment routine.
The enable_kernel_fp routine is as follows:
void enable_kernel_fp(void)
{
unsigned long flags;
WARN_ON(preemptible());
local_irq_save_hw_cond(flags);
#ifdef CONFIG_SMP
if (current->thread.regs && (current->thread.regs->msr & MSR_FP))
giveup_fpu(current);
else
giveup_fpu(NULL); /* just enables FP for kernel */
#else
giveup_fpu(last_task_used_math);
#endif /* CONFIG_SMP */
local_irq_restore_hw_cond(flags);
}
The local_irq_save_hw_cond saves the old MSR value in flags. When this value
is restored with local_irq_restore_hw_cond it loses the MSR[FP] bit that was
set in giveup_fpu. If the MSR[FP] was not previously set before it saved the
flags, I get a FPU exception a bit later in the alignment handling.
As a quick fix I changed the line to restore to
local_irq_restore_hw_cond(flags|MSR_FP);
I'm not sure this is a correct fix. I'm don't know where else there might be
code that is modifying the MSR in a similar fashion. It seems any such case
would be broken.
I'm using the ipipe version 2.10-03 patch that was bundled with Xenomai 2.5.4
on Linux 2.6.33.5. I noticed that this is still the same though in the 2.11-00
ipipe patch.
_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main