aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc/aim
diff options
context:
space:
mode:
authorNathan Whitehorn <nwhitehorn@FreeBSD.org>2010-10-05 18:08:07 +0000
committerNathan Whitehorn <nwhitehorn@FreeBSD.org>2010-10-05 18:08:07 +0000
commit2639d62ec20d89653536117e525b59a80beaec09 (patch)
tree38f5b53bf739baeb37b7ea83a7d9e9a2f35176c4 /sys/powerpc/aim
parentfb4c8540b269a1c7f939b1a96455a11419812c97 (diff)
downloadsrc-2639d62ec20d89653536117e525b59a80beaec09.tar.gz
src-2639d62ec20d89653536117e525b59a80beaec09.zip
Handle vector assist traps without a kernel panic, by setting denormalized
values to zero. A correct solution would involve emulating vector operations on denormalized values, but this has little effect on accuracy and is much less complicated for now. MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=213456
Diffstat (limited to 'sys/powerpc/aim')
-rw-r--r--sys/powerpc/aim/machdep.c4
-rw-r--r--sys/powerpc/aim/trap.c16
2 files changed, 15 insertions, 5 deletions
diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/machdep.c
index a197681072dc..9dec1f759441 100644
--- a/sys/powerpc/aim/machdep.c
+++ b/sys/powerpc/aim/machdep.c
@@ -489,8 +489,8 @@ powerpc_init(vm_offset_t startkernel, vm_offset_t endkernel,
bcopy(generictrap, (void *)EXC_SC, (size_t)&trapsize);
bcopy(generictrap, (void *)EXC_FPA, (size_t)&trapsize);
bcopy(generictrap, (void *)EXC_VEC, (size_t)&trapsize);
- bcopy(generictrap, (void *)EXC_VECAST, (size_t)&trapsize);
- bcopy(generictrap, (void *)EXC_THRM, (size_t)&trapsize);
+ bcopy(generictrap, (void *)EXC_VECAST_G4, (size_t)&trapsize);
+ bcopy(generictrap, (void *)EXC_VECAST_G5, (size_t)&trapsize);
__syncicache(EXC_RSVD, EXC_LAST - EXC_RSVD);
/*
diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c
index 6130eab746c2..db48e7ba76ae 100644
--- a/sys/powerpc/aim/trap.c
+++ b/sys/powerpc/aim/trap.c
@@ -203,9 +203,19 @@ trap(struct trapframe *frame)
enable_vec(td);
break;
- case EXC_VECAST:
- printf("Vector assist exception!\n");
- sig = SIGILL;
+ case EXC_VECAST_G4:
+ case EXC_VECAST_G5:
+ /*
+ * We get a VPU assist exception for IEEE mode
+ * vector operations on denormalized floats.
+ * Emulating this is a giant pain, so for now,
+ * just switch off IEEE mode and treat them as
+ * zero.
+ */
+
+ save_vec(td);
+ td->td_pcb->pcb_vec.vscr |= ALTIVEC_VSCR_NJ;
+ enable_vec(td);
break;
case EXC_ALI: