> Module Name: src
> Committed By: mrg
> Date: Sun Aug 28 22:30:09 UTC 2011
>
> Modified Files:
> src/sys/arch/sparc/include: psl.h
>
> Log Message:
> apply some always_inline attribute to setpsr and spl*. while i am
> not yet sure exactly why this is necessary, but does avoid crashes
> seen on sparc INSTALL with gcc 4.5.
uwe@ helped me understand why this fixes the problem. thanks!
it goes like this:
- srmmu_vcache_flush_context() turns off traps to do
its work.
- at the end, when it is trying to turn on traps again
which happens via the now no longer inlined setpsr()
call, the caller has a tail-call optimisation on the
call to setpsr() and the asm looks like:
0xf0012f08 <srmmu_vcache_flush_context+108>: b 0xf0012618 <setpsr>
0xf0012f0c <srmmu_vcache_flush_context+112>: restore
- but wait, we have traps turned off and we're going
to execute the restore, so any time we need to clean a
register window upon restore we go boom here.
the inlined version calls restore after setting %psr, and the
trap can be handled normally.
.mrg.