int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpregs) { #ifdef __SMP__ if ( regs->msr & MSR_FP ) smp_giveup_fpu(current); #else if (last_task_used_math == current) giveup_fpu(); #endif memcpy(fpregs, ¤t->tss.fpr[0], sizeof(*fpregs)); return 1; }
void AlignmentException(struct pt_regs *regs) { int fixed; #ifdef __SMP__ if (regs->msr & MSR_FP ) smp_giveup_fpu(current); #else if (last_task_used_math == current) giveup_fpu(); #endif fixed = fix_alignment(regs); if (fixed == 1) { regs->nip += 4; /* skip over emulated instruction */ return; } if (fixed == -EFAULT) { /* fixed == -EFAULT means the operand address was bad */ bad_page_fault(regs, regs->dar); return; } _exception(SIGBUS, regs); }