* sunos.c (sunos_add_one_symbol): Treat a common symbol from a
[deliverable/binutils-gdb.git] / gdb / sparc-stub.c
index f58e0c215922a8907cfe17a3328512182a4cda02..d2e7b438a8dc658d96f4779e59472198bf8bdadb 100644 (file)
@@ -31,6 +31,8 @@
  *
  *  Modified for SPARC by Stu Grossman, Cygnus Support.
  *
+ *  This code has been extensively tested on the Fujitsu SPARClite demo board.
+ *
  *  To enable debugger support, two things need to happen.  One, a
  *  call to set_debug_traps() is necessary in order to allow any breakpoints
  *  or error conditions to be properly intercepted and reported to gdb.
@@ -84,7 +86,6 @@
 
 #include <string.h>
 #include <signal.h>
-#include <memory.h>
 
 /************************************************************************
  *
@@ -156,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
 
@@ -218,9 +237,6 @@ recursive_trap:
        call    _handle_exception
        add     %sp, 24 * 4, %o0        ! Pass address of registers
 
-       restore                         ! Ensure that previous window is valid
-       save    %g0, %g0, %g0           !  by causing a window_underflow trap
-
 ! Reload all of the registers that aren't on the stack
 
        ld      [%sp + (24 + 1) * 4], %g1 ! registers[Gx]
@@ -235,6 +251,10 @@ recursive_trap:
 
        ldd     [%sp + (24 + 64) * 4], %l0 ! Y & PSR
        ldd     [%sp + (24 + 68) * 4], %l2 ! PC & NPC
+
+       restore                         ! Ensure that previous window is valid
+       save    %g0, %g0, %g0           !  by causing a window_underflow trap
+
        mov     %l0, %y
        mov     %l1, %psr               ! Make sure that traps are disabled
                                        ! for rett
@@ -756,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 */
This page took 0.026359 seconds and 4 git commands to generate.