]> Git Repo - binutils.git/blob - gdb/sparcl-stub.c
2003-09-20 Andrew Cagney <[email protected]>
[binutils.git] / gdb / sparcl-stub.c
1 // OBSOLETE /****************************************************************************
2 // OBSOLETE 
3 // OBSOLETE             THIS SOFTWARE IS NOT COPYRIGHTED
4 // OBSOLETE 
5 // OBSOLETE    HP offers the following for use in the public domain.  HP makes no
6 // OBSOLETE    warranty with regard to the software or it's performance and the
7 // OBSOLETE    user accepts the software "AS IS" with all faults.
8 // OBSOLETE 
9 // OBSOLETE    HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
10 // OBSOLETE    TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
11 // OBSOLETE    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
12 // OBSOLETE 
13 // OBSOLETE ****************************************************************************/
14 // OBSOLETE 
15 // OBSOLETE /****************************************************************************
16 // OBSOLETE  *  Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
17 // OBSOLETE  *
18 // OBSOLETE  *  Module name: remcom.c $
19 // OBSOLETE  *  Revision: 1.34 $
20 // OBSOLETE  *  Date: 91/03/09 12:29:49 $
21 // OBSOLETE  *  Contributor:     Lake Stevens Instrument Division$
22 // OBSOLETE  *
23 // OBSOLETE  *  Description:     low level support for gdb debugger. $
24 // OBSOLETE  *
25 // OBSOLETE  *  Considerations:  only works on target hardware $
26 // OBSOLETE  *
27 // OBSOLETE  *  Written by:      Glenn Engel $
28 // OBSOLETE  *  ModuleState:     Experimental $
29 // OBSOLETE  *
30 // OBSOLETE  *  NOTES:           See Below $
31 // OBSOLETE  *
32 // OBSOLETE  *  Modified for SPARC by Stu Grossman, Cygnus Support.
33 // OBSOLETE  *  Based on sparc-stub.c, it's modified for SPARClite Debug Unit hardware
34 // OBSOLETE  *  breakpoint support to create sparclite-stub.c, by Kung Hsu, Cygnus Support.
35 // OBSOLETE  *
36 // OBSOLETE  *  This code has been extensively tested on the Fujitsu SPARClite demo board.
37 // OBSOLETE  *
38 // OBSOLETE  *  To enable debugger support, two things need to happen.  One, a
39 // OBSOLETE  *  call to set_debug_traps() is necessary in order to allow any breakpoints
40 // OBSOLETE  *  or error conditions to be properly intercepted and reported to gdb.
41 // OBSOLETE  *  Two, a breakpoint needs to be generated to begin communication.  This
42 // OBSOLETE  *  is most easily accomplished by a call to breakpoint().  Breakpoint()
43 // OBSOLETE  *  simulates a breakpoint by executing a trap #1.
44 // OBSOLETE  *
45 // OBSOLETE  *************
46 // OBSOLETE  *
47 // OBSOLETE  *    The following gdb commands are supported:
48 // OBSOLETE  *
49 // OBSOLETE  * command          function                               Return value
50 // OBSOLETE  *
51 // OBSOLETE  *    g             return the value of the CPU registers  hex data or ENN
52 // OBSOLETE  *    G             set the value of the CPU registers     OK or ENN
53 // OBSOLETE  *    P             set the value of a single CPU register OK or ENN
54 // OBSOLETE  *
55 // OBSOLETE  *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
56 // OBSOLETE  *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
57 // OBSOLETE  *
58 // OBSOLETE  *    c             Resume at current address              SNN   ( signal NN)
59 // OBSOLETE  *    cAA..AA       Continue at address AA..AA             SNN
60 // OBSOLETE  *
61 // OBSOLETE  *    s             Step one instruction                   SNN
62 // OBSOLETE  *    sAA..AA       Step one instruction from AA..AA       SNN
63 // OBSOLETE  *
64 // OBSOLETE  *    k             kill
65 // OBSOLETE  *
66 // OBSOLETE  *    ?             What was the last sigval ?             SNN   (signal NN)
67 // OBSOLETE  *
68 // OBSOLETE  * All commands and responses are sent with a packet which includes a
69 // OBSOLETE  * checksum.  A packet consists of
70 // OBSOLETE  *
71 // OBSOLETE  * $<packet info>#<checksum>.
72 // OBSOLETE  *
73 // OBSOLETE  * where
74 // OBSOLETE  * <packet info> :: <characters representing the command or response>
75 // OBSOLETE  * <checksum>    :: < two hex digits computed as modulo 256 sum of <packetinfo>>
76 // OBSOLETE  *
77 // OBSOLETE  * When a packet is received, it is first acknowledged with either '+' or '-'.
78 // OBSOLETE  * '+' indicates a successful transfer.  '-' indicates a failed transfer.
79 // OBSOLETE  *
80 // OBSOLETE  * Example:
81 // OBSOLETE  *
82 // OBSOLETE  * Host:                  Reply:
83 // OBSOLETE  * $m0,10#2a               +$00010203040506070809101112131415#42
84 // OBSOLETE  *
85 // OBSOLETE  ****************************************************************************/
86 // OBSOLETE 
87 // OBSOLETE #include <string.h>
88 // OBSOLETE #include <signal.h>
89 // OBSOLETE #include <sparclite.h>
90 // OBSOLETE 
91 // OBSOLETE /************************************************************************
92 // OBSOLETE  *
93 // OBSOLETE  * external low-level support routines
94 // OBSOLETE  */
95 // OBSOLETE 
96 // OBSOLETE extern void putDebugChar (int c); /* write a single character      */
97 // OBSOLETE extern int getDebugChar (void);     /* read and return a single char */
98 // OBSOLETE 
99 // OBSOLETE /************************************************************************/
100 // OBSOLETE /* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
101 // OBSOLETE /* at least NUMREGBYTES*2 are needed for register packets */
102 // OBSOLETE #define BUFMAX 2048
103 // OBSOLETE 
104 // OBSOLETE static int initialized = 0; /* !0 means we've been initialized */
105 // OBSOLETE 
106 // OBSOLETE extern void breakinst ();
107 // OBSOLETE static void set_mem_fault_trap (int enable);
108 // OBSOLETE static void get_in_break_mode (void);
109 // OBSOLETE 
110 // OBSOLETE static const char hexchars[]="0123456789abcdef";
111 // OBSOLETE 
112 // OBSOLETE #define NUMREGS 80 
113 // OBSOLETE 
114 // OBSOLETE /* Number of bytes of registers.  */
115 // OBSOLETE #define NUMREGBYTES (NUMREGS * 4)
116 // OBSOLETE enum regnames {G0, G1, G2, G3, G4, G5, G6, G7,
117 // OBSOLETE              O0, O1, O2, O3, O4, O5, SP, O7,
118 // OBSOLETE              L0, L1, L2, L3, L4, L5, L6, L7,
119 // OBSOLETE              I0, I1, I2, I3, I4, I5, FP, I7,
120 // OBSOLETE 
121 // OBSOLETE              F0, F1, F2, F3, F4, F5, F6, F7,
122 // OBSOLETE              F8, F9, F10, F11, F12, F13, F14, F15,
123 // OBSOLETE              F16, F17, F18, F19, F20, F21, F22, F23,
124 // OBSOLETE              F24, F25, F26, F27, F28, F29, F30, F31,
125 // OBSOLETE              Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR,
126 // OBSOLETE              DIA1, DIA2, DDA1, DDA2, DDV1, DDV2, DCR, DSR };
127 // OBSOLETE 
128 // OBSOLETE /***************************  ASSEMBLY CODE MACROS *************************/
129 // OBSOLETE /*                                                                     */
130 // OBSOLETE 
131 // OBSOLETE extern void trap_low();
132 // OBSOLETE 
133 // OBSOLETE /* Create private copies of common functions used by the stub.  This prevents
134 // OBSOLETE    nasty interactions between app code and the stub (for instance if user steps
135 // OBSOLETE    into strlen, etc..) */
136 // OBSOLETE 
137 // OBSOLETE static char *
138 // OBSOLETE strcpy (char *dst, const char *src)
139 // OBSOLETE {
140 // OBSOLETE   char *retval = dst;
141 // OBSOLETE 
142 // OBSOLETE   while ((*dst++ = *src++) != '\000');
143 // OBSOLETE 
144 // OBSOLETE   return retval;
145 // OBSOLETE }
146 // OBSOLETE 
147 // OBSOLETE static void *
148 // OBSOLETE memcpy (void *vdst, const void *vsrc, int n)
149 // OBSOLETE {
150 // OBSOLETE   char *dst = vdst;
151 // OBSOLETE   const char *src = vsrc;
152 // OBSOLETE   char *retval = dst;
153 // OBSOLETE 
154 // OBSOLETE   while (n-- > 0)
155 // OBSOLETE     *dst++ = *src++;
156 // OBSOLETE 
157 // OBSOLETE   return retval;
158 // OBSOLETE }
159 // OBSOLETE 
160 // OBSOLETE asm("
161 // OBSOLETE     .reserve trapstack, 1000 * 4, \"bss\", 8
162 // OBSOLETE 
163 // OBSOLETE     .data
164 // OBSOLETE     .align  4
165 // OBSOLETE 
166 // OBSOLETE in_trap_handler:
167 // OBSOLETE     .word   0
168 // OBSOLETE 
169 // OBSOLETE     .text
170 // OBSOLETE     .align 4
171 // OBSOLETE 
172 // OBSOLETE ! This function is called when any SPARC trap (except window overflow or
173 // OBSOLETE ! underflow) occurs.  It makes sure that the invalid register window is still
174 // OBSOLETE ! available before jumping into C code.  It will also restore the world if you
175 // OBSOLETE ! return from handle_exception.
176 // OBSOLETE !
177 // OBSOLETE ! On entry, trap_low expects l1 and l2 to contain pc and npc respectivly.
178 // OBSOLETE ! Register usage throughout the routine is as follows:
179 // OBSOLETE !
180 // OBSOLETE !   l0 - psr
181 // OBSOLETE !   l1 - pc
182 // OBSOLETE !   l2 - npc
183 // OBSOLETE !   l3 - wim
184 // OBSOLETE !   l4 - scratch and y reg
185 // OBSOLETE !   l5 - scratch and tbr
186 // OBSOLETE !   l6 - unused
187 // OBSOLETE !   l7 - unused
188 // OBSOLETE 
189 // OBSOLETE     .globl _trap_low
190 // OBSOLETE _trap_low:
191 // OBSOLETE     mov     %psr, %l0
192 // OBSOLETE     mov     %wim, %l3
193 // OBSOLETE 
194 // OBSOLETE     srl     %l3, %l0, %l4           ! wim >> cwp
195 // OBSOLETE     cmp     %l4, 1
196 // OBSOLETE     bne     window_fine             ! Branch if not in the invalid window
197 // OBSOLETE     nop
198 // OBSOLETE 
199 // OBSOLETE ! Handle window overflow
200 // OBSOLETE 
201 // OBSOLETE     mov     %g1, %l4                ! Save g1, we use it to hold the wim
202 // OBSOLETE     srl     %l3, 1, %g1             ! Rotate wim right
203 // OBSOLETE     tst     %g1
204 // OBSOLETE     bg      good_wim                ! Branch if new wim is non-zero
205 // OBSOLETE     nop
206 // OBSOLETE 
207 // OBSOLETE ! At this point, we need to bring a 1 into the high order bit of the wim.
208 // OBSOLETE ! Since we don't want to make any assumptions about the number of register
209 // OBSOLETE ! windows, we figure it out dynamically so as to setup the wim correctly.
210 // OBSOLETE 
211 // OBSOLETE     not     %g1                     ! Fill g1 with ones
212 // OBSOLETE     mov     %g1, %wim               ! Fill the wim with ones
213 // OBSOLETE     nop
214 // OBSOLETE     nop
215 // OBSOLETE     nop
216 // OBSOLETE     mov     %wim, %g1               ! Read back the wim
217 // OBSOLETE     inc     %g1                     ! Now g1 has 1 just to left of wim
218 // OBSOLETE     srl     %g1, 1, %g1             ! Now put 1 at top of wim
219 // OBSOLETE     mov     %g0, %wim               ! Clear wim so that subsequent save
220 // OBSOLETE     nop                             !  won't trap
221 // OBSOLETE     nop
222 // OBSOLETE     nop
223 // OBSOLETE 
224 // OBSOLETE good_wim:
225 // OBSOLETE     save    %g0, %g0, %g0           ! Slip into next window
226 // OBSOLETE     mov     %g1, %wim               ! Install the new wim
227 // OBSOLETE 
228 // OBSOLETE     std     %l0, [%sp + 0 * 4]      ! save L & I registers
229 // OBSOLETE     std     %l2, [%sp + 2 * 4]
230 // OBSOLETE     std     %l4, [%sp + 4 * 4]
231 // OBSOLETE     std     %l6, [%sp + 6 * 4]
232 // OBSOLETE 
233 // OBSOLETE     std     %i0, [%sp + 8 * 4]
234 // OBSOLETE     std     %i2, [%sp + 10 * 4]
235 // OBSOLETE     std     %i4, [%sp + 12 * 4]
236 // OBSOLETE     std     %i6, [%sp + 14 * 4]
237 // OBSOLETE 
238 // OBSOLETE     restore                         ! Go back to trap window.
239 // OBSOLETE     mov     %l4, %g1                ! Restore %g1
240 // OBSOLETE 
241 // OBSOLETE window_fine:
242 // OBSOLETE     sethi   %hi(in_trap_handler), %l4
243 // OBSOLETE     ld      [%lo(in_trap_handler) + %l4], %l5
244 // OBSOLETE     tst     %l5
245 // OBSOLETE     bg      recursive_trap
246 // OBSOLETE     inc     %l5
247 // OBSOLETE 
248 // OBSOLETE     set     trapstack+1000*4, %sp   ! Switch to trap stack
249 // OBSOLETE 
250 // OBSOLETE recursive_trap:
251 // OBSOLETE     st      %l5, [%lo(in_trap_handler) + %l4]
252 // OBSOLETE     sub     %sp,(16+1+6+1+80)*4,%sp ! Make room for input & locals
253 // OBSOLETE                                     ! + hidden arg + arg spill
254 // OBSOLETE                                     ! + doubleword alignment
255 // OBSOLETE                                     ! + registers[72] local var
256 // OBSOLETE 
257 // OBSOLETE     std     %g0, [%sp + (24 + 0) * 4] ! registers[Gx]
258 // OBSOLETE     std     %g2, [%sp + (24 + 2) * 4]
259 // OBSOLETE     std     %g4, [%sp + (24 + 4) * 4]
260 // OBSOLETE     std     %g6, [%sp + (24 + 6) * 4]
261 // OBSOLETE 
262 // OBSOLETE     std     %i0, [%sp + (24 + 8) * 4] ! registers[Ox]
263 // OBSOLETE     std     %i2, [%sp + (24 + 10) * 4]
264 // OBSOLETE     std     %i4, [%sp + (24 + 12) * 4]
265 // OBSOLETE     std     %i6, [%sp + (24 + 14) * 4]
266 // OBSOLETE 
267 // OBSOLETE     mov     %y, %l4
268 // OBSOLETE     mov     %tbr, %l5
269 // OBSOLETE     st      %l4, [%sp + (24 + 64) * 4] ! Y
270 // OBSOLETE     st      %l0, [%sp + (24 + 65) * 4] ! PSR
271 // OBSOLETE     st      %l3, [%sp + (24 + 66) * 4] ! WIM
272 // OBSOLETE     st      %l5, [%sp + (24 + 67) * 4] ! TBR
273 // OBSOLETE     st      %l1, [%sp + (24 + 68) * 4] ! PC
274 // OBSOLETE     st      %l2, [%sp + (24 + 69) * 4] ! NPC
275 // OBSOLETE 
276 // OBSOLETE     or      %l0, 0xf20, %l4
277 // OBSOLETE     mov     %l4, %psr               ! Turn on traps, disable interrupts
278 // OBSOLETE 
279 // OBSOLETE     set     0x1000, %l1
280 // OBSOLETE     btst    %l1, %l0                ! FP enabled?
281 // OBSOLETE     be      no_fpstore
282 // OBSOLETE     nop
283 // OBSOLETE 
284 // OBSOLETE ! Must save fsr first, to flush the FQ.  This may cause a deferred fp trap, so
285 // OBSOLETE ! traps must be enabled to allow the trap handler to clean things up.
286 // OBSOLETE 
287 // OBSOLETE     st      %fsr, [%sp + (24 + 70) * 4]
288 // OBSOLETE 
289 // OBSOLETE     std     %f0, [%sp + (24 + 32) * 4]
290 // OBSOLETE     std     %f2, [%sp + (24 + 34) * 4]
291 // OBSOLETE     std     %f4, [%sp + (24 + 36) * 4]
292 // OBSOLETE     std     %f6, [%sp + (24 + 38) * 4]
293 // OBSOLETE     std     %f8, [%sp + (24 + 40) * 4]
294 // OBSOLETE     std     %f10, [%sp + (24 + 42) * 4]
295 // OBSOLETE     std     %f12, [%sp + (24 + 44) * 4]
296 // OBSOLETE     std     %f14, [%sp + (24 + 46) * 4]
297 // OBSOLETE     std     %f16, [%sp + (24 + 48) * 4]
298 // OBSOLETE     std     %f18, [%sp + (24 + 50) * 4]
299 // OBSOLETE     std     %f20, [%sp + (24 + 52) * 4]
300 // OBSOLETE     std     %f22, [%sp + (24 + 54) * 4]
301 // OBSOLETE     std     %f24, [%sp + (24 + 56) * 4]
302 // OBSOLETE     std     %f26, [%sp + (24 + 58) * 4]
303 // OBSOLETE     std     %f28, [%sp + (24 + 60) * 4]
304 // OBSOLETE     std     %f30, [%sp + (24 + 62) * 4]
305 // OBSOLETE no_fpstore:
306 // OBSOLETE 
307 // OBSOLETE     call    _handle_exception
308 // OBSOLETE     add     %sp, 24 * 4, %o0        ! Pass address of registers
309 // OBSOLETE 
310 // OBSOLETE ! Reload all of the registers that aren't on the stack
311 // OBSOLETE 
312 // OBSOLETE     ld      [%sp + (24 + 1) * 4], %g1 ! registers[Gx]
313 // OBSOLETE     ldd     [%sp + (24 + 2) * 4], %g2
314 // OBSOLETE     ldd     [%sp + (24 + 4) * 4], %g4
315 // OBSOLETE     ldd     [%sp + (24 + 6) * 4], %g6
316 // OBSOLETE 
317 // OBSOLETE     ldd     [%sp + (24 + 8) * 4], %i0 ! registers[Ox]
318 // OBSOLETE     ldd     [%sp + (24 + 10) * 4], %i2
319 // OBSOLETE     ldd     [%sp + (24 + 12) * 4], %i4
320 // OBSOLETE     ldd     [%sp + (24 + 14) * 4], %i6
321 // OBSOLETE 
322 // OBSOLETE 
323 // OBSOLETE     ldd     [%sp + (24 + 64) * 4], %l0 ! Y & PSR
324 // OBSOLETE     ldd     [%sp + (24 + 68) * 4], %l2 ! PC & NPC
325 // OBSOLETE 
326 // OBSOLETE     set     0x1000, %l5
327 // OBSOLETE     btst    %l5, %l1                ! FP enabled?
328 // OBSOLETE     be      no_fpreload
329 // OBSOLETE     nop
330 // OBSOLETE 
331 // OBSOLETE     ldd     [%sp + (24 + 32) * 4], %f0
332 // OBSOLETE     ldd     [%sp + (24 + 34) * 4], %f2
333 // OBSOLETE     ldd     [%sp + (24 + 36) * 4], %f4
334 // OBSOLETE     ldd     [%sp + (24 + 38) * 4], %f6
335 // OBSOLETE     ldd     [%sp + (24 + 40) * 4], %f8
336 // OBSOLETE     ldd     [%sp + (24 + 42) * 4], %f10
337 // OBSOLETE     ldd     [%sp + (24 + 44) * 4], %f12
338 // OBSOLETE     ldd     [%sp + (24 + 46) * 4], %f14
339 // OBSOLETE     ldd     [%sp + (24 + 48) * 4], %f16
340 // OBSOLETE     ldd     [%sp + (24 + 50) * 4], %f18
341 // OBSOLETE     ldd     [%sp + (24 + 52) * 4], %f20
342 // OBSOLETE     ldd     [%sp + (24 + 54) * 4], %f22
343 // OBSOLETE     ldd     [%sp + (24 + 56) * 4], %f24
344 // OBSOLETE     ldd     [%sp + (24 + 58) * 4], %f26
345 // OBSOLETE     ldd     [%sp + (24 + 60) * 4], %f28
346 // OBSOLETE     ldd     [%sp + (24 + 62) * 4], %f30
347 // OBSOLETE 
348 // OBSOLETE     ld      [%sp + (24 + 70) * 4], %fsr
349 // OBSOLETE no_fpreload:
350 // OBSOLETE 
351 // OBSOLETE     restore                         ! Ensure that previous window is valid
352 // OBSOLETE     save    %g0, %g0, %g0           !  by causing a window_underflow trap
353 // OBSOLETE 
354 // OBSOLETE     mov     %l0, %y
355 // OBSOLETE     mov     %l1, %psr               ! Make sure that traps are disabled
356 // OBSOLETE                                     ! for rett
357 // OBSOLETE     sethi   %hi(in_trap_handler), %l4
358 // OBSOLETE     ld      [%lo(in_trap_handler) + %l4], %l5
359 // OBSOLETE     dec     %l5
360 // OBSOLETE     st      %l5, [%lo(in_trap_handler) + %l4]
361 // OBSOLETE 
362 // OBSOLETE     jmpl    %l2, %g0                ! Restore old PC
363 // OBSOLETE     rett    %l3                     ! Restore old nPC
364 // OBSOLETE ");
365 // OBSOLETE 
366 // OBSOLETE /* Convert ch from a hex digit to an int */
367 // OBSOLETE 
368 // OBSOLETE static int
369 // OBSOLETE hex (unsigned char ch)
370 // OBSOLETE {
371 // OBSOLETE   if (ch >= 'a' && ch <= 'f')
372 // OBSOLETE     return ch-'a'+10;
373 // OBSOLETE   if (ch >= '0' && ch <= '9')
374 // OBSOLETE     return ch-'0';
375 // OBSOLETE   if (ch >= 'A' && ch <= 'F')
376 // OBSOLETE     return ch-'A'+10;
377 // OBSOLETE   return -1;
378 // OBSOLETE }
379 // OBSOLETE 
380 // OBSOLETE static char remcomInBuffer[BUFMAX];
381 // OBSOLETE static char remcomOutBuffer[BUFMAX];
382 // OBSOLETE 
383 // OBSOLETE /* scan for the sequence $<data>#<checksum>     */
384 // OBSOLETE 
385 // OBSOLETE unsigned char *
386 // OBSOLETE getpacket (void)
387 // OBSOLETE {
388 // OBSOLETE   unsigned char *buffer = &remcomInBuffer[0];
389 // OBSOLETE   unsigned char checksum;
390 // OBSOLETE   unsigned char xmitcsum;
391 // OBSOLETE   int count;
392 // OBSOLETE   char ch;
393 // OBSOLETE 
394 // OBSOLETE   while (1)
395 // OBSOLETE     {
396 // OBSOLETE       /* wait around for the start character, ignore all other characters */
397 // OBSOLETE       while ((ch = getDebugChar ()) != '$')
398 // OBSOLETE     ;
399 // OBSOLETE 
400 // OBSOLETE retry:
401 // OBSOLETE       checksum = 0;
402 // OBSOLETE       xmitcsum = -1;
403 // OBSOLETE       count = 0;
404 // OBSOLETE 
405 // OBSOLETE       /* now, read until a # or end of buffer is found */
406 // OBSOLETE       while (count < BUFMAX)
407 // OBSOLETE     {
408 // OBSOLETE       ch = getDebugChar ();
409 // OBSOLETE           if (ch == '$')
410 // OBSOLETE             goto retry;
411 // OBSOLETE       if (ch == '#')
412 // OBSOLETE         break;
413 // OBSOLETE       checksum = checksum + ch;
414 // OBSOLETE       buffer[count] = ch;
415 // OBSOLETE       count = count + 1;
416 // OBSOLETE     }
417 // OBSOLETE       buffer[count] = 0;
418 // OBSOLETE 
419 // OBSOLETE       if (ch == '#')
420 // OBSOLETE     {
421 // OBSOLETE       ch = getDebugChar ();
422 // OBSOLETE       xmitcsum = hex (ch) << 4;
423 // OBSOLETE       ch = getDebugChar ();
424 // OBSOLETE       xmitcsum += hex (ch);
425 // OBSOLETE 
426 // OBSOLETE       if (checksum != xmitcsum)
427 // OBSOLETE         {
428 // OBSOLETE           putDebugChar ('-');       /* failed checksum */
429 // OBSOLETE         }
430 // OBSOLETE       else
431 // OBSOLETE         {
432 // OBSOLETE           putDebugChar ('+');       /* successful transfer */
433 // OBSOLETE 
434 // OBSOLETE           /* if a sequence char is present, reply the sequence ID */
435 // OBSOLETE           if (buffer[2] == ':')
436 // OBSOLETE             {
437 // OBSOLETE               putDebugChar (buffer[0]);
438 // OBSOLETE               putDebugChar (buffer[1]);
439 // OBSOLETE 
440 // OBSOLETE               return &buffer[3];
441 // OBSOLETE             }
442 // OBSOLETE 
443 // OBSOLETE           return &buffer[0];
444 // OBSOLETE         }
445 // OBSOLETE     }
446 // OBSOLETE     }
447 // OBSOLETE }
448 // OBSOLETE 
449 // OBSOLETE /* send the packet in buffer.  */
450 // OBSOLETE 
451 // OBSOLETE static void
452 // OBSOLETE putpacket (unsigned char *buffer)
453 // OBSOLETE {
454 // OBSOLETE   unsigned char checksum;
455 // OBSOLETE   int count;
456 // OBSOLETE   unsigned char ch;
457 // OBSOLETE 
458 // OBSOLETE   /*  $<packet info>#<checksum>. */
459 // OBSOLETE   do
460 // OBSOLETE     {
461 // OBSOLETE       putDebugChar('$');
462 // OBSOLETE       checksum = 0;
463 // OBSOLETE       count = 0;
464 // OBSOLETE 
465 // OBSOLETE       while (ch = buffer[count])
466 // OBSOLETE     {
467 // OBSOLETE       putDebugChar (ch);
468 // OBSOLETE       checksum += ch;
469 // OBSOLETE       count += 1;
470 // OBSOLETE     }
471 // OBSOLETE 
472 // OBSOLETE       putDebugChar('#');
473 // OBSOLETE       putDebugChar(hexchars[checksum >> 4]);
474 // OBSOLETE       putDebugChar(hexchars[checksum & 0xf]);
475 // OBSOLETE 
476 // OBSOLETE     }
477 // OBSOLETE   while (getDebugChar() != '+');
478 // OBSOLETE }
479 // OBSOLETE 
480 // OBSOLETE /* Indicate to caller of mem2hex or hex2mem that there has been an
481 // OBSOLETE    error.  */
482 // OBSOLETE static volatile int mem_err = 0;
483 // OBSOLETE 
484 // OBSOLETE /* Convert the memory pointed to by mem into hex, placing result in buf.
485 // OBSOLETE  * Return a pointer to the last char put in buf (null), in case of mem fault,
486 // OBSOLETE  * return 0.
487 // OBSOLETE  * If MAY_FAULT is non-zero, then we will handle memory faults by returning
488 // OBSOLETE  * a 0, else treat a fault like any other fault in the stub.
489 // OBSOLETE  */
490 // OBSOLETE 
491 // OBSOLETE static unsigned char *
492 // OBSOLETE mem2hex (unsigned char *mem, unsigned char *buf, int count, int may_fault)
493 // OBSOLETE {
494 // OBSOLETE   unsigned char ch;
495 // OBSOLETE 
496 // OBSOLETE   set_mem_fault_trap(may_fault);
497 // OBSOLETE 
498 // OBSOLETE   while (count-- > 0)
499 // OBSOLETE     {
500 // OBSOLETE       ch = *mem++;
501 // OBSOLETE       if (mem_err)
502 // OBSOLETE     return 0;
503 // OBSOLETE       *buf++ = hexchars[ch >> 4];
504 // OBSOLETE       *buf++ = hexchars[ch & 0xf];
505 // OBSOLETE     }
506 // OBSOLETE 
507 // OBSOLETE   *buf = 0;
508 // OBSOLETE 
509 // OBSOLETE   set_mem_fault_trap(0);
510 // OBSOLETE 
511 // OBSOLETE   return buf;
512 // OBSOLETE }
513 // OBSOLETE 
514 // OBSOLETE /* convert the hex array pointed to by buf into binary to be placed in mem
515 // OBSOLETE  * return a pointer to the character AFTER the last byte written */
516 // OBSOLETE 
517 // OBSOLETE static char *
518 // OBSOLETE hex2mem (unsigned char *buf, unsigned char *mem, int count, int may_fault)
519 // OBSOLETE {
520 // OBSOLETE   int i;
521 // OBSOLETE   unsigned char ch;
522 // OBSOLETE 
523 // OBSOLETE   set_mem_fault_trap(may_fault);
524 // OBSOLETE 
525 // OBSOLETE   for (i=0; i<count; i++)
526 // OBSOLETE     {
527 // OBSOLETE       ch = hex(*buf++) << 4;
528 // OBSOLETE       ch |= hex(*buf++);
529 // OBSOLETE       *mem++ = ch;
530 // OBSOLETE       if (mem_err)
531 // OBSOLETE     return 0;
532 // OBSOLETE     }
533 // OBSOLETE 
534 // OBSOLETE   set_mem_fault_trap(0);
535 // OBSOLETE 
536 // OBSOLETE   return mem;
537 // OBSOLETE }
538 // OBSOLETE 
539 // OBSOLETE /* This table contains the mapping between SPARC hardware trap types, and
540 // OBSOLETE    signals, which are primarily what GDB understands.  It also indicates
541 // OBSOLETE    which hardware traps we need to commandeer when initializing the stub. */
542 // OBSOLETE 
543 // OBSOLETE static struct hard_trap_info
544 // OBSOLETE {
545 // OBSOLETE   unsigned char tt;         /* Trap type code for SPARClite */
546 // OBSOLETE   unsigned char signo;              /* Signal that we map this trap into */
547 // OBSOLETE } hard_trap_info[] = {
548 // OBSOLETE   {0x01, SIGSEGV},          /* instruction access error */
549 // OBSOLETE   {0x02, SIGILL},           /* privileged instruction */
550 // OBSOLETE   {0x03, SIGILL},           /* illegal instruction */
551 // OBSOLETE   {0x04, SIGEMT},           /* fp disabled */
552 // OBSOLETE   {0x07, SIGBUS},           /* mem address not aligned */
553 // OBSOLETE   {0x09, SIGSEGV},          /* data access exception */
554 // OBSOLETE   {0x0a, SIGEMT},           /* tag overflow */
555 // OBSOLETE   {0x20, SIGBUS},           /* r register access error */
556 // OBSOLETE   {0x21, SIGBUS},           /* instruction access error */
557 // OBSOLETE   {0x24, SIGEMT},           /* cp disabled */
558 // OBSOLETE   {0x29, SIGBUS},           /* data access error */
559 // OBSOLETE   {0x2a, SIGFPE},           /* divide by zero */
560 // OBSOLETE   {0x2b, SIGBUS},           /* data store error */
561 // OBSOLETE   {0x80+1, SIGTRAP},                /* ta 1 - normal breakpoint instruction */
562 // OBSOLETE   {0xff, SIGTRAP},          /* hardware breakpoint */
563 // OBSOLETE   {0, 0}                    /* Must be last */
564 // OBSOLETE };
565 // OBSOLETE 
566 // OBSOLETE /* Set up exception handlers for tracing and breakpoints */
567 // OBSOLETE 
568 // OBSOLETE void
569 // OBSOLETE set_debug_traps (void)
570 // OBSOLETE {
571 // OBSOLETE   struct hard_trap_info *ht;
572 // OBSOLETE 
573 // OBSOLETE /* Only setup fp traps if the FP is disabled.  */
574 // OBSOLETE 
575 // OBSOLETE   for (ht = hard_trap_info;
576 // OBSOLETE        ht->tt != 0 && ht->signo != 0;
577 // OBSOLETE        ht++)
578 // OBSOLETE     if (ht->tt != 4 || ! (read_psr () & 0x1000))
579 // OBSOLETE       exceptionHandler(ht->tt, trap_low);
580 // OBSOLETE 
581 // OBSOLETE   initialized = 1;
582 // OBSOLETE }
583 // OBSOLETE 
584 // OBSOLETE asm ("
585 // OBSOLETE ! Trap handler for memory errors.  This just sets mem_err to be non-zero.  It
586 // OBSOLETE ! assumes that %l1 is non-zero.  This should be safe, as it is doubtful that
587 // OBSOLETE ! 0 would ever contain code that could mem fault.  This routine will skip
588 // OBSOLETE ! past the faulting instruction after setting mem_err.
589 // OBSOLETE 
590 // OBSOLETE     .text
591 // OBSOLETE     .align 4
592 // OBSOLETE 
593 // OBSOLETE _fltr_set_mem_err:
594 // OBSOLETE     sethi %hi(_mem_err), %l0
595 // OBSOLETE     st %l1, [%l0 + %lo(_mem_err)]
596 // OBSOLETE     jmpl %l2, %g0
597 // OBSOLETE     rett %l2+4
598 // OBSOLETE ");
599 // OBSOLETE 
600 // OBSOLETE static void
601 // OBSOLETE set_mem_fault_trap (int enable)
602 // OBSOLETE {
603 // OBSOLETE   extern void fltr_set_mem_err();
604 // OBSOLETE   mem_err = 0;
605 // OBSOLETE 
606 // OBSOLETE   if (enable)
607 // OBSOLETE     exceptionHandler(9, fltr_set_mem_err);
608 // OBSOLETE   else
609 // OBSOLETE     exceptionHandler(9, trap_low);
610 // OBSOLETE }
611 // OBSOLETE 
612 // OBSOLETE asm ("
613 // OBSOLETE     .text
614 // OBSOLETE     .align 4
615 // OBSOLETE 
616 // OBSOLETE _dummy_hw_breakpoint:
617 // OBSOLETE     jmpl %l2, %g0
618 // OBSOLETE     rett %l2+4
619 // OBSOLETE     nop
620 // OBSOLETE     nop
621 // OBSOLETE ");
622 // OBSOLETE 
623 // OBSOLETE static void
624 // OBSOLETE get_in_break_mode (void)
625 // OBSOLETE {
626 // OBSOLETE   extern void dummy_hw_breakpoint();
627 // OBSOLETE 
628 // OBSOLETE   exceptionHandler (255, dummy_hw_breakpoint);
629 // OBSOLETE 
630 // OBSOLETE   asm ("ta 255");
631 // OBSOLETE 
632 // OBSOLETE   exceptionHandler (255, trap_low);
633 // OBSOLETE }
634 // OBSOLETE 
635 // OBSOLETE /* Convert the SPARC hardware trap type code to a unix signal number. */
636 // OBSOLETE 
637 // OBSOLETE static int
638 // OBSOLETE computeSignal (int tt)
639 // OBSOLETE {
640 // OBSOLETE   struct hard_trap_info *ht;
641 // OBSOLETE 
642 // OBSOLETE   for (ht = hard_trap_info; ht->tt && ht->signo; ht++)
643 // OBSOLETE     if (ht->tt == tt)
644 // OBSOLETE       return ht->signo;
645 // OBSOLETE 
646 // OBSOLETE   return SIGHUP;            /* default for things we don't know about */
647 // OBSOLETE }
648 // OBSOLETE 
649 // OBSOLETE /*
650 // OBSOLETE  * While we find nice hex chars, build an int.
651 // OBSOLETE  * Return number of chars processed.
652 // OBSOLETE  */
653 // OBSOLETE 
654 // OBSOLETE static int
655 // OBSOLETE hexToInt(char **ptr, int *intValue)
656 // OBSOLETE {
657 // OBSOLETE   int numChars = 0;
658 // OBSOLETE   int hexValue;
659 // OBSOLETE 
660 // OBSOLETE   *intValue = 0;
661 // OBSOLETE 
662 // OBSOLETE   while (**ptr)
663 // OBSOLETE     {
664 // OBSOLETE       hexValue = hex(**ptr);
665 // OBSOLETE       if (hexValue < 0)
666 // OBSOLETE     break;
667 // OBSOLETE 
668 // OBSOLETE       *intValue = (*intValue << 4) | hexValue;
669 // OBSOLETE       numChars ++;
670 // OBSOLETE 
671 // OBSOLETE       (*ptr)++;
672 // OBSOLETE     }
673 // OBSOLETE 
674 // OBSOLETE   return (numChars);
675 // OBSOLETE }
676 // OBSOLETE 
677 // OBSOLETE /*
678 // OBSOLETE  * This function does all command procesing for interfacing to gdb.  It
679 // OBSOLETE  * returns 1 if you should skip the instruction at the trap address, 0
680 // OBSOLETE  * otherwise.
681 // OBSOLETE  */
682 // OBSOLETE 
683 // OBSOLETE static void
684 // OBSOLETE handle_exception (unsigned long *registers)
685 // OBSOLETE {
686 // OBSOLETE   int tt;                   /* Trap type */
687 // OBSOLETE   int sigval;
688 // OBSOLETE   int addr;
689 // OBSOLETE   int length;
690 // OBSOLETE   char *ptr;
691 // OBSOLETE   unsigned long *sp;
692 // OBSOLETE   unsigned long dsr;
693 // OBSOLETE 
694 // OBSOLETE /* First, we must force all of the windows to be spilled out */
695 // OBSOLETE 
696 // OBSOLETE   asm("     save %sp, -64, %sp
697 // OBSOLETE     save %sp, -64, %sp
698 // OBSOLETE     save %sp, -64, %sp
699 // OBSOLETE     save %sp, -64, %sp
700 // OBSOLETE     save %sp, -64, %sp
701 // OBSOLETE     save %sp, -64, %sp
702 // OBSOLETE     save %sp, -64, %sp
703 // OBSOLETE     save %sp, -64, %sp
704 // OBSOLETE     restore
705 // OBSOLETE     restore
706 // OBSOLETE     restore
707 // OBSOLETE     restore
708 // OBSOLETE     restore
709 // OBSOLETE     restore
710 // OBSOLETE     restore
711 // OBSOLETE     restore
712 // OBSOLETE ");
713 // OBSOLETE 
714 // OBSOLETE   get_in_break_mode ();             /* Enable DSU register writes */
715 // OBSOLETE 
716 // OBSOLETE   registers[DIA1] = read_asi (1, 0xff00);
717 // OBSOLETE   registers[DIA2] = read_asi (1, 0xff04);
718 // OBSOLETE   registers[DDA1] = read_asi (1, 0xff08);
719 // OBSOLETE   registers[DDA2] = read_asi (1, 0xff0c);
720 // OBSOLETE   registers[DDV1] = read_asi (1, 0xff10);
721 // OBSOLETE   registers[DDV2] = read_asi (1, 0xff14);
722 // OBSOLETE   registers[DCR] = read_asi (1, 0xff18);
723 // OBSOLETE   registers[DSR] = read_asi (1, 0xff1c);
724 // OBSOLETE 
725 // OBSOLETE   if (registers[PC] == (unsigned long)breakinst)
726 // OBSOLETE     {
727 // OBSOLETE       registers[PC] = registers[NPC];
728 // OBSOLETE       registers[NPC] += 4;
729 // OBSOLETE     }
730 // OBSOLETE   sp = (unsigned long *)registers[SP];
731 // OBSOLETE 
732 // OBSOLETE   dsr = (unsigned long)registers[DSR];
733 // OBSOLETE   if (dsr & 0x3c)
734 // OBSOLETE     tt = 255;
735 // OBSOLETE   else
736 // OBSOLETE     tt = (registers[TBR] >> 4) & 0xff;
737 // OBSOLETE 
738 // OBSOLETE   /* reply to host that an exception has occurred */
739 // OBSOLETE   sigval = computeSignal(tt);
740 // OBSOLETE   ptr = remcomOutBuffer;
741 // OBSOLETE 
742 // OBSOLETE   *ptr++ = 'T';
743 // OBSOLETE   *ptr++ = hexchars[sigval >> 4];
744 // OBSOLETE   *ptr++ = hexchars[sigval & 0xf];
745 // OBSOLETE 
746 // OBSOLETE   *ptr++ = hexchars[PC >> 4];
747 // OBSOLETE   *ptr++ = hexchars[PC & 0xf];
748 // OBSOLETE   *ptr++ = ':';
749 // OBSOLETE   ptr = mem2hex((char *)&registers[PC], ptr, 4, 0);
750 // OBSOLETE   *ptr++ = ';';
751 // OBSOLETE 
752 // OBSOLETE   *ptr++ = hexchars[FP >> 4];
753 // OBSOLETE   *ptr++ = hexchars[FP & 0xf];
754 // OBSOLETE   *ptr++ = ':';
755 // OBSOLETE   ptr = mem2hex(sp + 8 + 6, ptr, 4, 0); /* FP */
756 // OBSOLETE   *ptr++ = ';';
757 // OBSOLETE 
758 // OBSOLETE   *ptr++ = hexchars[SP >> 4];
759 // OBSOLETE   *ptr++ = hexchars[SP & 0xf];
760 // OBSOLETE   *ptr++ = ':';
761 // OBSOLETE   ptr = mem2hex((char *)&sp, ptr, 4, 0);
762 // OBSOLETE   *ptr++ = ';';
763 // OBSOLETE 
764 // OBSOLETE   *ptr++ = hexchars[NPC >> 4];
765 // OBSOLETE   *ptr++ = hexchars[NPC & 0xf];
766 // OBSOLETE   *ptr++ = ':';
767 // OBSOLETE   ptr = mem2hex((char *)&registers[NPC], ptr, 4, 0);
768 // OBSOLETE   *ptr++ = ';';
769 // OBSOLETE 
770 // OBSOLETE   *ptr++ = hexchars[O7 >> 4];
771 // OBSOLETE   *ptr++ = hexchars[O7 & 0xf];
772 // OBSOLETE   *ptr++ = ':';
773 // OBSOLETE   ptr = mem2hex((char *)&registers[O7], ptr, 4, 0);
774 // OBSOLETE   *ptr++ = ';';
775 // OBSOLETE 
776 // OBSOLETE   *ptr++ = 0;
777 // OBSOLETE 
778 // OBSOLETE   putpacket(remcomOutBuffer);
779 // OBSOLETE 
780 // OBSOLETE   while (1)
781 // OBSOLETE     {
782 // OBSOLETE       remcomOutBuffer[0] = 0;
783 // OBSOLETE 
784 // OBSOLETE       ptr = getpacket();
785 // OBSOLETE       switch (*ptr++)
786 // OBSOLETE     {
787 // OBSOLETE     case '?':
788 // OBSOLETE       remcomOutBuffer[0] = 'S';
789 // OBSOLETE       remcomOutBuffer[1] = hexchars[sigval >> 4];
790 // OBSOLETE       remcomOutBuffer[2] = hexchars[sigval & 0xf];
791 // OBSOLETE       remcomOutBuffer[3] = 0;
792 // OBSOLETE       break;
793 // OBSOLETE 
794 // OBSOLETE     case 'd':
795 // OBSOLETE                             /* toggle debug flag */
796 // OBSOLETE       break;
797 // OBSOLETE 
798 // OBSOLETE     case 'g':               /* return the value of the CPU registers */
799 // OBSOLETE       memcpy (&registers[L0], sp, 16 * 4); /* Copy L & I regs from stack */
800 // OBSOLETE       mem2hex ((char *)registers, remcomOutBuffer, NUMREGBYTES, 0);
801 // OBSOLETE       break;
802 // OBSOLETE 
803 // OBSOLETE     case 'G':               /* Set the value of all registers */
804 // OBSOLETE     case 'P':               /* Set the value of one register */
805 // OBSOLETE       {
806 // OBSOLETE         unsigned long *newsp, psr;
807 // OBSOLETE 
808 // OBSOLETE         psr = registers[PSR];
809 // OBSOLETE 
810 // OBSOLETE         if (ptr[-1] == 'P')
811 // OBSOLETE           {
812 // OBSOLETE             int regno;
813 // OBSOLETE 
814 // OBSOLETE             if (hexToInt (&ptr, &regno)
815 // OBSOLETE                 && *ptr++ == '=')
816 // OBSOLETE               if (regno >= L0 && regno <= I7)
817 // OBSOLETE                 hex2mem (ptr, sp + regno - L0, 4, 0);
818 // OBSOLETE               else
819 // OBSOLETE                 hex2mem (ptr, (char *)&registers[regno], 4, 0);
820 // OBSOLETE             else
821 // OBSOLETE               {
822 // OBSOLETE                 strcpy (remcomOutBuffer, "E01");
823 // OBSOLETE                 break;
824 // OBSOLETE               }
825 // OBSOLETE           }
826 // OBSOLETE         else
827 // OBSOLETE           {
828 // OBSOLETE             hex2mem (ptr, (char *)registers, NUMREGBYTES, 0);
829 // OBSOLETE             memcpy (sp, &registers[L0], 16 * 4); /* Copy L & I regs to stack */
830 // OBSOLETE           }
831 // OBSOLETE 
832 // OBSOLETE         /* See if the stack pointer has moved.  If so, then copy the saved
833 // OBSOLETE            locals and ins to the new location.  This keeps the window
834 // OBSOLETE            overflow and underflow routines happy.  */
835 // OBSOLETE 
836 // OBSOLETE         newsp = (unsigned long *)registers[SP];
837 // OBSOLETE         if (sp != newsp)
838 // OBSOLETE           sp = memcpy(newsp, sp, 16 * 4);
839 // OBSOLETE 
840 // OBSOLETE         /* Don't allow CWP to be modified. */
841 // OBSOLETE 
842 // OBSOLETE         if (psr != registers[PSR])
843 // OBSOLETE           registers[PSR] = (psr & 0x1f) | (registers[PSR] & ~0x1f);
844 // OBSOLETE 
845 // OBSOLETE         strcpy(remcomOutBuffer,"OK");
846 // OBSOLETE       }
847 // OBSOLETE       break;
848 // OBSOLETE 
849 // OBSOLETE     case 'm':         /* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
850 // OBSOLETE       /* Try to read %x,%x.  */
851 // OBSOLETE 
852 // OBSOLETE       if (hexToInt(&ptr, &addr)
853 // OBSOLETE           && *ptr++ == ','
854 // OBSOLETE           && hexToInt(&ptr, &length))
855 // OBSOLETE         {
856 // OBSOLETE           if (mem2hex((char *)addr, remcomOutBuffer, length, 1))
857 // OBSOLETE             break;
858 // OBSOLETE 
859 // OBSOLETE           strcpy (remcomOutBuffer, "E03");
860 // OBSOLETE         }
861 // OBSOLETE       else
862 // OBSOLETE         strcpy(remcomOutBuffer,"E01");
863 // OBSOLETE       break;
864 // OBSOLETE 
865 // OBSOLETE     case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
866 // OBSOLETE       /* Try to read '%x,%x:'.  */
867 // OBSOLETE 
868 // OBSOLETE       if (hexToInt(&ptr, &addr)
869 // OBSOLETE           && *ptr++ == ','
870 // OBSOLETE           && hexToInt(&ptr, &length)
871 // OBSOLETE           && *ptr++ == ':')
872 // OBSOLETE         {
873 // OBSOLETE           if (hex2mem(ptr, (char *)addr, length, 1))
874 // OBSOLETE             strcpy(remcomOutBuffer, "OK");
875 // OBSOLETE           else
876 // OBSOLETE             strcpy(remcomOutBuffer, "E03");
877 // OBSOLETE         }
878 // OBSOLETE       else
879 // OBSOLETE         strcpy(remcomOutBuffer, "E02");
880 // OBSOLETE       break;
881 // OBSOLETE 
882 // OBSOLETE     case 'c':    /* cAA..AA    Continue at address AA..AA(optional) */
883 // OBSOLETE       /* try to read optional parameter, pc unchanged if no parm */
884 // OBSOLETE       if (hexToInt(&ptr, &addr))
885 // OBSOLETE         {
886 // OBSOLETE           registers[PC] = addr;
887 // OBSOLETE           registers[NPC] = addr + 4;
888 // OBSOLETE         }
889 // OBSOLETE 
890 // OBSOLETE /* Need to flush the instruction cache here, as we may have deposited a
891 // OBSOLETE    breakpoint, and the icache probably has no way of knowing that a data ref to
892 // OBSOLETE    some location may have changed something that is in the instruction cache.
893 // OBSOLETE  */
894 // OBSOLETE 
895 // OBSOLETE       flush_i_cache ();
896 // OBSOLETE 
897 // OBSOLETE       if (!(registers[DSR] & 0x1) /* DSU enabled? */
898 // OBSOLETE           && !(registers[DCR] & 0x200)) /* Are we in break state? */
899 // OBSOLETE         {                   /* Yes, set the DSU regs */
900 // OBSOLETE           write_asi (1, 0xff00, registers[DIA1]);
901 // OBSOLETE           write_asi (1, 0xff04, registers[DIA2]);
902 // OBSOLETE           write_asi (1, 0xff08, registers[DDA1]);
903 // OBSOLETE           write_asi (1, 0xff0c, registers[DDA2]);
904 // OBSOLETE           write_asi (1, 0xff10, registers[DDV1]);
905 // OBSOLETE           write_asi (1, 0xff14, registers[DDV2]);
906 // OBSOLETE           write_asi (1, 0xff1c, registers[DSR]);
907 // OBSOLETE           write_asi (1, 0xff18, registers[DCR] | 0x200); /* Clear break */
908 // OBSOLETE         }
909 // OBSOLETE 
910 // OBSOLETE       return;
911 // OBSOLETE 
912 // OBSOLETE       /* kill the program */
913 // OBSOLETE     case 'k' :              /* do nothing */
914 // OBSOLETE       break;
915 // OBSOLETE #if 0
916 // OBSOLETE     case 't':               /* Test feature */
917 // OBSOLETE       asm (" std %f30,[%sp]");
918 // OBSOLETE       break;
919 // OBSOLETE #endif
920 // OBSOLETE     case 'r':               /* Reset */
921 // OBSOLETE       asm ("call 0
922 // OBSOLETE             nop ");
923 // OBSOLETE       break;
924 // OBSOLETE     }                       /* switch */
925 // OBSOLETE 
926 // OBSOLETE       /* reply to the request */
927 // OBSOLETE       putpacket(remcomOutBuffer);
928 // OBSOLETE     }
929 // OBSOLETE }
930 // OBSOLETE 
931 // OBSOLETE /* This function will generate a breakpoint exception.  It is used at the
932 // OBSOLETE    beginning of a program to sync up with a debugger and can be used
933 // OBSOLETE    otherwise as a quick means to stop program execution and "break" into
934 // OBSOLETE    the debugger. */
935 // OBSOLETE 
936 // OBSOLETE void
937 // OBSOLETE breakpoint (void)
938 // OBSOLETE {
939 // OBSOLETE   if (!initialized)
940 // OBSOLETE     return;
941 // OBSOLETE 
942 // OBSOLETE   asm("     .globl _breakinst
943 // OBSOLETE 
944 // OBSOLETE     _breakinst: ta 1
945 // OBSOLETE       ");
946 // OBSOLETE }
This page took 0.076861 seconds and 4 git commands to generate.