diff options
author | Keith Owens <kaos@sgi.com> | 2005-07-21 23:41:00 -0700 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-07-27 14:18:08 -0700 |
commit | b833961bd30eec201b9a94eec36aa7ac96f9c9c0 (patch) | |
tree | 2ae8efad5995f7f23564304fd5027bea026ac65e /arch/ia64/kernel/perfmon_generic.h | |
parent | d108919b2b5c064946c9bd30cbd4761d491cddb0 (diff) | |
download | blackbird-op-linux-b833961bd30eec201b9a94eec36aa7ac96f9c9c0.tar.gz blackbird-op-linux-b833961bd30eec201b9a94eec36aa7ac96f9c9c0.zip |
[IA64] unwind.c uses wrong unat from switch_stack
unwind.c can read the wrong unat bits from switch_stack.
sw->caller_unat is the value of ar.unat when the task was blocked.
sw->ar_unat is the value of ar.unat after doing st8.spill for r4-7.
IOW, ar_unat is caller_unat with 4 bits changed.
unw_access_gr() uses sw->ar_unat for r4-7 (correct), but it also uses
sw->ar_unat for other scratch registers (incorrect). sw->ar_unat
should only be used for r4-7, everything else should use
sw->caller_unat, unless modified by unwind info. Using sw->ar_unat
risks picking up the 4 bits that were overwritten when r4-7 were saved.
Also this line is wrong
unw.sw_off[unw.preg_index[UNW_REG_PFS]] = SW(AR_UNAT);
and should be
unw.sw_off[unw.preg_index[UNW_REG_PFS]] = SW(AR_PFS);
Signed-off-by: Keith Owens <kaos@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/perfmon_generic.h')
0 files changed, 0 insertions, 0 deletions