From 75a006d94f08c4f01e44f6caae6f161159902be7 Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Thu, 24 Feb 1994 01:49:15 +0000 Subject: [PATCH] * sparc-stub.c (trap_low): Make trap handler work for arbitrary numbers of register windows. --- gdb/ChangeLog | 3 +++ gdb/sparc-stub.c | 24 +++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 676a46ac44..5ed86ecc8a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -6,6 +6,9 @@ Wed Feb 23 16:28:55 1994 Jeffrey A. Law (law@cygnus.com) Wed Feb 23 16:21:25 1994 Stu Grossman (grossman at cygnus.com) + * sparc-stub.c (trap_low): Make trap handler work for arbitrary + numbers of register windows. + * sparclite/hello.c: Add factorial function for testing. * salib.c: Use macros instead of constants for I/O addresses to make 931 support easier. diff --git a/gdb/sparc-stub.c b/gdb/sparc-stub.c index 5de62a339e..d2e7b438a8 100644 --- a/gdb/sparc-stub.c +++ b/gdb/sparc-stub.c @@ -157,9 +157,27 @@ _trap_low: mov %g1, %l4 ! Save g1, we use it to hold the wim srl %l3, 1, %g1 ! Rotate wim right - sll %l3, 8-1, %l5 - or %l5, %g1, %g1 + tst %g1 + bg good_wim ! Branch if new wim is non-zero +! At this point, we need to bring a 1 into the high order bit of the wim. +! Since we don't want to make any assumptions about the number of register +! windows, we figure it out dynamically so as to setup the wim correctly. + + not %g1 ! Fill g1 with ones + mov %g1, %wim ! Fill the wim with ones + nop + nop + nop + mov %wim, %g1 ! Read back the wim + inc %g1 ! Now g1 has 1 just to left of wim + srl %g1, 1, %g1 ! Now put 1 at top of wim + mov %g0, %wim ! Clear wim so that subsequent save + nop ! won't trap + nop + nop + +good_wim: save %g0, %g0, %g0 ! Slip into next window mov %g1, %wim ! Install the new wim @@ -758,7 +776,7 @@ handle_exception (registers) break; #if 0 case 't': /* Test feature */ - asm (" std %f31,[%sp]"); + asm (" std %f30,[%sp]"); break; #endif case 'r': /* Reset */