powerpc: Add VSX context save/restore, ptrace and signal support
This patch extends the floating point save and restore code to use the VSX load/stores when VSX is available. This will make FP context save/restore marginally slower on FP only code, when VSX is available, as it has to load/store 128bits rather than just 64bits. Mixing FP, VMX and VSX code will get constant architected state. The signals interface is extended to enable access to VSR 0-31 doubleword 1 after discussions with tool chain maintainers. Backward compatibility is maintained. The ptrace interface is also extended to allow access to VSR 0-31 full registers. Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
72ffff5b17
commit
ce48b21007
@@ -967,6 +967,20 @@ void altivec_unavailable_exception(struct pt_regs *regs)
|
||||
die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT);
|
||||
}
|
||||
|
||||
void vsx_unavailable_exception(struct pt_regs *regs)
|
||||
{
|
||||
if (user_mode(regs)) {
|
||||
/* A user program has executed an vsx instruction,
|
||||
but this kernel doesn't support vsx. */
|
||||
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_EMERG "Unrecoverable VSX Unavailable Exception "
|
||||
"%lx at %lx\n", regs->trap, regs->nip);
|
||||
die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT);
|
||||
}
|
||||
|
||||
void performance_monitor_exception(struct pt_regs *regs)
|
||||
{
|
||||
perf_irq(regs);
|
||||
@@ -1099,6 +1113,21 @@ void altivec_assist_exception(struct pt_regs *regs)
|
||||
}
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
|
||||
#ifdef CONFIG_VSX
|
||||
void vsx_assist_exception(struct pt_regs *regs)
|
||||
{
|
||||
if (!user_mode(regs)) {
|
||||
printk(KERN_EMERG "VSX assist exception in kernel mode"
|
||||
" at %lx\n", regs->nip);
|
||||
die("Kernel VSX assist exception", regs, SIGILL);
|
||||
}
|
||||
|
||||
flush_vsx_to_thread(current);
|
||||
printk(KERN_INFO "VSX assist not supported at %lx\n", regs->nip);
|
||||
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
||||
}
|
||||
#endif /* CONFIG_VSX */
|
||||
|
||||
#ifdef CONFIG_FSL_BOOKE
|
||||
void CacheLockingException(struct pt_regs *regs, unsigned long address,
|
||||
unsigned long error_code)
|
||||
|
Reference in New Issue
Block a user