From 0fa9c0072869442b1991859e8502cebe197afff3 Mon Sep 17 00:00:00 2001 From: grehan Date: Sat, 30 Jul 2005 11:14:31 +0000 Subject: [PATCH] Temporary band-aid to fix hang when a process exec's Altivec instructions. trap_subr.S: declare a stub for the a-unavailable trap that does an absolute jump to the vector-assist trap. This is due to the fact that the vec-unavail trap doesn't start at a 256-byte boundary, so the trick of masking the bottom 8 bits of the link register to identify the interrupt doesn't work, so let the vec-assist case handle Altivec-disabled for the time being. Note that this will be fixed in the future with a much smaller vector code-stub (< 16 bytes) that will allow use of strange vector offsets that are also present in 4xx processors, and also allow smaller differences in vector codepaths on the G5. trap.c: Treat altivec-unavailable/assist process traps as SIGILL. Not quite correct, since altivec-assist should really be a panic, but it is fine for the moment due to the above measure. machdep.c Install the stub code for the altivec-unavailable trap, and the standard trap code at the altivec-assist. Reported by: Andreas Tobler MFC after: 3 days --- sys/powerpc/aim/machdep.c | 3 +++ sys/powerpc/aim/trap.c | 5 +++++ sys/powerpc/aim/trap_subr.S | 8 ++++++++ sys/powerpc/powerpc/machdep.c | 3 +++ sys/powerpc/powerpc/trap.c | 5 +++++ sys/powerpc/powerpc/trap_subr.S | 8 ++++++++ 6 files changed, 32 insertions(+) diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/machdep.c index 75b59186187e..a74cc27286e4 100644 --- a/sys/powerpc/aim/machdep.c +++ b/sys/powerpc/aim/machdep.c @@ -247,6 +247,7 @@ extern void *dsitrap, *dsisize; extern void *decrint, *decrsize; extern void *extint, *extsize; extern void *dblow, *dbsize; +extern void *vectrap, *vectrapsize; void powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) @@ -335,6 +336,8 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) bcopy(&trapcode, (void *)EXC_SC, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_TRC, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_FPA, (size_t)&trapsize); + bcopy(&vectrap, (void *)EXC_VEC, (size_t)&vectrapsize); + bcopy(&trapcode, (void *)EXC_VECAST, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_THRM, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_BPT, (size_t)&trapsize); #ifdef KDB diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c index 669bb60b939d..85bdab95ccd1 100644 --- a/sys/powerpc/aim/trap.c +++ b/sys/powerpc/aim/trap.c @@ -199,6 +199,11 @@ trap(struct trapframe *frame) enable_vec(td); frame->srr1 |= PSL_VEC; break; +#else + case EXC_VEC: + case EXC_VECAST: + sig = SIGILL; + break; #endif /* ALTIVEC */ case EXC_ALI: diff --git a/sys/powerpc/aim/trap_subr.S b/sys/powerpc/aim/trap_subr.S index 60435dd83481..c7199171df03 100644 --- a/sys/powerpc/aim/trap_subr.S +++ b/sys/powerpc/aim/trap_subr.S @@ -443,6 +443,14 @@ CNAME(trapexit): FRAME_LEAVE(PC_TEMPSAVE) rfi +/* + * Temporary: vector-unavailable traps are directed to vector-assist traps + */ + .globl CNAME(vectrap),CNAME(vectrapsize) +CNAME(vectrap): + ba EXC_VECAST +CNAME(vectrapsize) = .-CNAME(vectrap) + #if defined(KDB) /* * Deliberate entry to dbtrap diff --git a/sys/powerpc/powerpc/machdep.c b/sys/powerpc/powerpc/machdep.c index 75b59186187e..a74cc27286e4 100644 --- a/sys/powerpc/powerpc/machdep.c +++ b/sys/powerpc/powerpc/machdep.c @@ -247,6 +247,7 @@ extern void *dsitrap, *dsisize; extern void *decrint, *decrsize; extern void *extint, *extsize; extern void *dblow, *dbsize; +extern void *vectrap, *vectrapsize; void powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) @@ -335,6 +336,8 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) bcopy(&trapcode, (void *)EXC_SC, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_TRC, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_FPA, (size_t)&trapsize); + bcopy(&vectrap, (void *)EXC_VEC, (size_t)&vectrapsize); + bcopy(&trapcode, (void *)EXC_VECAST, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_THRM, (size_t)&trapsize); bcopy(&trapcode, (void *)EXC_BPT, (size_t)&trapsize); #ifdef KDB diff --git a/sys/powerpc/powerpc/trap.c b/sys/powerpc/powerpc/trap.c index 669bb60b939d..85bdab95ccd1 100644 --- a/sys/powerpc/powerpc/trap.c +++ b/sys/powerpc/powerpc/trap.c @@ -199,6 +199,11 @@ trap(struct trapframe *frame) enable_vec(td); frame->srr1 |= PSL_VEC; break; +#else + case EXC_VEC: + case EXC_VECAST: + sig = SIGILL; + break; #endif /* ALTIVEC */ case EXC_ALI: diff --git a/sys/powerpc/powerpc/trap_subr.S b/sys/powerpc/powerpc/trap_subr.S index 60435dd83481..c7199171df03 100644 --- a/sys/powerpc/powerpc/trap_subr.S +++ b/sys/powerpc/powerpc/trap_subr.S @@ -443,6 +443,14 @@ CNAME(trapexit): FRAME_LEAVE(PC_TEMPSAVE) rfi +/* + * Temporary: vector-unavailable traps are directed to vector-assist traps + */ + .globl CNAME(vectrap),CNAME(vectrapsize) +CNAME(vectrap): + ba EXC_VECAST +CNAME(vectrapsize) = .-CNAME(vectrap) + #if defined(KDB) /* * Deliberate entry to dbtrap