annotate packages/hal/common/current/src/generic-stub.c @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 /****************************************************************************
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3 THIS SOFTWARE IS NOT COPYRIGHTED
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 HP offers the following for use in the public domain. HP makes no
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 warranty with regard to the software or it's performance and the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 user accepts the software "AS IS" with all faults.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
11 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
12
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
13 ****************************************************************************/
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
14
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
15 /****************************************************************************
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
16 * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
17 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
18 * Module name: remcom.c $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
19 * Revision: 1.34 $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
20 * Date: 91/03/09 12:29:49 $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 * Contributor: Lake Stevens Instrument Division$
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
23 * Description: low level support for gdb debugger. $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
24 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 * Considerations: only works on target hardware $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
26 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
27 * Written by: Glenn Engel $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
28 * ModuleState: Experimental $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
29 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 * NOTES: See Below $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 * Modified for SPARC by Stu Grossman, Cygnus Support.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 * Modified for generic CygMON stub support by Bob Manson, Cygnus Solutions.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
34 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
35 * To enable debugger support, two things need to happen. One, a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
36 * call to set_debug_traps() is necessary in order to allow any breakpoints
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
37 * or error conditions to be properly intercepted and reported to gdb.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
38 * Two, a breakpoint needs to be generated to begin communication. This
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 * is most easily accomplished by a call to breakpoint(). Breakpoint()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 * simulates a breakpoint by executing a trap #1.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 *************
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 * The following gdb commands are supported:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 * command function Return value
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 * g return the value of the CPU registers hex data or ENN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 * G set the value of the CPU registers OK or ENN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 * c Resume at current address SNN ( signal NN)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 * cAA..AA Continue at address AA..AA SNN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 * s Step one instruction SNN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 * sAA..AA Step one instruction from AA..AA SNN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 * k kill
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 * ? What was the last sigval ? SNN (signal NN)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 * bBB..BB Set baud rate to BB..BB OK or BNN, then sets
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 * baud rate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 * All commands and responses are sent with a packet which includes a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 * checksum. A packet consists of
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 * $<packet info>#<checksum>.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 * where
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 * <packet info> :: <characters representing the command or response>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 * When a packet is received, it is first acknowledged with either '+' or '-'.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 * '+' indicates a successful transfer. '-' indicates a failed transfer.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 * Example:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 * Host: Reply:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 * $m0,10#2a +$00010203040506070809101112131415#42
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 ****************************************************************************/
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 #include <pkgconf/hal.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 #include <cyg/hal/hal_stub.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 #define SIGHUP 1 /* hangup */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 #define SIGINT 2 /* interrupt */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 #define SIGQUIT 3 /* quit */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 #define SIGILL 4 /* illegal instruction (not reset when caught) */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 #define SIGTRAP 5 /* trace trap (not reset when caught) */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 #define SIGIOT 6 /* IOT instruction */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 #define SIGABRT 6 /* used by abort, replace SIGIOT in the future */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 #define SIGEMT 7 /* EMT instruction */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 #define SIGFPE 8 /* floating point exception */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 #define SIGKILL 9 /* kill (cannot be caught or ignored) */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 #define SIGBUS 10 /* bus error */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 #define SIGSEGV 11 /* segmentation violation */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 #define SIGSYS 12 /* bad argument to system call */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 #define SIGPIPE 13 /* write on a pipe with no one to read it */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 #define SIGALRM 14 /* alarm clock */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 #define SIGTERM 15 /* software termination signal from kill */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 #include <cyg/hal/hal_arch.h> // HAL header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 #ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 #define DEBUG_THREADS 1 // FIXME: put in header file?
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 #define DEBUG_THREADS 0 // FIXME: put in header file?
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 #define uint32 cyg_uint32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 #include "thread-pkts.h"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 /************************************************************************/
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 /* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 /* at least NUMREGBYTES*2 are needed for register packets */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 #define BUFMAX 2048
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 static int process_exception (int sigval);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 static void do_nothing (void); /* and do it gracefully */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 static int syscall_do_nothing (int);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 static void kill_program (int sigval);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 static void process_query (char *pkt);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 static void process_set (char *pkt);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 volatile __PFI __process_exception_vec = process_exception;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 volatile __PFV __process_exit_vec = do_nothing;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 volatile __PFI __process_syscall_vec = syscall_do_nothing;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 volatile __PFI __process_signal_vec = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 volatile __PFI __interruptible_control = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 static const char hexchars[] = "0123456789abcdef";
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 extern target_register_t registers[]; /* The current saved registers */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 extern target_register_t * _registers ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 extern HAL_SavedRegisters *_hal_registers;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 int __process_target_query(char * pkt, char * out, int maxOut)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 { return 0 ; }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 int __process_target_set(char * pkt, char * out, int maxout)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 { return 0 ; }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 int __process_target_packet(char * pkt, char * out, int maxout)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 { return 0 ; }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 /* Return the value corresponding to register REG of the active thread. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 static target_register_t thread_get_register (regnames_t reg)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 return _registers[reg];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 /* Store VALUE in the register corresponding to WHICH of the active thread. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 static void thread_put_register (regnames_t which, target_register_t value)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 _registers[which] = value;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166 char
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 __tohex (int c)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 return hexchars [c & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172 target_register_t *__our_registers;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 #ifndef NUMREGS_GDB
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 #define NUMREGS_GDB NUMREGS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 static char *strcpy( char *s, const char *t)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180 char *r = s;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 while( *t ) *s++ = *t++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 return r;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 static int strlen( const char *s )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 int r = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 while( *s++ ) r++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 return r;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 // Use this function to disable serial interrupts whenever reply
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 // characters are expected from GDB. The reason we want to control
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 // whether the target can be interrupted or not is simply that GDB on
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 // the host will be sending acknowledge characters/commands while the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 // stub is running - if serial interrupts were still active, the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 // characters would never reach the (polling) getDebugChar.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 interruptible (int state)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 static int current_state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 if (__interruptible_control) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 if (state) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207 current_state--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 if (0 >= current_state) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 current_state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 __interruptible_control (1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212 } else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 current_state++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 if (1 == current_state)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 __interruptible_control (0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221 /* One pushback character. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222 int ungot_char = -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 readDebugChar (void)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 if (ungot_char > 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 int result = ungot_char;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 ungot_char = -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 return result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234 return getDebugChar ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
236
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
237 struct gdb_packet
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 /* The checksum calculated so far. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240 int checksum;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241 /* The checksum we've received from the remote side. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
242 int xmitcsum;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
243 /* Contents of the accumulated packet. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244 char *contents;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245 /* Number of characters received. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246 int length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248 * state is the current state:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 * 0 = looking for start of packet
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250 * 1 = got start of packet, looking for # terminator
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 * 2 = looking for first byte of checksum
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252 * 3 = looking for second byte of checksum (indicating end of packet)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254 char state;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
256
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 /* Convert ch from a hex digit to an int. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 stubhex(unsigned char ch)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262 if (ch >= 'a' && ch <= 'f')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 return ch-'a'+10;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 if (ch >= '0' && ch <= '9')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 return ch-'0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 if (ch >= 'A' && ch <= 'F')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 return ch-'A'+10;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272 getpacket(char *buffer)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 struct gdb_packet packet;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
276 packet.state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 packet.contents = buffer;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278 while (__add_char_to_packet (readDebugChar () & 0x7f, &packet) != 1)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280 /* Empty */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
285 __add_char_to_packet (int ch, struct gdb_packet *packet)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287 if (packet->state == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
288 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289 if (ch == '$')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291 packet->state = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 packet->length = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 packet->checksum = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 packet->xmitcsum = -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 if (packet->state == 1)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
300 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301 if (ch == '#')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303 packet->contents[packet->length] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 packet->state = 2;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308 if (packet->length == BUFMAX) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309 packet->state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 packet->checksum += ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313 packet->contents[packet->length++] = ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 if (packet->state == 2)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320 packet->xmitcsum = stubhex (ch) << 4;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321 packet->state = 3;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
324
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
325 if (packet->state == 3)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
327 packet->xmitcsum |= stubhex(ch);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328 if ((packet->checksum & 255) != packet->xmitcsum)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 putDebugChar ('-'); /* failed checksum */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
331 packet->state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
332 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 putDebugChar('+'); /* successful transfer */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 /* if a sequence char is present, reply the sequence ID */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338 if (packet->contents[2] == ':')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
340 int count = packet->length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341 int i;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342 putDebugChar (packet->contents[0]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343 putDebugChar (packet->contents[1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
344 /* remove sequence chars from buffer */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
345 for (i=3; i <= count; i++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346 packet->contents[i-3] = packet->contents[i];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
348 return 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
349 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
350 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
351 /* We should never get here. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
352 packet->state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
353 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
356 /* send the packet in buffer. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
359 putpacket(unsigned char *buffer)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
360 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
361 unsigned char checksum;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
362 int count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 unsigned char ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365 interruptible (0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367 /* $<packet info>#<checksum>. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368 do
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370 putDebugChar ('$');
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371 checksum = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372 count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374 while ((ch = buffer[count]))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 putDebugChar (ch);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377 checksum += ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378 count += 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381 putDebugChar ('#');
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382 putDebugChar (hexchars[(checksum >> 4) & 0xf]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383 putDebugChar (hexchars[checksum & 0xf]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
386 while ((readDebugChar () & 0x7f) != '+');
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388 interruptible (1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391 static char remcomInBuffer[BUFMAX];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392 static char remcomOutBuffer[BUFMAX];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394 /* Indicate to caller of mem2hex or hex2mem that there has been an
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395 error. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
396 volatile int __mem_fault = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
399 __copy_mem_safe (unsigned char *dst, unsigned char *src, int count)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401 int res;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403 __set_mem_fault_trap (1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404 while (count--)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 *(dst++) = *(src++);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 res = __mem_fault;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
407 __set_mem_fault_trap (0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 return res ? 1 : 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 __read_mem_safe (unsigned char *dst, target_register_t src, int count)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 return __copy_mem_safe (dst, (unsigned char*) src, count);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
418 __write_mem_safe (unsigned char *src, target_register_t dst, int count)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420 return __copy_mem_safe ((unsigned char*) dst, src, count);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423 /* Convert the memory pointed to by mem into hex, placing result in buf.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424 * Return a pointer to the last char put in buf (null), in case of mem fault,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425 * return 0.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 * If MAY_FAULT is non-zero, then we will handle memory faults by returning
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427 * a 0, else treat a fault like any other fault in the stub.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 unsigned char *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431 __mem2hex(mem, buf, count, may_fault)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 unsigned char *mem;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433 unsigned char *buf;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434 int count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435 int may_fault;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437 unsigned char ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 __set_mem_fault_trap(may_fault);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441 while (count-- > 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 ch = *mem++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444 if (__mem_fault)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 *buf++ = hexchars[(ch >> 4) & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447 *buf++ = hexchars[ch & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
448 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
449
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450 *buf = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
451
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 __set_mem_fault_trap(0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
454 return buf;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
456
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
457 /* convert the hex array pointed to by buf into binary to be placed in mem
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
458 * return a pointer to the character AFTER the last byte written */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460 static char *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461 hex2mem(unsigned char *buf, unsigned char *mem, int count, int may_fault)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463 int i;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464 unsigned char ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 __set_mem_fault_trap (may_fault);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
468 for (i=0; i<count; i++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
469 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
470 ch = stubhex(*buf++) << 4;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
471 ch |= stubhex(*buf++);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
472 *mem++ = ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
473 if (__mem_fault)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
475 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
476
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
477 __set_mem_fault_trap(0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
478
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
479 return mem;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
481
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 * While we find nice hex chars, build an int.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484 * Return number of chars processed.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
486
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
487 static unsigned int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488 __hexToInt(char **ptr, target_register_t *intValue)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
490 int numChars = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491 int hexValue;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
493 *intValue = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
494
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
495 while (**ptr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
496 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
497 hexValue = stubhex(**ptr);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
498 if (hexValue < 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
499 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
500
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
501 *intValue = (*intValue << 4) | hexValue;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
502 numChars ++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
503
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
504 (*ptr)++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
505 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
506
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
507 return (numChars);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
508 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
509
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
510 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
511 * Complement of __hexToInt: take an int of size "numBits",
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
512 * convert it to a hex string. Return length of (unterminated) output.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
513 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
514
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
515 unsigned int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516 __intToHex (char *ptr, target_register_t intValue, int numBits)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
517 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
518 int numChars = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
519
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
520 if (intValue == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
521 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
522 *(ptr++) = '0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
523 *(ptr++) = '0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
524 return 2;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
525 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
526
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
527 numBits = (numBits + 7) / 8;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
528 while (numBits)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
529 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
530 int v = (intValue >> ((numBits - 1) * 8));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
531 if (v || (numBits == 1))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
532 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
533 v = v & 255;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
534 *(ptr++) = __tohex ((v / 16) & 15);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
535 *(ptr++) = __tohex (v & 15);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
536 numChars += 2;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
537 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
538 numBits--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
539 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
540
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
541 return (numChars);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
542 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
543
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
544 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
545 __handle_exception (void)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
546 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
547 void breakinst(void);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
548 int sigval;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
549
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
550 interruptible (0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
552 // Expand the HAL_SavedRegisters structure into the GDB register
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553 // array format.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
554 HAL_GET_GDB_REGISTERS (&registers[0], _hal_registers);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 _registers = &registers[0];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
557 /* reply to host that an exception has occurred */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 sigval = __computeSignal (__get_trap_number ());
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
560 if (__is_breakpoint_function ())
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
561 __skipinst ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563 #if 0 //def SIGSYSCALL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
564 if(sigval == SIGSYSCALL)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
565 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
566 int val;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567 /* Do the skipinst FIRST. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
568 __skipinst ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
569 val = __process_syscall_vec (__get_syscall_num ());
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570 if (val == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
571 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
572 else if (val < 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
573 sigval = -val;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
575
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
576 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
577
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578 while (__process_exception_vec (sigval));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
579
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
580
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
581 // Compact register array again.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582 HAL_SET_GDB_REGISTERS (_hal_registers, &registers[0]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
583
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
584 interruptible (1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
585 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
586
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
587 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
588 process_packet (char *packet)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
589 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
590 //diag_printf("pkt %s\n",packet);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
591 remcomOutBuffer[0] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
592
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
593 switch (packet[0])
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 case '?':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
597 int sigval = __computeSignal (__get_trap_number ());
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
598 remcomOutBuffer[0] = 'S';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
599 remcomOutBuffer[1] = hexchars[(sigval >> 4) & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600 remcomOutBuffer[2] = hexchars[sigval & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601 remcomOutBuffer[3] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
602 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
604
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605 case 'd':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606 /* toggle debug flag */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609 case 'q':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610 /* general query packet */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 process_query (&packet[1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
614 case 'Q':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
615 /* general set packet */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616 process_set (&packet[1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
618
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
619 case 'g': /* return the value of the CPU registers */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621 char *ptr = remcomOutBuffer;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622 int x;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
623
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
624 for (x = 0; x < NUMREGS_GDB; x++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
625 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
626 /* We need to compensate for the value offset within the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
627 register. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
628 target_register_t addr = thread_get_register (x);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
629 char *vptr = ((char *)&addr) + sizeof(addr) - REGSIZE(x);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
630
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
631 ptr = __mem2hex(vptr, ptr, REGSIZE(x), 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
632 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
633 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
634 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
635
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
636 case 'P':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
637 case 'G': /* set the value of the CPU registers - return OK */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
638 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
639 int x;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
640 int sr = 0, er = NUMREGS_GDB;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
641 char *ptr = &packet[1];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
642
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
643 if (packet[0] == 'P')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
644 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
645 target_register_t regno;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
646
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
647 if (__hexToInt (&ptr, &regno)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
648 && (*ptr++ == '='))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
649 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
650 sr = regno;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
651 er = regno + 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
652 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
653 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
654 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
655 strcpy (remcomOutBuffer, "P01");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
656 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
657 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
658 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
659
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
660 for (x = sr; x < er; x++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
661 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
662 target_register_t value = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664 char *vptr = ((char *)&value) + sizeof(value) - REGSIZE(x);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665 hex2mem(ptr, vptr, REGSIZE (x), 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 thread_put_register (x, value);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667 ptr += REGSIZE(x) * 2;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
669
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 strcpy (remcomOutBuffer, "OK");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674 case 'm': /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675 /* Try to read %x,%x. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677 target_register_t addr, length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
678 char *ptr = &packet[1];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
679
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
680 if (__hexToInt(&ptr, &addr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
681 && *ptr++ == ','
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
682 && __hexToInt(&ptr, &length))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
683 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
684 if (__mem2hex ((char *)addr, remcomOutBuffer, length, 1))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687 strcpy (remcomOutBuffer, "E03");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
690 strcpy(remcomOutBuffer,"E01");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
691 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
692 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
693
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
694 case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
695 /* Try to read '%x,%x:'. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
696 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
697 target_register_t addr, length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
698 char *ptr = &packet[1];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
699
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
700 if (__hexToInt(&ptr, &addr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
701 && *ptr++ == ','
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
702 && __hexToInt(&ptr, &length)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
703 && *ptr++ == ':')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
704 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
705 if (hex2mem(ptr, (char *)addr, length, 1))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
706 strcpy(remcomOutBuffer, "OK");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
707 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
708 strcpy(remcomOutBuffer, "E03");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
709 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
710 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
711 strcpy(remcomOutBuffer, "E02");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
712 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
713 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
715 case 'S':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
716 case 's': /* sAA..AA Step from address AA..AA(optional) */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717 case 'C':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
718 case 'c': /* cAA..AA Continue at address AA..AA(optional) */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
719 /* try to read optional parameter, pc unchanged if no parm */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
721 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
722 char *ptr = &packet[1];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
723 target_register_t addr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
724 target_register_t foo = 99999;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
725 target_register_t sigval;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
726
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
727 //diag_printf("stepping\n");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
728 sigval = foo;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
729 if (packet[0] == 'C' || packet[0] == 'S')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
730 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
731 __hexToInt (&ptr, &sigval);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
732 if (*ptr == ';')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
733 ptr++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
734 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
735
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
736 if (__hexToInt(&ptr, &addr))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
737 set_pc (addr);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
738
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
739 /* Need to flush the instruction cache here, as we may have deposited a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740 breakpoint, and the icache probably has no way of knowing that a data ref to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
741 some location may have changed something that is in the instruction cache.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
742 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
743
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
744 flush_i_cache ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
745
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
746 if (sigval != foo)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748 if (__process_signal_vec != NULL)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
750 if (! __process_signal_vec (sigval))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
751 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
752 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
753 sigval = SIGKILL; /* Always nuke the program */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
754 kill_program (sigval);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
755 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
756 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
758 /* Set machine state to force a single step. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
759 if (packet[0] == 's' || packet[0] == 'S')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
760 single_step ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
761
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
762 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
763 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
764
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
765 /* kill the program */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
766 case 'k' :
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
767 __process_exit_vec ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
768 return 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
769 #if 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
770 case 't': /* Test feature */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
771 __asm__ (" std %f30,[%sp]");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
772 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
773 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
774 case 'r': /* Reset */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
775 __reset ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
776 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
777 case 'H':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
778 STUB_PKT_CHANGETHREAD (packet+1, remcomOutBuffer, 300) ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
779 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
780 case 'T' :
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
781 STUB_PKT_THREAD_ALIVE (packet+1, remcomOutBuffer, 300) ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
782 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
783
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
784 case 'b': /* bBB... Set baud rate to BB... */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
785 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
786 target_register_t baudrate;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
787
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
788 char *ptr = &packet[1];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
789 if (!__hexToInt(&ptr, &baudrate))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
790 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
791 strcpy(remcomOutBuffer,"B01");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
792 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
793 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
794
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
795 putpacket ("OK"); /* Ack before changing speed */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
796 __set_baud_rate (baudrate);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
797 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
798 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
799 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
800
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
801 /* reply to the request */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
802 putpacket (remcomOutBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
803 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
804 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
805
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
806 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
807 send_t_packet (int sigval)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
808 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
809 __build_t_packet (sigval, remcomOutBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
810 putpacket(remcomOutBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
811 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
812
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
813 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
814 * This function does all command procesing for interfacing to gdb.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
815 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
816
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
817 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
818 process_exception (int sigval)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
819 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
820 int status;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
821
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
822 /* Nasty. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
823 if (ungot_char < 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
824 send_t_packet (sigval);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
825
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
826 /* Undo effect of previous single step. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
827 clear_single_step ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
828
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
829 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
830 getpacket (remcomInBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
831 status = process_packet (remcomInBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
832 } while (status == 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
833
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
834
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
835 /* Install breakpoints that may have been set to perform single stepping. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
836 install_breakpoints ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
837
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
838 if (status < 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
840 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
841 return 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
842 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
843
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
844 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
845 __send_exit_status (int status)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
846 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
847 remcomOutBuffer[0] = 'W';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
848 remcomOutBuffer[1] = hexchars[(status >> 4) & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
849 remcomOutBuffer[2] = hexchars[status & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
850 remcomOutBuffer[3] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
851 putpacket (remcomOutBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
852 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
853
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
854 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
855 __get_gdb_input (char *dest, int maxlen, int block)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
856 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
857 char buf[4];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
858 int len, i;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
859
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
860 buf[0] = 'I';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
861 buf[1] = '0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
862 buf[2] = block ? '0' : '1';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
863 buf[3] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
864 putpacket (buf);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
865 getpacket (remcomInBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866 if (remcomInBuffer[0] != 'I')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
867 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
868 len = stubhex (remcomInBuffer[1]) * 16 + stubhex (remcomInBuffer[2]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
869 for (i = 0; i < len; i++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
870 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
871 dest[i] = stubhex (remcomInBuffer[3 + i * 2]) * 16;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
872 dest[i] |= stubhex (remcomInBuffer[3 + i * 2 + 1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
873 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
874 dest[i] = '\0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
875 return len;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
876 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
877
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
878 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
879 __output_hex_value (target_register_t i)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
880 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
881 char buf[32], *ptr=buf+31;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
882 unsigned int x;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
883
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
884 *ptr = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
885 for (x = 0; x < (sizeof(i) * 2); x++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
886 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
887 *(--ptr) = hexchars[i & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
888 i = i >> 4;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
889 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
890 while (*ptr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
891 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
892 putDebugChar (*(ptr++));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
893 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
894 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
895
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
896 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
897 __output_gdb_string(const char *str, int string_len)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
898 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
899 static char buf[1024];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
900 int x;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
901 int len;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
902
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
903 if (string_len == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
904 string_len = strlen (str);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
905
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
906 len = string_len * 2 + 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
907
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
908 buf[0] = 'O';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
909 for (x = 0; x < string_len; x++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
910 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
911 char c = str[x];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
912 buf[x*2+1] = hexchars[(c >> 4) & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
913 buf[x*2+2] = hexchars[c % 16];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
914 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
915 buf[x*2+1] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
916 putpacket (buf);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
917 return string_len;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
918 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
919
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
920 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
921 do_nothing (void)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
922 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
923 /* mmmm */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
924 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
925
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
926 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
927 syscall_do_nothing (int junk)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
928 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
929 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
930 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
931
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
932 /* Start the stub running. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
933 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
934 __switch_to_stub ()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
935 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
936 __process_exception_vec = process_exception;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
937 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
938
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
939 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
940 ungetDebugChar (int c)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
941 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
942 ungot_char = c;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
943 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
944
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
945 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
946 kill_program (int sigval)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
947 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
948 remcomOutBuffer[0] = 'X';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
949 remcomOutBuffer[1] = hexchars[(sigval >> 4) & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
950 remcomOutBuffer[2] = hexchars[sigval & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
951 remcomOutBuffer[3] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
952 putpacket (remcomOutBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
953 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
954
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
955 /* Table used by the crc32 function to calcuate the checksum. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
956 static uint32 crc32_table[256];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
957 static int tableInit = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
958
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
959 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
960 Calculate a CRC-32 using LEN bytes of PTR. CRC is the initial CRC
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
961 value.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
962 PTR is assumed to be a pointer in the user program. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
963
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
964 static uint32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
965 crc32 (unsigned char *ptr, int len, uint32 crc)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
966 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
967 if (! tableInit)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
968 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
969 /* Initialize the CRC table and the decoding table. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
970 uint32 i, j;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
971 uint32 c;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
972
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
973 tableInit = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
974 for (i = 0; i < 256; i++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
975 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
976 for (c = i << 24, j = 8; j > 0; --j)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
977 c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
978 crc32_table[i] = c;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
979 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
980 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
981
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
982 __mem_fault = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
983 while (len--)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
984 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
985 unsigned char ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
986
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
987 __read_mem_safe (&ch, (target_register_t) ptr, 1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
988 if (__mem_fault)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
989 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
990 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
991 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
992 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ ch) & 255];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
993 ptr++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
994 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
995 return crc;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
996 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
997
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
998 /* Handle the 'q' request */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
999
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1000 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1001 process_query (char *pkt)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1002 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1003 remcomOutBuffer[0] = '\0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1004 if ('C' == pkt[0] &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1005 'R' == pkt[1] &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1006 'C' == pkt[2] &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1007 ':' == pkt[3])
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1008 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1009 target_register_t startmem;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1010 target_register_t length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1011 uint32 our_crc;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1012
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1013 pkt += 4;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1014 if (__hexToInt (&pkt, &startmem)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1015 && *(pkt++) == ','
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1016 && __hexToInt (&pkt, &length))
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1017 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1018 our_crc = crc32 ((unsigned char *) startmem, length, 0xffffffff);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1019 if (__mem_fault)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1020 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1021 strcpy (remcomOutBuffer, "E01");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1022 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1023 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1024 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1025 int numb = __intToHex (remcomOutBuffer + 1, our_crc, 32);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1026 remcomOutBuffer[0] = 'C';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1027 remcomOutBuffer[numb + 1] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1028 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1029 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1030 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1031 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1032 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1033 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1034 char ch ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1035 char * subpkt ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1036 ch = *pkt ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1037 subpkt = pkt + 1 ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1038 switch (ch)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1039 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1040 case 'L' : /* threadlistquery */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1041 STUB_PKT_GETTHREADLIST (subpkt, remcomOutBuffer, 300);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1042 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1043 case 'P' : /* Thread or process information request */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1044 STUB_PKT_GETTHREADINFO (subpkt, remcomOutBuffer, 300);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1045 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1046 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1047 __process_target_query (pkt, remcomOutBuffer, 300);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1048 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1049 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1050 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1051 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1052
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1053 /* Handle the 'Q' request */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1054
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1055 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1056 process_set (char *pkt)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1057 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1058 char ch ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1059 ch = *pkt ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1060
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1061 switch (ch)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1062 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1063 case 'p' : /* Set current process or thread */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1064 /* reserve the packet id even if support is not present */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1065 /* Dont strip the 'p' off the header, there are several variations of
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1066 this packet */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1067 STUB_PKT_CHANGETHREAD (pkt, remcomOutBuffer, 300) ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1068 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1069 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1070 __process_target_set (pkt, remcomOutBuffer, 300);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1071 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1072 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1073 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1074
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1075 #endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS