diff options
| author | Paul Mackerras <paulus@samba.org> | 2004-06-22 05:52:14 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-06-22 05:52:14 -0700 |
| commit | 7a08473bfee8b94befd7b38333d747290668848a (patch) | |
| tree | 6091f120d68fdc538ba43a922693479a7dec91f8 /include | |
| parent | 6340e7ba74ed8334a6a0505121c995a5baa70d7c (diff) | |
[PATCH] Handle altivec assist exception properly
This is the PPC64 counterpart of the PPC32 Altivec assist exception
handler that went in recently.
On PPC64 machines with Altivec (i.e. machines that use the PPC970 chip,
such as the G5 powermac), the altivec floating-point instructions can
operate in two modes: one where denormalized inputs or outputs are
truncated to zero, and one where they aren't. In the latter mode the
processor can take an exception when it encounters denormalized
floating-point inputs or outputs rather than dealing with them in
hardware.
This patch adds code to deal properly with the exception, by emulating
the instruction that caused the exception. Previously the kernel just
switched the altivec unit into the truncate-to-zero mode, which works
but is a bit gross. Fortunately there are only a limited set of altivec
instructions which can generate the assist exception, so we don't have
to emulate the whole altivec instruction set.
Note that Altivec is Motorola's name for the PowerPC vector/SIMD
instructions; IBM calls the same thing VMX, and currently only IBM makes
64-bit PowerPC CPU chips. Nevertheless, I have used the term Altivec in
the PPC64 code for consistency with the PPC32 code.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-ppc64/system.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/asm-ppc64/system.h b/include/asm-ppc64/system.h index 67ac484a14cd..06ecd1bb285d 100644 --- a/include/asm-ppc64/system.h +++ b/include/asm-ppc64/system.h @@ -116,6 +116,7 @@ extern void enable_kernel_fp(void); extern void giveup_altivec(struct task_struct *); extern void disable_kernel_altivec(void); extern void enable_kernel_altivec(void); +extern int emulate_altivec(struct pt_regs *); extern void cvt_fd(float *from, double *to, unsigned long *fpscr); extern void cvt_df(double *from, float *to, unsigned long *fpscr); |
