annotate packages/hal/common/current/src/generic-stub.c @ 28:18ee5a9c102e ecos-sw-1999-08-09

Merge from eCos master repository on 1999-08-09-17:04:48-BST
author jlarmour
date Mon, 09 Aug 1999 16:37:19 +0000
parents 443894e2e912
children 29bc183297e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1 #include "board.h"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
3 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
4
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
5 /* Eventually, this should default to ON */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
6 #if USE_GDBSTUB_PROTOTYPES
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
7 #include "stub-tservice.h"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
8 #include "generic-stub.h"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
9 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
10 // Function declarations (prevents compiler warnings)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
11 int stubhex (unsigned char ch);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
12 static void getpacket (char *buffer);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
13 static void unlock_thread_scheduler (void);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
14 static uint32 crc32 (unsigned char *ptr, int len, uint32 crc);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
15 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
16
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
17 #include "thread-pkts.h"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
18 /* Defines function macros if thread support is not selected in board.h */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
19
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
20
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 /****************************************************************************
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
23 THIS SOFTWARE IS NOT COPYRIGHTED
0
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 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
26 warranty with regard to the software or it's performance and the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
27 user accepts the software "AS IS" with all faults.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
28
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
29 HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 ****************************************************************************/
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 /****************************************************************************
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
36 * 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
37 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
38 * Module name: remcom.c $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 * Revision: 1.34 $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 * Date: 91/03/09 12:29:49 $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 * Contributor: Lake Stevens Instrument Division$
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 * Description: low level support for gdb debugger. $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 * Considerations: only works on target hardware $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 * Written by: Glenn Engel $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 * ModuleState: Experimental $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 * NOTES: See Below $
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 *
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
52 * Modified for SPARC by Stu Grossman, Cygnus Solutions.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 * Modified for generic CygMON stub support by Bob Manson, Cygnus Solutions.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 * To enable debugger support, two things need to happen. One, a
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
56 * call to set_debug_traps () is necessary in order to allow any breakpoints
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 * or error conditions to be properly intercepted and reported to gdb.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 * Two, a breakpoint needs to be generated to begin communication. This
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
59 * is most easily accomplished by a call to breakpoint (). Breakpoint ()
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 * simulates a breakpoint by executing a trap #1.
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 *************
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 * The following gdb commands are supported:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 * command function Return value
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 * g return the value of the CPU registers hex data or ENN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 * G set the value of the CPU registers OK or ENN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 * 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
72 * 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
73 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 * c Resume at current address SNN ( signal NN)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 * cAA..AA Continue at address AA..AA SNN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 * s Step one instruction SNN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 * sAA..AA Step one instruction from AA..AA SNN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 * k kill
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 * ? What was the last sigval ? SNN (signal NN)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 *
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
84 * bBB..BB Set baud rate to BB..BB OK or BNN, then sets
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
85 * baud rate
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 * All commands and responses are sent with a packet which includes a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 * checksum. A packet consists of
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 * $<packet info>#<checksum>.
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 * where
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 * <packet info> :: <characters representing the command or response>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 * When a packet is received, it is first acknowledged with either '+' or '-'.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 * '+' indicates a successful transfer. '-' indicates a failed transfer.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 * Example:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 * Host: Reply:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 * $m0,10#2a +$00010203040506070809101112131415#42
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 ****************************************************************************/
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
106 #ifndef __ECOS__
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
107 #include <string.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
108 #include <signal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
109 #endif // __ECOS__
0
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 /************************************************************************/
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 /* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 /* at least NUMREGBYTES*2 are needed for register packets */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 #define BUFMAX 2048
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
116 static int initialized = 0; /* !0 means we've been initialized */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
117
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 static int process_exception (int sigval);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 static void do_nothing (void); /* and do it gracefully */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 static int syscall_do_nothing (int);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
121
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
122 void __free_program_args (void);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 volatile __PFI __process_exception_vec = process_exception;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 volatile __PFV __process_exit_vec = do_nothing;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 volatile __PFI __process_syscall_vec = syscall_do_nothing;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 volatile __PFI __process_signal_vec = NULL;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
128 volatile __PFV __init_vec = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
129 volatile __PFV __cleanup_vec = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
130
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
131 static char *__add_program_arg (int argnum, uint32 arglen);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 static const char hexchars[] = "0123456789abcdef";
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
135 static void process_query (char *pkt);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
136 static void process_set (char *pkt);
0
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 char
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 __tohex (int c)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 return hexchars [c & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
144 #define __tohex(c) hexchars[(c) & 15]
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 #ifndef NUMREGS_GDB
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 #define NUMREGS_GDB NUMREGS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 /* One pushback character. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 int ungot_char = -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 readDebugChar (void)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 if (ungot_char > 0)
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 int result = ungot_char;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 ungot_char = -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 return result;
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 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 return getDebugChar ();
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 /* Convert ch from a hex digit to an int. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 int
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
169 stubhex (ch)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
170 unsigned char ch;
0
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 if (ch >= 'a' && ch <= 'f')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173 return ch-'a'+10;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 if (ch >= '0' && ch <= '9')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 return ch-'0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 if (ch >= 'A' && ch <= 'F')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 return ch-'A'+10;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 return -1;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 static void
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
182 getpacket (buffer)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
183 char *buffer;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 struct gdb_packet packet;
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 packet.state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 packet.contents = buffer;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
189 while (__add_char_to_packet (readDebugChar () & 0xff, &packet) != 1)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 /* Empty */
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 int
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
196 __add_char_to_packet (ch, packet)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
197 unsigned int ch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
198 struct gdb_packet *packet;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 if (packet->state == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 if (ch == '$')
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
203 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
204 packet->state = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
205 packet->length = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
206 packet->checksum = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
207 packet->xmitcsum = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
208 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 }
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 if (packet->state == 1)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 if (ch == '#')
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
215 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
216 packet->contents[packet->length] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
217 packet->state = 2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
218 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
220 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
221 if (packet->length == BUFMAX) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
222 packet->state = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
223 return -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
224 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
225 packet->checksum += ch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
226 packet->contents[packet->length++] = ch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
227 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 if (packet->state == 2)
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 packet->xmitcsum = stubhex (ch) << 4;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234 packet->state = 3;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235 return 0;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238 if (packet->state == 3)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
240 packet->xmitcsum |= stubhex (ch);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241 if ((packet->checksum & 255) != packet->xmitcsum)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
242 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
243 putDebugChar ('-'); /* failed checksum */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
244 packet->state = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
245 return -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
246 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247 else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
248 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
249 putDebugChar ('+'); /* successful transfer */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
250 /* if a sequence char is present, reply the sequence ID */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
251 if (packet->contents[2] == ':')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
252 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
253 uint32 count = packet->length;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
254 uint32 i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
255 putDebugChar (packet->contents[0]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
256 putDebugChar (packet->contents[1]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
257 /* remove sequence chars from buffer */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
258 for (i=3; i <= count; i++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
259 packet->contents[i-3] = packet->contents[i];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
260 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
261 return 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
262 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 /* We should never get here. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 packet->state = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269 /* send the packet in buffer. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
271 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
272 __putpacket (buffer)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
273 char *buffer;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 unsigned char checksum;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
276 uint32 count;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 unsigned char ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279 /* $<packet info>#<checksum>. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280 do
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 putDebugChar ('$');
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 checksum = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
285
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286 while ((ch = buffer[count]))
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
287 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
288 putDebugChar (ch);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
289 checksum += ch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
290 count += 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
291 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 putDebugChar ('#');
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 putDebugChar (hexchars[(checksum >> 4) & 0xf]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 putDebugChar (hexchars[checksum & 0xf]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296
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 while ((readDebugChar () & 0x7f) != '+');
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 }
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 static char remcomInBuffer[BUFMAX];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 static char remcomOutBuffer[BUFMAX];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 /* Indicate to caller of mem2hex or hex2mem that there has been an
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 error. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306 volatile int __mem_fault = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
308
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
309 #ifndef TARGET_HAS_OWN_MEM_FUNCS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
310 /*
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
311 * _target_readmem_hook / _target_writemem_hook:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
312 * Allow target to get involved in reading/writing memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
313 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
314 * If these hooks are defined by the target, they will be
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
315 * called for each user program memory access. Otherwise, the stub
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
316 * will simply dereference a pointer to access user program memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
317 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
318
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
319 unsigned char (*_target_readmem_hook) (unsigned char* addr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
320 void (*_target_writemem_hook) (unsigned char* addr,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
321 unsigned char value);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
322
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
323 static unsigned char
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
324 get_target_byte (volatile unsigned char *address)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
325 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
326 if (_target_readmem_hook) /* target needs to control memory access */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
327 return _target_readmem_hook ((unsigned char *) address);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
328 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
329 return *address;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
330 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
331
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
332 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
333 put_target_byte (volatile unsigned char *address, unsigned char value)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
334 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
335 if (_target_writemem_hook) /* target needs to control memory access */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
336 _target_writemem_hook ((unsigned char *) address, value);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
337 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
338 *address = value;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
339 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
340
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
341 /* These are the "arguments" to __do_read_mem and __do_write_mem,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
342 which are passed as globals to avoid squeezing them thru
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
343 __set_mem_fault_trap. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
344
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
345 static volatile target_register_t memCount;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
346 static volatile unsigned char *memSrc, *memDst;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
348 /*
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
349 * __do_read_mem:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
350 * Copy from target memory to trusted memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
351 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
352
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
353 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
354 __do_read_mem (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
355 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
356 __mem_fault = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
357 while (memCount)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
358 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
359 unsigned char ch = get_target_byte (memSrc++);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
360
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
361 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
362 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
363 *memDst++ = ch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
364 memCount--;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
365 }
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
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
368 /*
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
369 * __do_write_mem:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
370 * Copy from trusted memory to target memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
371 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
372
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
373 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
374 __do_write_mem (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
375 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
376 __mem_fault = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
377 while (memCount)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
378 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
379 unsigned char ch = *memSrc++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
380
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
381 put_target_byte (memDst++, ch);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
382 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
383 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
384 memCount--;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
385 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
386 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
387
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
388 /*
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
389 * __read_mem_safe:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
390 * Get contents of target memory, abort on error.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
391 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
392
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394 __read_mem_safe (unsigned char *dst, target_register_t src, int count)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
396 memCount = count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
397 memSrc = (unsigned char *) src;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
398 memDst = (unsigned char *) dst;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
399 __set_mem_fault_trap (__do_read_mem);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
400 return count - memCount; /* return number of bytes successfully read */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
403 /*
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
404 * __write_mem_safe:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
405 * Set contents of target memory, abort on error.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
406 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
407
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 __write_mem_safe (unsigned char *src, target_register_t dst, int count)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
411 memCount = count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
412 memSrc = (unsigned char *) src;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
413 memDst = (unsigned char *) dst;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
414 __set_mem_fault_trap (__do_write_mem);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
415 return count - memCount; /* return number of bytes successfully read */
0
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
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
418 #endif /* TARGET_HAS_OWN_MEM_FUNCS */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
419
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
420 /* These are the "arguments" to __mem2hex_helper and __hex2mem_helper,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
421 which are passed as globals to avoid squeezing them thru
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
422 __set_mem_fault_trap. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
423
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
424 static int hexMemCount;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
425 static char *hexMemSrc, *hexMemDst;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
426 static int may_fault_mode;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
427
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
428 /* Hamburger helper? */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
429 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
430 __mem2hex_helper (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
431 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
432 __mem_fault = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
433 while (hexMemCount-- > 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
434 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
435 unsigned char ch;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
436
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
437 if (may_fault_mode)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
438 __read_mem_safe (&ch, (target_register_t) (hexMemSrc++), 1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
439 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
440 ch = *(hexMemSrc++);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
441 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
442 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
443 *(hexMemDst++) = hexchars[(ch >> 4) & 0xf];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
444 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
445 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
446 *(hexMemDst++) = hexchars[ch & 0xf];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
447 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
448 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
449 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
450 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
451
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
452 /* Convert the memory pointed to by MEM into HEX, placing result in BUF.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
453 * Return a pointer to the last char put in buf (NUL). In case of a memory
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
454 * fault, return 0.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 * If MAY_FAULT is non-zero, then we will handle memory faults by returning
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
456 * a 0 (and assume that MEM is a pointer into the user program), else we
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
457 * treat a fault like any other fault in the stub (and assume that MEM is
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
458 * a pointer into the stub's memory).
0
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
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
461 char *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
462 __mem2hex (mem, buf, count, may_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
463 char *mem;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
464 char *buf;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465 int count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 int may_fault;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
468 hexMemDst = (unsigned char *) buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
469 hexMemSrc = (unsigned char *) mem;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
470 hexMemCount = count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
471 may_fault_mode = may_fault;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
472
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
473 if (may_fault)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
475 if (__set_mem_fault_trap (__mem2hex_helper))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
476 return 0;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
477 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
478 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
479 __mem2hex_helper ();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
481 *hexMemDst = 0;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
483 return (char *) hexMemDst;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
486 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
487 __hex2mem_helper (void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
489 target_register_t i;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
490 unsigned char ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
492 __mem_fault = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
493 for (i=0; i < hexMemCount && *hexMemSrc; i++)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
494 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
495 ch = stubhex (*(hexMemSrc++)) << 4;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
496 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
497 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
498 ch |= stubhex (*(hexMemSrc++));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
499 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
500 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
501 if (may_fault_mode)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
502 __write_mem_safe (&ch, (target_register_t) (hexMemDst++), 1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
503 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
504 *(hexMemDst++) = ch;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
505 if (__mem_fault)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
506 return;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
507 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
508 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
509
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
510 /* Convert COUNT bytes of the hex array pointed to by BUF into binary
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
511 to be placed in MEM. Return a pointer to the character AFTER the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
512 last byte written.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
513
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
514 If MAY_FAULT is set, we will return a non-zero value if a memory
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
515 fault occurs (and we assume that MEM is a pointer into the user
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
516 program). Otherwise, we will take a trap just like any other memory
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
517 fault (and assume that MEM points into the stub's memory). */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
518
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
519 char *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
520 __hex2mem (buf, mem, count, may_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
521 char *buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
522 char *mem;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
523 int count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
524 int may_fault;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
525 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
526 hexMemSrc = (unsigned char *) buf;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
527 hexMemDst = (unsigned char *) mem;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
528 hexMemCount = count;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
529 may_fault_mode = may_fault;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
530
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
531 if (may_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
532 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
533 if (__set_mem_fault_trap (__hex2mem_helper))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
534 return 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
535 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
536 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
537 __hex2mem_helper ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
538
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
539 return (char *) hexMemDst;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
540 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
541
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
542 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
543 set_debug_traps (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
544 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
545 __install_traps ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
546 initialized = 1; /* FIXME: Change this to dbg_stub_initialized */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
547 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
548
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 * While we find nice hex chars, build an int.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551 * Return number of chars processed.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
552 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
554 unsigned int
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
555 __hexToInt (char **ptr, target_register_t *intValue)
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 int numChars = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 int hexValue;
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 *intValue = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
561
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562 while (**ptr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
564 hexValue = stubhex (**ptr);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
565 if (hexValue < 0)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
566 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
568 *intValue = (*intValue << 4) | hexValue;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
569 numChars ++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
571 (*ptr)++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
572 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
573
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574 return (numChars);
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
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 * Complement of __hexToInt: take an int of size "numBits",
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
579 * convert it to a hex string. Return length of (unterminated) output.
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582 unsigned int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
583 __intToHex (char *ptr, target_register_t intValue, int numBits)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
584 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
585 int numChars = 0;
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 if (intValue == 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
588 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
589 *(ptr++) = '0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
590 *(ptr++) = '0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
591 return 2;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594 numBits = (numBits + 7) / 8;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 while (numBits)
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 v = (intValue >> ((numBits - 1) * 8));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
598 if (v || (numBits == 1))
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
599 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
600 v = v & 255;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
601 *(ptr++) = __tohex ((v / 16) & 15);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
602 *(ptr++) = __tohex (v & 15);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
603 numChars += 2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
604 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605 numBits--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608 return (numChars);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
611 #if DEBUG_THREADS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
612 /*
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
613 * Kernel Thread Control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
614 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
615 * If the current thread is set to other than zero (or minus one),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
616 * then ask the kernel to lock it's scheduler so that only that thread
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
617 * can run.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
618 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
619
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
620 static unsigned char did_lock_scheduler = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
621 static unsigned char did_disable_interrupts = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
622
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
623 /* Pointer to "kernel call" for scheduler control */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
624 static int (*schedlock_fn) (int, int, long) = stub_lock_scheduler;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
625
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
626 /* Pointer to target stub call for disabling interrupts.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
627 Target stub will initialize this if it can. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
628 int (*__disable_interrupts_hook) (int); /* don't initialize here! */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
629 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
630
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
631 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
632 lock_thread_scheduler (int kind) /* "step" or "continue" */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
633 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
634 #if DEBUG_THREADS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
635 int ret = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
636
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
637 /* GDB will signal its desire to run a single thread
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
638 by setting _gdb_cont_thread to non-zero / non-negative. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
639 if (_gdb_cont_thread <= 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
640 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
641
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
642 if (schedlock_fn) /* kernel call */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
643 ret = (*schedlock_fn) (1, kind, _gdb_cont_thread);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
644
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
645 if (ret == 1)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
646 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
647 did_lock_scheduler = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
648 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
649 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
650
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
651 if (schedlock_fn == 0 || /* no kernel scheduler call */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
652 ret == -1) /* kernel asks stub to handle it */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
653 if (__disable_interrupts_hook) /* target stub has capability */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
654 if ((*__disable_interrupts_hook) (1))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
655 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
656 did_disable_interrupts = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
657 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
658 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
659 #endif /* DEBUG_THREADS */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
660 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
661
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
662 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
663 unlock_thread_scheduler ()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
664 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
665 #if DEBUG_THREADS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
666 if (did_lock_scheduler)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
667 if (schedlock_fn) /* kernel call */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
668 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
669 (*schedlock_fn) (0, 0, _gdb_cont_thread);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
670 /* I could check the return value, but
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
671 what would I do if it failed??? */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
672 did_lock_scheduler = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
673 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
674 if (did_disable_interrupts)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
675 if (__disable_interrupts_hook) /* target stub call */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
676 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
677 (*__disable_interrupts_hook) (0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
678 /* Again, I could check the return value, but
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
679 what would I do if it failed??? */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
680 did_disable_interrupts = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
681 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
682 #endif /* DEBUG_THREADS */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
683 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
684
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686 __handle_exception (void)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688 int sigval;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
690 #ifdef TARGET_HAS_NEXT_STEP
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
691 if (! __next_step_done ())
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
692 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
693 __clear_breakpoints ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
694 __install_breakpoints ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
695 __single_step ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
696 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
697 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
698 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
699
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
700 #ifdef __ECOS__
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
701 // We need to unpack the registers before they are accessed.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
702 if (__cleanup_vec != NULL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
703 __cleanup_vec ();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
704
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
705 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
706 // Special case for GDB BREAKs. This flag is set by cyg_stub_cleanup.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
707 if (cyg_hal_gdb_break) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
708 cyg_hal_gdb_break = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
709 sigval = SIGINT;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
710 } else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
711 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
712 sigval = __computeSignal (__get_trap_number ());
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
713 #else // __ECOS__
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714 /* reply to host that an exception has occurred */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
715 sigval = __computeSignal (__get_trap_number ());
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
716 #endif // __ECOS__
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
718 if (__is_breakpoint_function ())
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
719 __skipinst ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
721 #ifndef __ECOS__
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
722 if (__cleanup_vec != NULL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
723 __cleanup_vec ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
724 #endif // !__ECOS__
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
725
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
726 __clear_breakpoints ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
727
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
728 /* Undo effect of previous single step. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
729 unlock_thread_scheduler ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
730 __clear_single_step ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
731
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
732 #ifdef SIGSYSCALL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
733 if (sigval == SIGSYSCALL)
0
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 int val;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
736 /* Do the skipinst FIRST. */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
737 #ifndef SYSCALL_PC_AFTER_INST
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
738 __skipinst ();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
739 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740 val = __process_syscall_vec (__get_syscall_num ());
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
741 if (val < 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
742 sigval = -val;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
743 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
744 sigval = 0;
0
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
749 /* Indirect function call to stub, cygmon monitor or other */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
750 if (sigval != 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
751 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
752 while (__process_exception_vec (sigval))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
753 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
754 /* Empty! */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
755 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
756 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
758 __install_breakpoints ();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
759
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
760 if (__init_vec != NULL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
761 __init_vec ();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
762 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
763
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
764 /*
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
765 * _get_trace_register_hook:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
766 * This function pointer will be non-zero if the trace component
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
767 * wants to intercept requests for register values.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
768 *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
769 * FIXME: evidently I need a new hook for large registers...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
770 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
771
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
772 int (*_get_trace_register_hook) (regnames_t, target_register_t *);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
773
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
774 int
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
775 __process_packet (char *packet)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
776 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
777 int is_binary = 0;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
778 remcomOutBuffer[0] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
779
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
780 switch (packet[0])
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
781 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
782 case '?':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
783 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
784 int sigval = __computeSignal (__get_trap_number ());
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
785 remcomOutBuffer[0] = 'S';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
786 remcomOutBuffer[1] = hexchars[(sigval >> 4) & 0xf];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
787 remcomOutBuffer[2] = hexchars[sigval & 0xf];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
788 remcomOutBuffer[3] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
789 break;
0
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
792 case 'd':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
793 /* toggle debug flag */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
794 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
795
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
796 case 'q':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
797 /* general query packet */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
798 process_query (&packet[1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
799 break;
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 case 'Q':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
802 /* general set packet */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
803 process_set (&packet[1]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
804 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
805
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
806 case 'g': /* return the value of the CPU registers */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
807 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
808 char *ptr = remcomOutBuffer;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
809 int regnum;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
810
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
811 for (regnum = 0; regnum < NUMREGS_GDB; regnum++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
812 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
813 /* We need to compensate for the value offset within the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
814 register. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
815 char dummyDat[32];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
816 target_register_t addr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
817 char *vptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
818 int reg_valid = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
819
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
820 #ifdef TARGET_HAS_LARGE_REGISTERS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
821 if (sizeof (target_register_t) < REGSIZE (regnum))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
822 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
823 get_register_as_bytes (regnum, dummyDat);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
824 vptr = dummyDat;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
825 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
826 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
827 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
828 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
829 if (_get_trace_register_hook)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
830 reg_valid = _get_trace_register_hook (regnum, &addr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
831 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
832 addr = get_register (regnum);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
833
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
834 vptr = ((char *) &addr) + sizeof (addr) - REGSIZE (regnum);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
835 if (sizeof (addr) < REGSIZE (regnum))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
836 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
837 int off = REGSIZE (regnum) - sizeof (addr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
838 int x;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
840 for (x = 0; x < off; x++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
841 dummyDat[x] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
842 memcpy (dummyDat + off, &addr, sizeof (addr));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
843 vptr = dummyDat;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
844 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
845 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
846 if (reg_valid) /* we have a valid reg value */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
847 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
848 ptr = __mem2hex (vptr, ptr, REGSIZE (regnum), 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
849 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
850 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
851 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
852 /* Trace component returned a failure code.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
853 This means that the register value is not available.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
854 We'll fill it with 'x's, and GDB will understand. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
855 memset (ptr, 'x', 2 * REGSIZE (regnum));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
856 ptr += 2 * REGSIZE (regnum);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
857 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
858 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
859 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
860 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
861
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
862 case 'A': /* set program arguments */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
863 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
864 if (packet[1] == '\0')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
865 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
866 __free_program_args ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
867 strcpy (remcomOutBuffer, "OK");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
868 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
869 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
870 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
871 target_register_t arglen, argnum;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
872 char *ptr = &packet[1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
873
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
874 while (1)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
875 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
876 if (__hexToInt (&ptr, &arglen)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
877 && (*ptr++ == ',')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
878 && __hexToInt (&ptr, &argnum)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
879 && (*ptr++ == ','))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
880 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
881 if (arglen > 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
882 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
883 char *s = __add_program_arg (argnum, arglen);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
884 if (s != NULL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
885 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
886 __hex2mem (ptr, s, arglen, 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
887 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
888 ptr += arglen * 2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
889 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
890
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
891 if (*ptr == ',')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
892 ptr++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
893 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
894 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
895 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
896 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
897 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
898 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
899 if (*ptr == '\0')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
900 strcpy (remcomOutBuffer, "OK");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
901 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
902 strcpy (remcomOutBuffer, "E01");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
903 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
904 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
905 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
906
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
907 case 'P':
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
908 case 'G': /* set the value of the CPU registers - return OK */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
909 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
910 int x;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
911 int sr = 0, er = NUMREGS_GDB;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
912 char *ptr = &packet[1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
913
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
914 if (packet[0] == 'P')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
915 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
916 target_register_t regno;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
917
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
918 if (__hexToInt (&ptr, &regno)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
919 && (*ptr++ == '='))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
920 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
921 sr = regno;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
922 er = regno + 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
923 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
924 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
925 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
926 strcpy (remcomOutBuffer, "P01");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
927 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
928 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
929 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
930
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
931 for (x = sr; x < er; x++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
932 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
933 target_register_t value = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
934 char *vptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
935
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
936 #ifdef TARGET_HAS_LARGE_REGISTERS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
937 if (sizeof (target_register_t) < REGSIZE (x))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
938 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
939 char dummyDat [32];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
940
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
941 __hex2mem (ptr, dummyDat, REGSIZE (x), 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
942 put_register_as_bytes (x, dummyDat);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
943 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
944 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
945 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
946 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
947 vptr = ((char *) &value) + sizeof (value) - REGSIZE (x);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
948 __hex2mem (ptr, vptr, REGSIZE (x), 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
949 put_register (x, value);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
950 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
951 ptr += REGSIZE (x) * 2;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
952 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
953
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
954 strcpy (remcomOutBuffer, "OK");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
955 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
956 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
957
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
958 case 'm': /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
959 /* Try to read %x,%x. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
960 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
961 target_register_t addr, length;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
962 char *ptr = &packet[1];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
963
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
964 if (__hexToInt (&ptr, &addr)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
965 && *ptr++ == ','
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
966 && __hexToInt (&ptr, &length))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
967 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
968 if (__mem2hex ((char *) addr, remcomOutBuffer, length, 1))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
969 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
970
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
971 strcpy (remcomOutBuffer, "E03");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
972 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
973 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
974 strcpy (remcomOutBuffer, "E01");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
975 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
976 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
977
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
978 case 'X':
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
979 /* XAA..AA,LLLL: Write LLLL escaped binary bytes at address AA.AA */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
980 is_binary = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
981 /* fall through */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
982 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
983 /* Try to read '%x,%x:'. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
984 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
985 target_register_t addr, length;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
986 char *ptr = &packet[1], buf[128];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
987 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
988
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
989 if (__hexToInt (&ptr, &addr)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
990 && *ptr++ == ','
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
991 && __hexToInt (&ptr, &length)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
992 && *ptr++ == ':')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
993 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
994 if (is_binary)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
995 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
996 while (length > 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
997 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
998 for (i = 0; i < sizeof(buf) && i < length; i++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
999 if ((buf[i] = *ptr++) == 0x7d)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1000 buf[i] = 0x20 | (*ptr++ & 0xff);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1001
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1002 if (__write_mem_safe (buf, addr, i) != i)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1003 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1004
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1005 length -= i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1006 addr += i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1007 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1008 if (length <= 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1009 strcpy (remcomOutBuffer, "OK");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1010 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1011 strcpy (remcomOutBuffer, "E03");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1012 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1013 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1014 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1015 if (__hex2mem (ptr, (char *) addr, length, 1) != NULL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1016 strcpy (remcomOutBuffer, "OK");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1017 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1018 strcpy (remcomOutBuffer, "E03");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1019 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1020 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1021 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1022 strcpy (remcomOutBuffer, "E02");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1023 break;
0
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1026 case 'S':
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1027 case 's': /* sAA..AA Step from address AA..AA (optional) */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1028 case 'C':
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1029 case 'c': /* cAA..AA Continue at address AA..AA (optional) */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1030 /* try to read optional parameter, pc unchanged if no parm */
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 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1033 char *ptr = &packet[1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1034 target_register_t addr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1035 target_register_t sigval = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1036
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1037 if (packet[0] == 'C' || packet[0] == 'S')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1038 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1039 __hexToInt (&ptr, &sigval);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1040 if (*ptr == ';')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1041 ptr++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1042 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1043
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1044 if (__hexToInt (&ptr, &addr))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1045 set_pc (addr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1046
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1047 /* Need to flush the instruction cache here, as we may have
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1048 deposited a breakpoint, and the icache probably has no way of
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1049 knowing that a data ref to some location may have changed
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1050 something that is in the instruction cache. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1051
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1052 #ifdef __ECOS__
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1053 __data_cache (CACHE_FLUSH) ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1054 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1055 __instruction_cache (CACHE_FLUSH) ;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1056
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1057 /* If we have a function to handle signals, call it. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1058 if (sigval != 0 && __process_signal_vec != NULL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1059 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1060 /* If 0 is returned, we either ignored the signal or invoked a user
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1061 handler. Otherwise, the user program should die. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1062 if (! __process_signal_vec (sigval))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1063 sigval = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1064 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1065
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1066 if (sigval != 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1067 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1068 sigval = SIGKILL; /* Always nuke the program */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1069 __kill_program (sigval);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1070 return 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1071 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1072
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1073 /* Set machine state to force a single step. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1074 if (packet[0] == 's' || packet[0] == 'S')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1075 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1076 lock_thread_scheduler (0); /* 0 == single-step */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1077 #ifdef __ECOS__
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1078 // PR 19845 workaround:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1079 // Make sure the single-step magic affects the correct registers.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1080 _registers = &registers[0];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1081 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1082 __single_step ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1083 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1084 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1085 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1086 lock_thread_scheduler (1); /* 1 == continue */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1087 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1088
28
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1089 #ifdef __ECOS__
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1090 /* Need to flush the data and instruction cache here, as we may have
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1091 deposited a breakpoint in __single_step. */
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1092
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1093 __data_cache (CACHE_FLUSH) ;
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1094 __instruction_cache (CACHE_FLUSH) ;
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1095 #endif
18ee5a9c102e Merge from eCos master repository on 1999-08-09-17:04:48-BST
jlarmour
parents: 2
diff changeset
1096
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1097 return -1;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1098 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1099
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1100 /* kill the program */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1101 case 'k' :
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1102 __process_exit_vec ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1103 return 1;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1104
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1105 case 'r': /* Reset */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1106 __reset ();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1107 break;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1108
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1109 case 'H':
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1110 STUB_PKT_CHANGETHREAD (packet+1, remcomOutBuffer, 300) ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1111 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1112 case 'T' :
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1113 STUB_PKT_THREAD_ALIVE (packet+1, remcomOutBuffer, 300) ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1114 break ;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1115 case 'B':
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1116 /* breakpoint */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1117 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1118 target_register_t addr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1119 char mode;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1120 char *ptr = &packet[1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1121 if (__hexToInt (&ptr, &addr) && *(ptr++) == ',')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1122 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1123 mode = *(ptr++);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1124 if (mode == 'C')
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1125 __remove_breakpoint (addr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1126 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1127 __set_breakpoint (addr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1128 strcpy (remcomOutBuffer, "OK");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1129 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1130 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1131 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1132 strcpy (remcomOutBuffer, "E01");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1133 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1134 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1135 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1136
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1137 case 'b': /* bBB... Set baud rate to BB... */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1138 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1139 target_register_t baudrate;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1140
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1141 char *ptr = &packet[1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1142 if (!__hexToInt (&ptr, &baudrate))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1143 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1144 strcpy (remcomOutBuffer, "B01");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1145 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1146 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1147
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1148 __putpacket ("OK"); /* Ack before changing speed */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1149 __set_baud_rate (baudrate);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1150 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1151 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1152 default:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1153 __process_target_packet (packet, remcomOutBuffer, 300);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1154 break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1155 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1156
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1157 /* reply to the request */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1158 __putpacket (remcomOutBuffer);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1159 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1160 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1161
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1162 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1163 send_t_packet (int sigval)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1164 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1165 __build_t_packet (sigval, remcomOutBuffer);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1166 __putpacket (remcomOutBuffer);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1167 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1168
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1169 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1170 * This function does all command procesing for interfacing to gdb.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1171 */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1172
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1173 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1174 process_exception (int sigval)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1175 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1176 int status;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1177
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1178 /* Nasty. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1179 if (ungot_char < 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1180 send_t_packet (sigval);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1181
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1182 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1183 getpacket (remcomInBuffer);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1184 status = __process_packet (remcomInBuffer);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1185 } while (status == 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1186
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1187 if (status < 0)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1188 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1189 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1190 return 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1191 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1192
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1193 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1194 __send_exit_status (int status)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1195 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1196 remcomOutBuffer[0] = 'W';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1197 remcomOutBuffer[1] = hexchars[(status >> 4) & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1198 remcomOutBuffer[2] = hexchars[status & 0xf];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1199 remcomOutBuffer[3] = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1200 __putpacket (remcomOutBuffer);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1201 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1202
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1203 /* Read up to MAXLEN bytes from the remote GDB client, and store in DEST
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1204 (which is a pointer in the user program). BLOCK indicates what mode
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1205 is being used; if it is set, we will wait for MAXLEN bytes to be
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1206 entered. Otherwise, the function will return immediately with whatever
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1207 bytes are waiting to be read.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1208
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1209 The value returned is the number of bytes read. A -1 indicates that an
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1210 error of some sort occurred. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1211
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1212 int
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1213 __get_gdb_input (target_register_t dest, int maxlen, int block)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1214 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1215 char buf[4];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1216 int len, i;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1217 char d;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1218
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1219 buf[0] = 'I';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1220 buf[1] = '0';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1221 buf[2] = block ? '0' : '1';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1222 buf[3] = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1223 __putpacket (buf);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1224 getpacket (remcomInBuffer);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1225 if (remcomInBuffer[0] != 'I')
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1226 return -1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1227 len = stubhex (remcomInBuffer[1]) * 16 + stubhex (remcomInBuffer[2]);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1228 for (i = 0; i < len; i++)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1229 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1230 d = stubhex (remcomInBuffer[3 + i * 2]) * 16;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1231 d |= stubhex (remcomInBuffer[3 + i * 2 + 1]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1232 __write_mem_safe (&d, dest + i, 1);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1233 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1234 /* Write the trailing \0. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1235 d = '\0';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1236 __write_mem_safe (&d, dest + i, 1);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1237 return len;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1238 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1239
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1240 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1241 __output_hex_value (target_register_t i)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1242 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1243 char buf[32], *ptr=buf+31;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1244 unsigned int x;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1245
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1246 *ptr = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1247 for (x = 0; x < (sizeof (i) * 2); x++)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1248 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1249 *(--ptr) = hexchars[i & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1250 i = i >> 4;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1251 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1252 while (*ptr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1253 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1254 putDebugChar (*(ptr++));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1255 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1256 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1257
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1258 /* Write the C-style string pointed to by STR to the GDB comm port. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1259 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1260 __putDebugStr (char *str)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1261 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1262 while (*str)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1263 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1264 putDebugChar (*str);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1265 str++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1266 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1267 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1268
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1269 /* Send STRING_LEN bytes of STR to GDB, using 'O' packets.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1270 STR is assumed to be in the program being debugged. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1271
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1272 int
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1273 __output_gdb_string (target_register_t str, int string_len)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1274 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1275 /* We will arbitrarily limit output packets to less than 400 bytes. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1276 static char buf[400];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1277 int x;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1278 int len;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1279
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1280 if (string_len == 0)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1281 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1282 /* We can't do strlen on a user pointer. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1283 return -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1284 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1285
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1286 len = string_len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1287 while (len > 0)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1288 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1289 int packetlen = ((len < 175) ? len : 175);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1290 buf[0] = 'O';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1291 for (x = 0; x < packetlen; x++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1292 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1293 char c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1294
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1295 __read_mem_safe (&c, str + x, 1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1296 buf[x*2+1] = hexchars[(c >> 4) & 0xf];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1297 buf[x*2+2] = hexchars[c % 16];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1298 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1299 str += x;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1300 len -= x;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1301 buf[x*2+1] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1302 __putpacket (buf);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1303 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1304 return string_len;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1305 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1306
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1307 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1308 do_nothing (void)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1309 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1310 /* mmmm */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1311 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1312
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1313 static int
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1314 syscall_do_nothing (int junk)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1315 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1316 return 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1317 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1318
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1319 /* Start the stub running. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1320 void
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1321 __switch_to_stub (void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1322 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1323 __process_exception_vec = process_exception;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1324 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1325
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1326 #if ! defined(BOARD_SPECIFIC_STUB_INIT)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1327 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1328 initialize_stub (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1329 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1330 set_debug_traps ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1331 /* FIXME: This function should be renamed to specifically init the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1332 hardware required by debug operations. If initHardware is implemented at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1333 all, it should be called before main ().
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1334 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1335 initHardware () ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1336 /* This acks any stale packets , NOT an effective solution */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1337 putDebugChar ('+');
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1338 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1339 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1340
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1341 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1342 ungetDebugChar (int c)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1343 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1344 ungot_char = c;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1345 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1346
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1347 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1348 __kill_program (int sigval)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1349 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1350 remcomOutBuffer[0] = 'X';
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1351 remcomOutBuffer[1] = hexchars[(sigval >> 4) & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1352 remcomOutBuffer[2] = hexchars[sigval & 15];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1353 remcomOutBuffer[3] = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1354 __putpacket (remcomOutBuffer);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1355 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1356
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1357 #define MAX_ARG_COUNT 20
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1358 #define MAX_ARGDATA 128
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1359
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1360 static char *program_argv [MAX_ARG_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1361 static int program_argc;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1362 static int last_program_arg;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1363 static char program_argstr [MAX_ARGDATA], *argptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1364 static int args_initted = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1365
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1366 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1367 __free_program_args (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1368 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1369 last_program_arg = -1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1370 program_argc = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1371 program_argv [0] = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1372 argptr = program_argstr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1373 args_initted = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1374 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1375
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1376 static char *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1377 __add_program_arg (int argc, uint32 len)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1378 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1379 char *res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1380
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1381 if (! args_initted)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1382 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1383 __free_program_args ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1384 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1385
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1386 if ((argc >= (MAX_ARG_COUNT - 1))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1387 || ((argptr - program_argstr + len) > MAX_ARGDATA))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1388 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1389 return NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1390 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1391
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1392 if (argc != last_program_arg)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1393 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1394 if (argc >= program_argc)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1395 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1396 program_argc = argc + 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1397 program_argv [program_argc] = NULL;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1398 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1399 program_argv [argc] = argptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1400 last_program_arg = argc;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1401 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1402
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1403 res = argptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1404 argptr += len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1405
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1406 return res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1407 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1408
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1409 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1410 __set_program_args (int argc, char **argv)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1411 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1412 int x;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1413
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1414 __free_program_args ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1415 if (argc)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1416 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1417 for (x = 0; x < argc; x++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1418 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1419 uint32 len = strlen (argv[x])+1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1420 char *s = __add_program_arg (x, len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1421
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1422 if (s == NULL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1423 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1424
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1425 memcpy (s, argv[x], len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1426 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1427 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1428 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1429
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1430 char **
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1431 __get_program_args (target_register_t argcPtr)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1432 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1433 if (!args_initted)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1434 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1435 __free_program_args ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1436 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1437 __write_mem_safe ((char *) &program_argc, argcPtr, sizeof (program_argc));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1438 return program_argv;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1439 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1440
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1441 /* Table used by the crc32 function to calcuate the checksum. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1442 static uint32 crc32_table[256];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1443 static int tableInit = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1444
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1445 /*
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1446 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
1447 value.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1448 PTR is assumed to be a pointer in the user program. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1449
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1450 static uint32
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1451 crc32 (ptr, len, crc)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1452 unsigned char *ptr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1453 int len;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1454 uint32 crc;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1455 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1456 if (! tableInit)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1457 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1458 /* Initialize the CRC table and the decoding table. */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1459 uint32 i, j;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1460 uint32 c;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1461
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1462 tableInit = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1463 for (i = 0; i < 256; i++)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1464 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1465 for (c = i << 24, j = 8; j > 0; --j)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1466 c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1467 crc32_table[i] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1468 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1469 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1470
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1471 __mem_fault = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1472 while (len--)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1473 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1474 unsigned char ch;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1475
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1476 __read_mem_safe (&ch, (target_register_t) ptr, 1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1477 if (__mem_fault)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1478 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1479 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1480 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1481 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ ch) & 255];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1482 ptr++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1483 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1484 return crc;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1485 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1486
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1487 /* Handle the 'q' request */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1488
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1489 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1490 process_query (char *pkt)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1491 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1492 remcomOutBuffer[0] = '\0';
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1493 #ifdef __ECOS__
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1494 if ('C' == pkt[0] &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1495 'R' == pkt[1] &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1496 'C' == pkt[2] &&
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1497 ':' == pkt[3])
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1498 #else // __ECOS__
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1499 if (strncmp (pkt, "CRC:", 4) == 0)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1500 #endif // __ECOS__
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1501 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1502 target_register_t startmem;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1503 target_register_t length;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1504 uint32 our_crc;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1505
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1506 pkt += 4;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1507 if (__hexToInt (&pkt, &startmem)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1508 && *(pkt++) == ','
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1509 && __hexToInt (&pkt, &length))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1510 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1511 our_crc = crc32 ((unsigned char *) startmem, length, 0xffffffff);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1512 if (__mem_fault)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1513 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1514 strcpy (remcomOutBuffer, "E01");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1515 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1516 else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1517 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1518 int numb = __intToHex (remcomOutBuffer + 1, our_crc, 32);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1519 remcomOutBuffer[0] = 'C';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1520 remcomOutBuffer[numb + 1] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1521 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1522 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1523 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1524 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1525 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1526 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1527 char ch ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1528 char * subpkt ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1529 ch = *pkt ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1530 subpkt = pkt + 1 ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1531 switch (ch)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1532 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1533 case 'L' : /* threadlistquery */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1534 STUB_PKT_GETTHREADLIST (subpkt, remcomOutBuffer, 300);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1535 break ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1536 case 'P' : /* Thread or process information request */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1537 STUB_PKT_GETTHREADINFO (subpkt, remcomOutBuffer, 300);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1538 break ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1539 case 'C' : /* current thread query */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1540 STUB_PKT_CURRTHREAD(subpkt, remcomOutBuffer, sizeof(remcomOutBuffer));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1541 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1542 default:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1543 __process_target_query (pkt, remcomOutBuffer, 300);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1544 break ;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1545 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1546 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1547 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1548
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1549 /* Handle the 'Q' request */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1550
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1551 static void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1552 process_set (char *pkt)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1553 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1554 char ch ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1555 ch = *pkt ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1556
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1557 switch (ch)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1558 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1559 case 'p' : /* Set current process or thread */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1560 /* reserve the packet id even if support is not present */
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1561 /* Dont strip the 'p' off the header, there are several variations of
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1562 this packet */
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1563 STUB_PKT_CHANGETHREAD (pkt, remcomOutBuffer, 300) ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1564 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1565 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1566 __process_target_set (pkt, remcomOutBuffer, 300);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1567 break ;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1568 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1569 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1570 #endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS