1b725ae77Skettenis /*
2b725ae77Skettenis * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
3b725ae77Skettenis *
4b725ae77Skettenis * This software may be freely used, copied, modified, and distributed
5b725ae77Skettenis * provided that the above copyright notice is preserved in all copies of the
6b725ae77Skettenis * software.
7b725ae77Skettenis */
8b725ae77Skettenis
9b725ae77Skettenis /*
10b725ae77Skettenis * ARDI.c
11b725ae77Skettenis * Angel Remote Debug Interface
12b725ae77Skettenis *
13b725ae77Skettenis *
14*63addd46Skettenis * $Revision: 1.3 $
15*63addd46Skettenis * $Date: 2004/12/27 14:00:53 $
16b725ae77Skettenis *
17b725ae77Skettenis * This file is based on /plg/pisd/rdi.c, but instead of using RDP it uses
18b725ae77Skettenis * ADP messages.
19b725ae77Skettenis */
20b725ae77Skettenis
21b725ae77Skettenis #include <stdarg.h>
22b725ae77Skettenis #include <stdio.h>
23b725ae77Skettenis #include <stdlib.h>
24b725ae77Skettenis #include <string.h>
25b725ae77Skettenis #define uint HIDE_HPs_uint
26b725ae77Skettenis #include <signal.h>
27b725ae77Skettenis #undef uint
28b725ae77Skettenis
29b725ae77Skettenis
30b725ae77Skettenis #include "angel_endian.h"
31b725ae77Skettenis #include "ardi.h"
32b725ae77Skettenis #include "buffers.h"
33b725ae77Skettenis #include "channels.h"
34b725ae77Skettenis #include "hostchan.h"
35b725ae77Skettenis #include "host.h"
36b725ae77Skettenis #include "angel_bytesex.h"
37b725ae77Skettenis #include "dbg_cp.h"
38b725ae77Skettenis #include "adp.h"
39b725ae77Skettenis #include "hsys.h"
40b725ae77Skettenis #include "logging.h"
41b725ae77Skettenis #include "msgbuild.h"
42b725ae77Skettenis #include "rxtx.h"
43b725ae77Skettenis #include "devsw.h"
44b725ae77Skettenis #include "params.h"
45b725ae77Skettenis
46b725ae77Skettenis #ifdef COMPILING_ON_WINDOWS
47b725ae77Skettenis # define IGNORE(x) (x = x) /* must go after #includes to work on Windows */
48b725ae77Skettenis #endif
49b725ae77Skettenis #define NOT(x) (!(x))
50b725ae77Skettenis
51b725ae77Skettenis #define ADP_INITIAL_TIMEOUT_PERIOD 5
52b725ae77Skettenis
53b725ae77Skettenis static volatile int executing;
54b725ae77Skettenis static int rdi_log = 0 ; /* debugging ? */
55b725ae77Skettenis
56b725ae77Skettenis /* we need a starting point for our first buffers, this is a safe one */
57b725ae77Skettenis int Armsd_BufferSize = ADP_BUFFER_MIN_SIZE;
58b725ae77Skettenis int Armsd_LongBufSize = ADP_BUFFER_MIN_SIZE;
59b725ae77Skettenis
60b725ae77Skettenis #ifdef WIN32
61b725ae77Skettenis extern int interrupted;
62b725ae77Skettenis extern int swiprocessing;
63b725ae77Skettenis #endif
64b725ae77Skettenis
65b725ae77Skettenis static char dummycline = 0;
66b725ae77Skettenis char *ardi_commandline = &dummycline ; /* exported in ardi.h */
67b725ae77Skettenis
68b725ae77Skettenis extern unsigned int heartbeat_enabled;
69b725ae77Skettenis
70b725ae77Skettenis static unsigned char *cpwords[16];
71b725ae77Skettenis
72b725ae77Skettenis typedef struct stoppedProcListElement {
73b725ae77Skettenis struct stoppedProcListElement *next;
74b725ae77Skettenis angel_RDI_TargetStoppedProc *fn;
75b725ae77Skettenis void *arg;
76b725ae77Skettenis } stoppedProcListElement;
77b725ae77Skettenis
78b725ae77Skettenis static stoppedProcListElement *stopped_proc_list=NULL;
79b725ae77Skettenis
80b725ae77Skettenis const struct Dbg_HostosInterface *angel_hostif;
81b725ae77Skettenis static hsys_state *hstate;
82b725ae77Skettenis
angel_DebugPrint(const char * format,...)83b725ae77Skettenis static void angel_DebugPrint(const char *format, ...)
84b725ae77Skettenis { va_list ap;
85b725ae77Skettenis va_start(ap, format);
86b725ae77Skettenis angel_hostif->dbgprint(angel_hostif->dbgarg, format, ap);
87b725ae77Skettenis va_end(ap);
88b725ae77Skettenis }
89b725ae77Skettenis
90b725ae77Skettenis #ifdef RDI_VERBOSE
91b725ae77Skettenis #define TracePrint(s) \
92b725ae77Skettenis if (rdi_log & 2) angel_DebugPrint("\n"); \
93b725ae77Skettenis if (rdi_log & 1) angel_DebugPrint s
94b725ae77Skettenis #else
95b725ae77Skettenis #define TracePrint(s)
96b725ae77Skettenis #endif
97b725ae77Skettenis
98b725ae77Skettenis typedef struct receive_dbgmsg_state {
99b725ae77Skettenis volatile int received;
100b725ae77Skettenis Packet *packet;
101b725ae77Skettenis } receive_dbgmsg_state;
102b725ae77Skettenis
103b725ae77Skettenis static receive_dbgmsg_state dbgmsg_state;
104b725ae77Skettenis
receive_debug_packet(Packet * packet,void * stateptr)105b725ae77Skettenis static void receive_debug_packet(Packet *packet, void *stateptr)
106b725ae77Skettenis {
107b725ae77Skettenis receive_dbgmsg_state *state = stateptr;
108b725ae77Skettenis
109b725ae77Skettenis state->packet = packet;
110b725ae77Skettenis state->received = 1;
111b725ae77Skettenis }
112b725ae77Skettenis
register_debug_message_handler(void)113b725ae77Skettenis static int register_debug_message_handler(void)
114b725ae77Skettenis {
115b725ae77Skettenis int err;
116b725ae77Skettenis dbgmsg_state.received = 0;
117b725ae77Skettenis
118b725ae77Skettenis err = Adp_ChannelRegisterRead(CI_HADP, receive_debug_packet, &dbgmsg_state);
119b725ae77Skettenis #ifdef DEBUG
120b725ae77Skettenis if (err!=adp_ok) angel_DebugPrint("register_debug_message_handler failed %i\n", err);
121b725ae77Skettenis #endif
122b725ae77Skettenis return err;
123b725ae77Skettenis }
124b725ae77Skettenis
125b725ae77Skettenis
wait_for_debug_message(int * rcode,int * debugID,int * OSinfo1,int * OSinfo2,int * status,Packet ** packet)126b725ae77Skettenis static int wait_for_debug_message(int *rcode, int *debugID,
127b725ae77Skettenis int *OSinfo1, int *OSinfo2,
128b725ae77Skettenis int *status, Packet **packet)
129b725ae77Skettenis {
130b725ae77Skettenis unsigned int reason;
131b725ae77Skettenis
132b725ae77Skettenis #ifdef DEBUG
133b725ae77Skettenis angel_DebugPrint("wait_for_debug_message waiting for %X\n", *rcode);
134b725ae77Skettenis #endif
135b725ae77Skettenis
136b725ae77Skettenis for ( ; dbgmsg_state.received == 0 ; )
137b725ae77Skettenis Adp_AsynchronousProcessing(async_block_on_read);
138b725ae77Skettenis
139b725ae77Skettenis #ifdef DEBUG
140b725ae77Skettenis angel_DebugPrint("wait_for_debug_message got packet\n");
141b725ae77Skettenis #endif
142b725ae77Skettenis
143b725ae77Skettenis *packet = dbgmsg_state.packet;
144b725ae77Skettenis
145b725ae77Skettenis Adp_ChannelRegisterRead(CI_HADP, NULL, NULL);
146b725ae77Skettenis
147b725ae77Skettenis /*
148b725ae77Skettenis * TODO:
149b725ae77Skettenis * If ADP_Unrecognised return error.
150b725ae77Skettenis * If ADP_Acknowledge - handle appropriately.
151b725ae77Skettenis * If expected message read arguments and return RDIError_NoError.
152b725ae77Skettenis * Note: if RDIError occurs then the data values returned are junk
153b725ae77Skettenis */
154b725ae77Skettenis
155b725ae77Skettenis unpack_message(BUFFERDATA((*packet)->pk_buffer), "%w%w%w%w%w", &reason, debugID,
156b725ae77Skettenis OSinfo1, OSinfo2, status);
157b725ae77Skettenis if ((reason&0xffffff) == ADP_HADPUnrecognised)
158b725ae77Skettenis return RDIError_UnimplementedMessage;
159b725ae77Skettenis if (reason != (unsigned ) *rcode) {
160b725ae77Skettenis if((reason&0xffffff) == ADP_HADPUnrecognised)
161b725ae77Skettenis return RDIError_UnimplementedMessage;
162b725ae77Skettenis else {
163b725ae77Skettenis angel_DebugPrint("ARDI ERROR: Expected reasoncode %x got reasoncode %x.\n",
164b725ae77Skettenis *rcode, reason);
165b725ae77Skettenis return RDIError_Error;
166b725ae77Skettenis }
167b725ae77Skettenis }
168b725ae77Skettenis else
169b725ae77Skettenis return RDIError_NoError;
170b725ae77Skettenis return RDIError_Error; /* stop a pesky ANSI compiler warning */
171b725ae77Skettenis }
172b725ae77Skettenis
173b725ae77Skettenis
174b725ae77Skettenis /*
175b725ae77Skettenis * Handler and registration for logging messages from target
176b725ae77Skettenis */
TargetLogCallback(Packet * packet,void * state)177b725ae77Skettenis static void TargetLogCallback( Packet *packet, void *state )
178b725ae77Skettenis {
179b725ae77Skettenis p_Buffer reply = BUFFERDATA(packet->pk_buffer);
180b725ae77Skettenis unsigned int len = packet->pk_length;
181b725ae77Skettenis IGNORE(state);
182b725ae77Skettenis angel_hostif->write(angel_hostif->hostosarg,
183b725ae77Skettenis (char *)reply, len - CHAN_HEADER_SIZE);
184b725ae77Skettenis DevSW_FreePacket(packet);
185b725ae77Skettenis
186b725ae77Skettenis packet = DevSW_AllocatePacket(4); /* better not ask for 0 */
187b725ae77Skettenis /* the reply is the ACK - any contents are ignored */
188b725ae77Skettenis if (packet != NULL)
189b725ae77Skettenis Adp_ChannelWrite( CI_TLOG, packet );
190b725ae77Skettenis }
191b725ae77Skettenis
TargetLogInit(void)192b725ae77Skettenis static void TargetLogInit( void )
193b725ae77Skettenis {
194b725ae77Skettenis AdpErrs err = Adp_ChannelRegisterRead( CI_TLOG, TargetLogCallback, NULL );
195b725ae77Skettenis
196b725ae77Skettenis #ifdef DEBUG
197b725ae77Skettenis if (err != adp_ok)
198b725ae77Skettenis angel_DebugPrint("CI_TLOG RegisterRead failed %d\n", err);
199b725ae77Skettenis #else
200b725ae77Skettenis IGNORE(err);
201b725ae77Skettenis #endif
202b725ae77Skettenis }
203b725ae77Skettenis
204b725ae77Skettenis /*----------------------------------------------------------------------*/
205b725ae77Skettenis /*----angel_RDI_open-----------------------------------------------------*/
206b725ae77Skettenis /*----------------------------------------------------------------------*/
207b725ae77Skettenis
208b725ae77Skettenis typedef struct NegotiateState {
209b725ae77Skettenis bool negotiate_resp;
210b725ae77Skettenis bool negotiate_ack;
211b725ae77Skettenis bool link_check_resp;
212b725ae77Skettenis ParameterConfig *accepted_config;
213b725ae77Skettenis } NegotiateState;
214b725ae77Skettenis
receive_negotiate(Packet * packet,void * stateptr)215b725ae77Skettenis static void receive_negotiate(Packet *packet, void *stateptr)
216b725ae77Skettenis {
217b725ae77Skettenis unsigned reason, debugID, OSinfo1, OSinfo2, status;
218b725ae77Skettenis NegotiateState *n_state = (NegotiateState *)stateptr;
219b725ae77Skettenis p_Buffer reply = BUFFERDATA(packet->pk_buffer);
220b725ae77Skettenis
221b725ae77Skettenis unpack_message( reply, "%w%w%w%w",
222b725ae77Skettenis &reason, &debugID, &OSinfo1, &OSinfo2 );
223b725ae77Skettenis reply += ADP_DEFAULT_HEADER_SIZE;
224b725ae77Skettenis
225b725ae77Skettenis #ifdef DEBUG
226b725ae77Skettenis angel_DebugPrint( "receive_negotiate: reason %x\n", reason );
227b725ae77Skettenis #endif
228b725ae77Skettenis
229b725ae77Skettenis switch ( reason )
230b725ae77Skettenis {
231b725ae77Skettenis case ADP_ParamNegotiate | TtoH:
232b725ae77Skettenis {
233b725ae77Skettenis n_state->negotiate_resp = TRUE;
234b725ae77Skettenis
235b725ae77Skettenis status = GET32LE( reply );
236b725ae77Skettenis reply += sizeof(word);
237b725ae77Skettenis #ifdef DEBUG
238b725ae77Skettenis angel_DebugPrint( "ParamNegotiate status %u\n", status );
239b725ae77Skettenis #endif
240b725ae77Skettenis if ( status == RDIError_NoError )
241b725ae77Skettenis {
242b725ae77Skettenis if ( Angel_ReadParamConfigMessage(
243b725ae77Skettenis reply, n_state->accepted_config ) )
244b725ae77Skettenis n_state->negotiate_ack = TRUE;
245b725ae77Skettenis }
246b725ae77Skettenis break;
247b725ae77Skettenis }
248b725ae77Skettenis
249b725ae77Skettenis case ADP_LinkCheck | TtoH:
250b725ae77Skettenis {
251b725ae77Skettenis #ifdef DEBUG
252b725ae77Skettenis angel_DebugPrint( "PONG!\n" );
253b725ae77Skettenis #endif
254b725ae77Skettenis n_state->link_check_resp = TRUE;
255b725ae77Skettenis break;
256b725ae77Skettenis }
257b725ae77Skettenis
258b725ae77Skettenis default:
259b725ae77Skettenis {
260b725ae77Skettenis #ifdef DEBUG
261b725ae77Skettenis angel_DebugPrint( "Unexpected!\n" );
262b725ae77Skettenis #endif
263b725ae77Skettenis break;
264b725ae77Skettenis }
265b725ae77Skettenis }
266b725ae77Skettenis DevSW_FreePacket( packet );
267b725ae77Skettenis }
268b725ae77Skettenis
269b725ae77Skettenis # include <sys/types.h>
270b725ae77Skettenis #ifdef __unix
271b725ae77Skettenis # include <sys/time.h>
272b725ae77Skettenis #else
273b725ae77Skettenis # include <time.h>
274b725ae77Skettenis #endif
275b725ae77Skettenis
276b725ae77Skettenis /*
277b725ae77Skettenis * convert a config into a single-valued options list
278b725ae77Skettenis */
config_to_options(const ParameterConfig * config)279b725ae77Skettenis static ParameterOptions *config_to_options( const ParameterConfig *config )
280b725ae77Skettenis {
281b725ae77Skettenis unsigned int num_params;
282b725ae77Skettenis size_t size;
283b725ae77Skettenis ParameterOptions *base_p;
284b725ae77Skettenis
285b725ae77Skettenis num_params = config->num_parameters;
286b725ae77Skettenis size =
287b725ae77Skettenis sizeof(ParameterOptions)
288b725ae77Skettenis + num_params*(sizeof(ParameterList) + sizeof(unsigned int));
289b725ae77Skettenis base_p = malloc( size );
290b725ae77Skettenis
291b725ae77Skettenis if ( base_p != NULL )
292b725ae77Skettenis {
293b725ae77Skettenis unsigned int u;
294b725ae77Skettenis ParameterList *list_p =
295b725ae77Skettenis (ParameterList *)((char *)base_p + sizeof(ParameterOptions));
296b725ae77Skettenis unsigned int *option_p =
297b725ae77Skettenis (unsigned int *)(list_p + num_params);
298b725ae77Skettenis
299b725ae77Skettenis base_p->num_param_lists = num_params;
300b725ae77Skettenis base_p->param_list = list_p;
301b725ae77Skettenis
302b725ae77Skettenis for ( u = 0; u < num_params; ++u )
303b725ae77Skettenis {
304b725ae77Skettenis option_p[u] = config->param[u].value;
305b725ae77Skettenis list_p[u].type = config->param[u].type;
306b725ae77Skettenis list_p[u].num_options = 1;
307b725ae77Skettenis list_p[u].option = &option_p[u];
308b725ae77Skettenis }
309b725ae77Skettenis }
310b725ae77Skettenis
311b725ae77Skettenis return base_p;
312b725ae77Skettenis }
313b725ae77Skettenis
negotiate_params(const ParameterOptions * user_options)314b725ae77Skettenis static AdpErrs negotiate_params( const ParameterOptions *user_options )
315b725ae77Skettenis {
316b725ae77Skettenis Packet *packet;
317b725ae77Skettenis unsigned int count;
318b725ae77Skettenis static Parameter params[AP_NUM_PARAMS];
319b725ae77Skettenis static ParameterConfig accepted_config = { AP_NUM_PARAMS, params };
320b725ae77Skettenis
321b725ae77Skettenis time_t t;
322b725ae77Skettenis
323b725ae77Skettenis static volatile NegotiateState n_state;
324b725ae77Skettenis n_state.negotiate_resp = FALSE;
325b725ae77Skettenis n_state.negotiate_ack = FALSE;
326b725ae77Skettenis n_state.link_check_resp = FALSE;
327b725ae77Skettenis n_state.accepted_config = &accepted_config;
328b725ae77Skettenis
329b725ae77Skettenis #ifdef DEBUG
330b725ae77Skettenis angel_DebugPrint( "negotiate_params\n" );
331b725ae77Skettenis #endif
332b725ae77Skettenis
333b725ae77Skettenis Adp_ChannelRegisterRead( CI_HBOOT, receive_negotiate, (void *)&n_state );
334b725ae77Skettenis
335b725ae77Skettenis packet = (Packet *)DevSW_AllocatePacket(Armsd_BufferSize);
336b725ae77Skettenis count = msgbuild( BUFFERDATA(packet->pk_buffer), "%w%w%w%w",
337b725ae77Skettenis ADP_ParamNegotiate | HtoT, 0,
338b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown );
339b725ae77Skettenis count += Angel_BuildParamOptionsMessage(
340b725ae77Skettenis BUFFERDATA(packet->pk_buffer) + count, user_options );
341b725ae77Skettenis packet->pk_length = count;
342b725ae77Skettenis Adp_ChannelWriteAsync( CI_HBOOT, packet );
343b725ae77Skettenis
344b725ae77Skettenis #ifdef DEBUG
345b725ae77Skettenis angel_DebugPrint( "sent negotiate packet\n" );
346b725ae77Skettenis #endif
347b725ae77Skettenis
348b725ae77Skettenis t=time(NULL);
349b725ae77Skettenis
350b725ae77Skettenis do {
351b725ae77Skettenis Adp_AsynchronousProcessing(async_block_on_nothing);
352b725ae77Skettenis
353b725ae77Skettenis if ((time(NULL)-t) > ADP_INITIAL_TIMEOUT_PERIOD) {
354b725ae77Skettenis return adp_timeout_on_open;
355b725ae77Skettenis }
356b725ae77Skettenis } while ( ! n_state.negotiate_resp );
357b725ae77Skettenis
358b725ae77Skettenis if ( n_state.negotiate_ack )
359b725ae77Skettenis {
360b725ae77Skettenis /* select accepted config */
361b725ae77Skettenis Adp_Ioctl( DC_SET_PARAMS, (void *)n_state.accepted_config );
362b725ae77Skettenis
363b725ae77Skettenis /*
364b725ae77Skettenis * 960430 KWelton
365b725ae77Skettenis *
366b725ae77Skettenis * There is a race in the renegotiation protocol: the
367b725ae77Skettenis * target has to have had time to load new config before
368b725ae77Skettenis * we send the link check packet - insert a deliberate
369b725ae77Skettenis * pause (100ms) to give the target some time
370b725ae77Skettenis */
371b725ae77Skettenis Adp_delay(100000);
372b725ae77Skettenis
373b725ae77Skettenis /* do link check */
374b725ae77Skettenis msgsend( CI_HBOOT, "%w%w%w%w", ADP_LinkCheck | HtoT, 0,
375b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown );
376b725ae77Skettenis #ifdef DEBUG
377b725ae77Skettenis angel_DebugPrint("sent link check\n");
378b725ae77Skettenis #endif
379b725ae77Skettenis
380b725ae77Skettenis do {
381b725ae77Skettenis Adp_AsynchronousProcessing(async_block_on_read);
382b725ae77Skettenis } while ( ! n_state.link_check_resp );
383b725ae77Skettenis Adp_initSeq();
384b725ae77Skettenis }
385b725ae77Skettenis return adp_ok;
386b725ae77Skettenis }
387b725ae77Skettenis
388b725ae77Skettenis static int late_booted = FALSE;
389b725ae77Skettenis static bool ardi_handler_installed = FALSE;
390b725ae77Skettenis
391b725ae77Skettenis #ifdef __unix
392b725ae77Skettenis static struct sigaction old_action;
393b725ae77Skettenis #else
394b725ae77Skettenis static void (*old_handler)();
395b725ae77Skettenis #endif
396b725ae77Skettenis
397b725ae77Skettenis static bool boot_interrupted = FALSE;
398b725ae77Skettenis static volatile bool interrupt_request = FALSE;
399b725ae77Skettenis static volatile bool stop_request = FALSE;
400b725ae77Skettenis
ardi_sigint_handler(int sig)401b725ae77Skettenis static void ardi_sigint_handler(int sig) {
402b725ae77Skettenis #ifdef DEBUG
403b725ae77Skettenis if (sig != SIGINT)
404b725ae77Skettenis angel_DebugPrint("Expecting SIGINT got %d.\n", sig);
405b725ae77Skettenis #else
406b725ae77Skettenis IGNORE(sig);
407b725ae77Skettenis #endif
408b725ae77Skettenis boot_interrupted = TRUE;
409b725ae77Skettenis interrupt_request = TRUE;
410b725ae77Skettenis #ifndef __unix
411b725ae77Skettenis signal(SIGINT, ardi_sigint_handler);
412b725ae77Skettenis #endif
413b725ae77Skettenis }
414b725ae77Skettenis
install_ardi_handler(void)415b725ae77Skettenis static void install_ardi_handler( void ) {
416b725ae77Skettenis if (!ardi_handler_installed) {
417b725ae77Skettenis /* install a new Ctrl-C handler so we can abandon waiting */
418b725ae77Skettenis #ifdef __unix
419b725ae77Skettenis struct sigaction new_action;
420b725ae77Skettenis sigemptyset(&new_action.sa_mask);
421b725ae77Skettenis new_action.sa_handler = ardi_sigint_handler;
422b725ae77Skettenis new_action.sa_flags = 0;
423b725ae77Skettenis sigaction(SIGINT, &new_action, &old_action);
424b725ae77Skettenis #else
425b725ae77Skettenis old_handler = signal(SIGINT, ardi_sigint_handler);
426b725ae77Skettenis #endif
427b725ae77Skettenis ardi_handler_installed = TRUE;
428b725ae77Skettenis }
429b725ae77Skettenis }
430b725ae77Skettenis
431b725ae77Skettenis static int angel_RDI_errmess(char *buf, int blen, int errnum);
432b725ae77Skettenis
receive_reset_acknowledge(Packet * packet,void * stateptr)433b725ae77Skettenis static void receive_reset_acknowledge(Packet *packet, void *stateptr) {
434b725ae77Skettenis unsigned reason, debugID, OSinfo1, OSinfo2, status;
435b725ae77Skettenis IGNORE(stateptr);
436b725ae77Skettenis
437b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", &reason, &debugID,
438b725ae77Skettenis &OSinfo1, &OSinfo2, &status);
439b725ae77Skettenis if (reason==(ADP_Reset | TtoH) && status==AB_NORMAL_ACK) {
440b725ae77Skettenis #ifdef DEBUG
441b725ae77Skettenis angel_DebugPrint("DEBUG: Successfully received normal reset acknowledgement\n");
442b725ae77Skettenis late_booted = FALSE;
443b725ae77Skettenis #endif
444b725ae77Skettenis } else if (reason==(ADP_Reset | TtoH) && status==AB_LATE_ACK) {
445b725ae77Skettenis char late_msg[AdpMessLen_LateStartup];
446b725ae77Skettenis int late_len;
447b725ae77Skettenis #ifdef DEBUG
448b725ae77Skettenis angel_DebugPrint("DEBUG: Successfully received LATE reset acknowledgement\n");
449b725ae77Skettenis #endif
450b725ae77Skettenis late_booted = TRUE;
451b725ae77Skettenis install_ardi_handler();
452b725ae77Skettenis late_len = angel_RDI_errmess(late_msg,
453b725ae77Skettenis AdpMessLen_LateStartup, adp_late_startup);
454b725ae77Skettenis angel_hostif->write(angel_hostif->hostosarg, late_msg, late_len);
455b725ae77Skettenis } else {
456b725ae77Skettenis #ifdef DEBUG
457b725ae77Skettenis angel_DebugPrint("DEBUG: Bad reset ack: reason=%8X, status=%8X\n", reason, status);
458b725ae77Skettenis #endif
459b725ae77Skettenis }
460b725ae77Skettenis DevSW_FreePacket(packet);
461b725ae77Skettenis }
462b725ae77Skettenis
463b725ae77Skettenis static int booted_not_received;
464b725ae77Skettenis static unsigned int angel_version;
465b725ae77Skettenis static unsigned int adp_version;
466b725ae77Skettenis static unsigned int arch_info;
467b725ae77Skettenis static unsigned int cpu_info;
468b725ae77Skettenis static unsigned int hw_status;
469b725ae77Skettenis
receive_booted(Packet * packet,void * stateptr)470b725ae77Skettenis static void receive_booted(Packet *packet, void *stateptr) {
471b725ae77Skettenis unsigned reason, debugID, OSinfo1, OSinfo2, banner_length, bufsiz, longsiz;
472b725ae77Skettenis unsigned i, count;
473b725ae77Skettenis
474b725ae77Skettenis IGNORE(stateptr);
475b725ae77Skettenis
476b725ae77Skettenis count = unpack_message(BUFFERDATA(packet->pk_buffer),
477b725ae77Skettenis "%w%w%w%w%w%w%w%w%w%w%w%w",
478b725ae77Skettenis &reason, &debugID, &OSinfo1, &OSinfo2, &bufsiz, &longsiz,
479b725ae77Skettenis &angel_version, &adp_version,
480b725ae77Skettenis &arch_info, &cpu_info, &hw_status, &banner_length);
481b725ae77Skettenis if (reason==(ADP_Booted | TtoH)) {
482b725ae77Skettenis #ifdef MONITOR_DOWNLOAD_PACKETS
483b725ae77Skettenis angel_DebugPrint("DEBUG: Successfully received Booted\n");
484b725ae77Skettenis angel_DebugPrint(" cpu_info=%8X, hw_status=%8X, bufsiz=%d, longsiz=%d\n",
485b725ae77Skettenis cpu_info, hw_status, bufsiz, longsiz);
486b725ae77Skettenis #endif
487b725ae77Skettenis /* Get the banner from the booted message */
488b725ae77Skettenis for (i=0; i<banner_length; i++)
489b725ae77Skettenis angel_hostif->writec(angel_hostif->hostosarg,
490b725ae77Skettenis (BUFFERDATA(packet->pk_buffer)+count)[i]);
491b725ae77Skettenis
492b725ae77Skettenis booted_not_received=0;
493b725ae77Skettenis #ifndef NO_HEARTBEAT
494b725ae77Skettenis heartbeat_enabled = TRUE;
495b725ae77Skettenis #endif
496b725ae77Skettenis Armsd_BufferSize = bufsiz + CHAN_HEADER_SIZE;
497b725ae77Skettenis Armsd_LongBufSize = longsiz + CHAN_HEADER_SIZE;
498b725ae77Skettenis } else {
499b725ae77Skettenis #ifdef DEBUG
500b725ae77Skettenis angel_DebugPrint("DEBUG: Bad Booted msg: reason=%8X\n", reason);
501b725ae77Skettenis #endif
502b725ae77Skettenis }
503b725ae77Skettenis DevSW_FreePacket(packet);
504b725ae77Skettenis }
505b725ae77Skettenis
506b725ae77Skettenis
507b725ae77Skettenis /* forward declaration */
508b725ae77Skettenis static int angel_negotiate_defaults( void );
509b725ae77Skettenis
510b725ae77Skettenis /* Open communications. */
angel_RDI_open(unsigned type,Dbg_ConfigBlock const * config,Dbg_HostosInterface const * hostif,struct Dbg_MCState * dbg_state)511b725ae77Skettenis int angel_RDI_open(
512b725ae77Skettenis unsigned type, Dbg_ConfigBlock const *config,
513b725ae77Skettenis Dbg_HostosInterface const *hostif, struct Dbg_MCState *dbg_state)
514b725ae77Skettenis {
515b725ae77Skettenis Packet *packet;
516b725ae77Skettenis int status, reasoncode, debugID, OSinfo1, OSinfo2, err;
517b725ae77Skettenis ParameterOptions *user_options = NULL;
518b725ae77Skettenis
519b725ae77Skettenis time_t t;
520b725ae77Skettenis
521b725ae77Skettenis IGNORE( dbg_state );
522b725ae77Skettenis
523b725ae77Skettenis if ((type & 1) == 0) {
524b725ae77Skettenis /* cold start */
525b725ae77Skettenis if (hostif != NULL) {
526b725ae77Skettenis angel_hostif = hostif;
527b725ae77Skettenis err = HostSysInit(hostif, &ardi_commandline, &hstate);
528b725ae77Skettenis if (err != RDIError_NoError) {
529b725ae77Skettenis #ifdef DEBUG
530b725ae77Skettenis angel_DebugPrint("DEBUG: HostSysInit error %i\n",err);
531b725ae77Skettenis #endif
532b725ae77Skettenis return err;
533b725ae77Skettenis }
534b725ae77Skettenis }
535b725ae77Skettenis TargetLogInit();
536b725ae77Skettenis }
537b725ae77Skettenis
538b725ae77Skettenis #ifdef DEBUG
539b725ae77Skettenis angel_DebugPrint("DEBUG: Buffer allocated in angel_RDI_open(type=%i).\n",type);
540b725ae77Skettenis #endif
541b725ae77Skettenis
542b725ae77Skettenis if ((type & 1) == 0) {
543b725ae77Skettenis /* cold start */
544b725ae77Skettenis unsigned endian;
545b725ae77Skettenis Adp_Ioctl( DC_GET_USER_PARAMS, (void *)&user_options );
546b725ae77Skettenis if ( user_options != NULL ) {
547b725ae77Skettenis err = negotiate_params( user_options );
548b725ae77Skettenis if (err != adp_ok) return err;
549b725ae77Skettenis }
550b725ae77Skettenis else {
551b725ae77Skettenis ParameterConfig *default_config = NULL;
552b725ae77Skettenis Adp_Ioctl( DC_GET_DEFAULT_PARAMS, (void *)&default_config );
553b725ae77Skettenis if ( default_config != NULL ) {
554b725ae77Skettenis ParameterOptions *default_options = config_to_options(default_config);
555b725ae77Skettenis err = negotiate_params( default_options );
556b725ae77Skettenis if (err != adp_ok) return err;
557b725ae77Skettenis }
558b725ae77Skettenis }
559b725ae77Skettenis
560b725ae77Skettenis /* Register handlers before sending any messages */
561b725ae77Skettenis booted_not_received=1;
562b725ae77Skettenis Adp_ChannelRegisterRead(CI_HBOOT, receive_reset_acknowledge, NULL);
563b725ae77Skettenis Adp_ChannelRegisterRead(CI_TBOOT, receive_booted, NULL);
564b725ae77Skettenis endian = 0;
565b725ae77Skettenis if (config!=NULL) {
566b725ae77Skettenis if (config->bytesex & RDISex_Little) endian |= ADP_BootHostFeature_LittleEnd;
567b725ae77Skettenis if (config->bytesex & RDISex_Big) endian |= ADP_BootHostFeature_BigEnd;
568b725ae77Skettenis }
569b725ae77Skettenis msgsend(CI_HBOOT,"%w%w%w%w%w", ADP_Reset | HtoT, 0,
570b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, endian);
571b725ae77Skettenis #ifdef DEBUG
572b725ae77Skettenis angel_DebugPrint("DEBUG: Transmitted Reset message in angel_RDI_open.\n");
573b725ae77Skettenis #endif
574b725ae77Skettenis
575b725ae77Skettenis /* We will now either get an acknowledgement for the Reset message
576b725ae77Skettenis * or if the target was started after the host, we will get a
577b725ae77Skettenis * rebooted message first.
578b725ae77Skettenis */
579b725ae77Skettenis
580b725ae77Skettenis #ifdef DEBUG
581b725ae77Skettenis angel_DebugPrint("DEBUG: waiting for a booted message\n");
582b725ae77Skettenis #endif
583b725ae77Skettenis
584b725ae77Skettenis {
585b725ae77Skettenis boot_interrupted = FALSE;
586b725ae77Skettenis
587b725ae77Skettenis if (late_booted)
588b725ae77Skettenis install_ardi_handler();
589b725ae77Skettenis
590b725ae77Skettenis t=time(NULL);
591b725ae77Skettenis
592b725ae77Skettenis do {
593b725ae77Skettenis Adp_AsynchronousProcessing(async_block_on_nothing);
594b725ae77Skettenis if ((time(NULL)-t) > ADP_INITIAL_TIMEOUT_PERIOD && !late_booted) {
595b725ae77Skettenis return adp_timeout_on_open;
596b725ae77Skettenis }
597b725ae77Skettenis } while (booted_not_received && !boot_interrupted);
598b725ae77Skettenis
599b725ae77Skettenis if (ardi_handler_installed)
600b725ae77Skettenis {
601b725ae77Skettenis /* uninstall our Ctrl-C handler */
602b725ae77Skettenis #ifdef __unix
603b725ae77Skettenis sigaction(SIGINT, &old_action, NULL);
604b725ae77Skettenis #else
605b725ae77Skettenis signal(SIGINT, old_handler);
606b725ae77Skettenis #endif
607b725ae77Skettenis }
608b725ae77Skettenis
609b725ae77Skettenis if (boot_interrupted) {
610b725ae77Skettenis angel_negotiate_defaults();
611b725ae77Skettenis return adp_abandon_boot_wait;
612b725ae77Skettenis }
613b725ae77Skettenis }
614b725ae77Skettenis
615b725ae77Skettenis booted_not_received=1;
616b725ae77Skettenis Adp_ChannelRegisterRead(CI_HBOOT, NULL, NULL);
617b725ae77Skettenis
618b725ae77Skettenis /* Leave the booted handler installed */
619b725ae77Skettenis msgsend(CI_TBOOT, "%w%w%w%w%w", ADP_Booted | HtoT, 0,
620b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, 0);
621b725ae77Skettenis Adp_initSeq();
622b725ae77Skettenis #ifdef DEBUG
623b725ae77Skettenis angel_DebugPrint("DEBUG: Transmitted ADP_Booted acknowledgement.\n");
624b725ae77Skettenis angel_DebugPrint("DEBUG: Boot sequence completed, leaving angel_RDI_open.\n");
625b725ae77Skettenis #endif
626b725ae77Skettenis
627b725ae77Skettenis return (hw_status & ADP_CPU_BigEndian )? RDIError_BigEndian :
628b725ae77Skettenis RDIError_LittleEndian;
629b725ae77Skettenis }
630b725ae77Skettenis else {
631b725ae77Skettenis /* warm start */
632b725ae77Skettenis register_debug_message_handler();
633b725ae77Skettenis
634b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w",
635b725ae77Skettenis ADP_InitialiseApplication | HtoT, 0,
636b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown);
637b725ae77Skettenis #ifdef DEBUG
638b725ae77Skettenis angel_DebugPrint("DEBUG: Transmitted Initialise Application\n");
639b725ae77Skettenis #endif
640b725ae77Skettenis reasoncode=ADP_InitialiseApplication | TtoH;
641b725ae77Skettenis err = wait_for_debug_message(&reasoncode, &debugID, &OSinfo1, &OSinfo2,
642b725ae77Skettenis &status, &packet);
643b725ae77Skettenis if (err != RDIError_NoError) return err;
644b725ae77Skettenis return status;
645b725ae77Skettenis }
646b725ae77Skettenis return -1;
647b725ae77Skettenis }
648b725ae77Skettenis
649b725ae77Skettenis
650b725ae77Skettenis /*----------------------------------------------------------------------*/
651b725ae77Skettenis /*----angel_RDI_close----------------------------------------------------*/
652b725ae77Skettenis /*----------------------------------------------------------------------*/
653b725ae77Skettenis
angel_negotiate_defaults(void)654b725ae77Skettenis static int angel_negotiate_defaults( void ) {
655b725ae77Skettenis int err = adp_ok;
656b725ae77Skettenis ParameterConfig *default_config = NULL;
657b725ae77Skettenis Adp_Ioctl( DC_GET_DEFAULT_PARAMS, (void *)&default_config );
658b725ae77Skettenis if ( default_config != NULL ) {
659b725ae77Skettenis ParameterOptions *default_options = config_to_options(default_config);
660b725ae77Skettenis err = negotiate_params( default_options );
661b725ae77Skettenis free( default_options );
662b725ae77Skettenis }
663b725ae77Skettenis return err;
664b725ae77Skettenis }
665b725ae77Skettenis
angel_RDI_close(void)666b725ae77Skettenis int angel_RDI_close(void) {
667b725ae77Skettenis /*Angel host exit */
668b725ae77Skettenis int err;
669b725ae77Skettenis int status,debugID, OSinfo1,OSinfo2;
670b725ae77Skettenis int reason;
671b725ae77Skettenis Packet *packet = NULL;;
672b725ae77Skettenis #ifdef DEBUG
673b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_Close.\n");
674b725ae77Skettenis #endif
675b725ae77Skettenis
676b725ae77Skettenis register_debug_message_handler();
677b725ae77Skettenis
678b725ae77Skettenis heartbeat_enabled = FALSE;
679b725ae77Skettenis
680b725ae77Skettenis err = msgsend(CI_HADP,"%w%w%w%w",ADP_End | HtoT,0,
681b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown);
682b725ae77Skettenis if (err != RDIError_NoError) return err;
683b725ae77Skettenis reason = ADP_End | TtoH;
684b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
685b725ae77Skettenis &status, &packet);
686b725ae77Skettenis DevSW_FreePacket(packet);
687b725ae77Skettenis if (err != RDIError_NoError) return err;
688b725ae77Skettenis if (status == RDIError_NoError) {
689b725ae77Skettenis err = angel_negotiate_defaults();
690b725ae77Skettenis if (err != adp_ok) return err;
691b725ae77Skettenis Adp_Ioctl( DC_RESET, NULL ); /* just to be safe */
692b725ae77Skettenis return HostSysExit(hstate);
693b725ae77Skettenis }
694b725ae77Skettenis else
695b725ae77Skettenis return status;
696b725ae77Skettenis }
697b725ae77Skettenis
698b725ae77Skettenis
699b725ae77Skettenis /*----------------------------------------------------------------------*/
700b725ae77Skettenis /*----angel_RDI_read-----------------------------------------------------*/
701b725ae77Skettenis /*----------------------------------------------------------------------*/
702b725ae77Skettenis
703b725ae77Skettenis /* Read memory contents from target to host: use ADP_Read */
angel_RDI_read(ARMword source,void * dest,unsigned * nbytes)704b725ae77Skettenis int angel_RDI_read(ARMword source, void *dest, unsigned *nbytes)
705b725ae77Skettenis {
706b725ae77Skettenis Packet *packet=NULL;
707b725ae77Skettenis int len; /* Integer to hold message length. */
708b725ae77Skettenis unsigned int nbtogo = *nbytes, nbinpacket, nbdone=0;
709b725ae77Skettenis int rnbytes = 0, status, reason, debugID, OSinfo1, OSinfo2, err;
710b725ae77Skettenis unsigned int maxlen = Armsd_BufferSize-CHAN_HEADER_SIZE-ADP_ReadHeaderSize;
711b725ae77Skettenis
712b725ae77Skettenis /* Print debug trace information, this is just copied straight from rdi.c
713b725ae77Skettenis and I can see no reason why it should have to be changed. */
714b725ae77Skettenis TracePrint(("angel_RDI_read: source=%.8lx dest=%p nbytes=%.8x\n",
715b725ae77Skettenis (unsigned long)source, dest, *nbytes));
716b725ae77Skettenis if (*nbytes == 0) return RDIError_NoError; /* Read nothing - easy! */
717b725ae77Skettenis /* check the buffer size */
718b725ae77Skettenis while (nbtogo >0) {
719b725ae77Skettenis register_debug_message_handler();
720b725ae77Skettenis
721b725ae77Skettenis nbinpacket = (nbtogo <= maxlen) ? nbtogo : maxlen;
722b725ae77Skettenis len = msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_Read | HtoT, 0,
723b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, source+nbdone,
724b725ae77Skettenis nbinpacket);
725b725ae77Skettenis reason=ADP_Read | TtoH;
726b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
727b725ae77Skettenis &status, &packet);
728b725ae77Skettenis TracePrint(("angel_RDI_read: nbinpacket =%d status=%08x err = %d\n",
729b725ae77Skettenis nbinpacket,status,err));
730b725ae77Skettenis if (err != RDIError_NoError) return err; /* Was there an error? */
731b725ae77Skettenis if (status == RDIError_NoError){
732b725ae77Skettenis rnbytes += PREAD(LE,(unsigned int *)(BUFFERDATA(packet->pk_buffer)+20));
733b725ae77Skettenis TracePrint(("angel_RDI_read: rnbytes = %d\n",rnbytes));
734b725ae77Skettenis memcpy(((unsigned char *)dest)+nbdone, BUFFERDATA(packet->pk_buffer)+24,
735b725ae77Skettenis nbinpacket);
736b725ae77Skettenis }
737b725ae77Skettenis nbdone += nbinpacket;
738b725ae77Skettenis nbtogo -= nbinpacket;
739b725ae77Skettenis }
740b725ae77Skettenis *nbytes -= rnbytes;
741b725ae77Skettenis return status;
742b725ae77Skettenis }
743b725ae77Skettenis
744b725ae77Skettenis
745b725ae77Skettenis /*----------------------------------------------------------------------*/
746b725ae77Skettenis /*----angel_RDI_write----------------------------------------------------*/
747b725ae77Skettenis /*----------------------------------------------------------------------*/
748b725ae77Skettenis
749b725ae77Skettenis /* Transfer memory block from host to target. Use ADP_Write>. */
angel_RDI_write(const void * source,ARMword dest,unsigned * nbytes)750b725ae77Skettenis int angel_RDI_write(const void *source, ARMword dest, unsigned *nbytes)
751b725ae77Skettenis {
752b725ae77Skettenis Packet *packet;/* Message buffers. */
753b725ae77Skettenis unsigned int len, nbtogo = *nbytes, nboffset = 0, nbinpacket;
754b725ae77Skettenis int status, reason, debugID, OSinfo1, OSinfo2, err;
755b725ae77Skettenis unsigned int maxlen = Armsd_LongBufSize-CHAN_HEADER_SIZE-ADP_WriteHeaderSize;
756b725ae77Skettenis
757b725ae77Skettenis TracePrint(("angel_RDI_write: source=%p dest=%.8lx nbytes=%.8x\n",
758b725ae77Skettenis source, (unsigned long)dest, *nbytes));
759b725ae77Skettenis
760b725ae77Skettenis if (*nbytes == 0) return RDIError_NoError;
761b725ae77Skettenis
762b725ae77Skettenis *nbytes = 0;
763b725ae77Skettenis while (nbtogo > 0) {
764b725ae77Skettenis packet = (Packet *) DevSW_AllocatePacket(Armsd_LongBufSize);
765b725ae77Skettenis nbinpacket = (nbtogo <= maxlen) ? nbtogo : maxlen;
766b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w",
767b725ae77Skettenis ADP_Write | HtoT, 0, ADP_HandleUnknown,
768b725ae77Skettenis ADP_HandleUnknown, dest+nboffset, nbinpacket);
769b725ae77Skettenis /* Copy the data into the packet. */
770b725ae77Skettenis
771b725ae77Skettenis memcpy(BUFFERDATA(packet->pk_buffer)+len,
772b725ae77Skettenis ((const unsigned char *) source)+nboffset, nbinpacket);
773b725ae77Skettenis nboffset += nbinpacket;
774b725ae77Skettenis packet->pk_length = nbinpacket+len;
775b725ae77Skettenis
776b725ae77Skettenis #ifdef MONITOR_DOWNLOAD_PACKETS
777b725ae77Skettenis angel_DebugPrint("angel_RDI_write packet size=%i, bytes done=%i\n",
778b725ae77Skettenis nbinpacket, nboffset);
779b725ae77Skettenis #endif
780b725ae77Skettenis
781b725ae77Skettenis register_debug_message_handler();
782b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet);
783b725ae77Skettenis reason=ADP_Write | TtoH;
784b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
785b725ae77Skettenis &status, &packet);
786b725ae77Skettenis nbtogo -= nbinpacket;
787b725ae77Skettenis if (err != RDIError_NoError) return err;
788b725ae77Skettenis if (status == RDIError_NoError)
789b725ae77Skettenis *nbytes += nbinpacket;
790b725ae77Skettenis
791b725ae77Skettenis DevSW_FreePacket(packet);
792b725ae77Skettenis }
793b725ae77Skettenis return status;
794b725ae77Skettenis }
795b725ae77Skettenis
796b725ae77Skettenis
797b725ae77Skettenis /*----------------------------------------------------------------------*/
798b725ae77Skettenis /*----angel_RDI_CPUread--------------------------------------------------*/
799b725ae77Skettenis /*----------------------------------------------------------------------*/
800b725ae77Skettenis
801b725ae77Skettenis /* Reads the values of registers in the CPU, uses ADP_CPUwrite. */
angel_RDI_CPUread(unsigned mode,unsigned long mask,ARMword * buffer)802b725ae77Skettenis int angel_RDI_CPUread(unsigned mode, unsigned long mask, ARMword *buffer)
803b725ae77Skettenis {
804b725ae77Skettenis unsigned int i, j;
805b725ae77Skettenis Packet *packet = NULL;
806b725ae77Skettenis int err, status, reason, debugID, OSinfo1, OSinfo2;
807b725ae77Skettenis #ifdef DEBUG
808b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_CPUread.\n");
809b725ae77Skettenis #endif
810b725ae77Skettenis for (i=0, j=0 ; i < RDINumCPURegs ; i++)
811b725ae77Skettenis if (mask & (1L << i)) j++; /* Count the number of registers. */
812b725ae77Skettenis
813b725ae77Skettenis register_debug_message_handler();
814b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%c%w", ADP_CPUread | HtoT, 0,
815b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, mode, mask);
816b725ae77Skettenis reason = ADP_CPUread | TtoH;
817b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
818b725ae77Skettenis &status, &packet);
819b725ae77Skettenis if (err != RDIError_NoError) {
820b725ae77Skettenis DevSW_FreePacket(packet);
821b725ae77Skettenis return err;
822b725ae77Skettenis }
823b725ae77Skettenis if(status == RDIError_NoError) {
824b725ae77Skettenis for (i=0; i<j; i++)
825b725ae77Skettenis buffer[i] = GET32LE(BUFFERDATA(packet->pk_buffer)+20+(i*4));
826b725ae77Skettenis TracePrint(("angel_RDI_CPUread: mode=%.8x mask=%.8lx", mode, mask));
827b725ae77Skettenis DevSW_FreePacket(packet);
828b725ae77Skettenis #ifdef RDI_VERBOSE
829b725ae77Skettenis if (rdi_log & 1) {
830b725ae77Skettenis unsigned k;
831b725ae77Skettenis for (k = 0, j = 0 ; j <= 20 ; j++)
832b725ae77Skettenis if (mask & (1L << j)) {
833b725ae77Skettenis angel_DebugPrint("%c%.8lx",k%4==0?'\n':' ',
834b725ae77Skettenis (unsigned long)buffer[k]);
835b725ae77Skettenis k++ ;
836b725ae77Skettenis }
837b725ae77Skettenis angel_DebugPrint("\n") ;
838b725ae77Skettenis }
839b725ae77Skettenis #endif
840b725ae77Skettenis
841b725ae77Skettenis }
842b725ae77Skettenis return status;
843b725ae77Skettenis }
844b725ae77Skettenis
845b725ae77Skettenis /*----------------------------------------------------------------------*/
846b725ae77Skettenis /*----angel_RDI_CPUwrite-------------------------------------------------*/
847b725ae77Skettenis /*----------------------------------------------------------------------*/
848b725ae77Skettenis
849b725ae77Skettenis /* Write CPU registers: use ADP_CPUwrite. */
angel_RDI_CPUwrite(unsigned mode,unsigned long mask,ARMword const * buffer)850b725ae77Skettenis int angel_RDI_CPUwrite(unsigned mode, unsigned long mask,
851b725ae77Skettenis ARMword const *buffer){
852b725ae77Skettenis
853b725ae77Skettenis unsigned i, j, c;
854b725ae77Skettenis Packet *packet;
855b725ae77Skettenis int status, reason, debugID, OSinfo1, OSinfo2, err, len;
856b725ae77Skettenis
857b725ae77Skettenis TracePrint(("angel_RDI_CPUwrite: mode=%.8x mask=%.8lx", mode, mask));
858b725ae77Skettenis #ifdef RDI_VERBOSE
859b725ae77Skettenis if (rdi_log & 1) {
860b725ae77Skettenis for (j = 0, i = 0 ; i <= 20 ; i++)
861b725ae77Skettenis if (mask & (1L << i)) {
862b725ae77Skettenis angel_DebugPrint("%c%.8lx",j%4==0?'\n':' ',
863b725ae77Skettenis (unsigned long)buffer[j]);
864b725ae77Skettenis j++ ;
865b725ae77Skettenis }
866b725ae77Skettenis angel_DebugPrint("\n") ;
867b725ae77Skettenis }
868b725ae77Skettenis #endif
869b725ae77Skettenis packet = (Packet *)DevSW_AllocatePacket(Armsd_BufferSize);
870b725ae77Skettenis for (i=0, j=0; i < RDINumCPURegs ; i++)
871b725ae77Skettenis if (mask & (1L << i)) j++; /* count the number of registers */
872b725ae77Skettenis
873b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%b%w",
874b725ae77Skettenis ADP_CPUwrite | HtoT, 0,
875b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, mode, mask);
876b725ae77Skettenis for(c=0; c<j; c++)
877b725ae77Skettenis PUT32LE(BUFFERDATA(packet->pk_buffer)+len+(c*4), buffer[c]);
878b725ae77Skettenis packet->pk_length = len+(j*4);
879b725ae77Skettenis register_debug_message_handler();
880b725ae77Skettenis
881b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet);
882b725ae77Skettenis reason = ADP_CPUwrite | TtoH;
883b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
884b725ae77Skettenis &status, &packet);
885b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", &reason, &debugID,
886b725ae77Skettenis &OSinfo1, &OSinfo2, &status);
887b725ae77Skettenis DevSW_FreePacket(packet);
888b725ae77Skettenis if (err != RDIError_NoError)
889b725ae77Skettenis return err; /* Was there an error? */
890b725ae77Skettenis else
891b725ae77Skettenis return status;
892b725ae77Skettenis }
893b725ae77Skettenis
894b725ae77Skettenis
895b725ae77Skettenis /*----------------------------------------------------------------------*/
896b725ae77Skettenis /*----angel_RDI_CPread---------------------------------------------------*/
897b725ae77Skettenis /*----------------------------------------------------------------------*/
898b725ae77Skettenis
899b725ae77Skettenis /* Read coprocessor's internal state. See dbg_cp.h for help.
900b725ae77Skettenis * Use ADP_CPRead.
901b725ae77Skettenis * It would appear that the correct behaviour at this point is to leave
902b725ae77Skettenis * the unpacking to a the caller and to simply copy the stream of data
903b725ae77Skettenis * words into the buffer
904b725ae77Skettenis */
905b725ae77Skettenis
angel_RDI_CPread(unsigned CPnum,unsigned long mask,ARMword * buffer)906b725ae77Skettenis int angel_RDI_CPread(unsigned CPnum, unsigned long mask, ARMword *buffer){
907b725ae77Skettenis Packet *packet = NULL;
908b725ae77Skettenis int i, j, status, reasoncode, OSinfo1, OSinfo2, err, debugID;
909b725ae77Skettenis unsigned char *rmap = cpwords[CPnum];
910b725ae77Skettenis int n;
911b725ae77Skettenis #ifdef DEBUG
912b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_CPread.\n");
913b725ae77Skettenis #endif
914b725ae77Skettenis if (rmap == NULL) return RDIError_UnknownCoPro;
915b725ae77Skettenis
916b725ae77Skettenis register_debug_message_handler();
917b725ae77Skettenis n = rmap[-1];
918b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%b%w", ADP_CPread | HtoT, 0,
919b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, CPnum, mask);
920b725ae77Skettenis reasoncode=ADP_CPread | TtoH;
921b725ae77Skettenis err = wait_for_debug_message(&reasoncode, &debugID, &OSinfo1, &OSinfo2,
922b725ae77Skettenis &status, &packet);
923b725ae77Skettenis if (err != RDIError_NoError) {
924b725ae77Skettenis DevSW_FreePacket(packet);
925b725ae77Skettenis return err; /* Was there an error? */
926b725ae77Skettenis }
927b725ae77Skettenis for (j=i=0; i < n ; i++) /* count the number of registers */
928b725ae77Skettenis if (mask & (1L << i)) {
929b725ae77Skettenis j++;
930b725ae77Skettenis }
931b725ae77Skettenis for (i=0; i<j; i++)
932b725ae77Skettenis buffer[i] = PREAD32(LE, BUFFERDATA(packet->pk_buffer) + 20 + (i*4));
933b725ae77Skettenis DevSW_FreePacket(packet);
934b725ae77Skettenis TracePrint(("angel_RDI_CPread: CPnum=%.8x mask=%.8lx\n", CPnum, mask));
935b725ae77Skettenis #ifdef RDI_VERBOSE
936b725ae77Skettenis if (rdi_log & 1) {
937b725ae77Skettenis for (i = 0, j = 0; j < n ; j++) {
938b725ae77Skettenis if (mask & (1L << j)) {
939b725ae77Skettenis int nw = rmap[j];
940b725ae77Skettenis angel_DebugPrint("%2d ", j);
941b725ae77Skettenis while (--nw > 0)
942b725ae77Skettenis angel_DebugPrint("%.8lx ", (unsigned long)buffer[i++]);
943b725ae77Skettenis angel_DebugPrint("%.8lx\n", (unsigned long)buffer[i++]);
944b725ae77Skettenis }
945b725ae77Skettenis }
946b725ae77Skettenis }
947b725ae77Skettenis #endif
948b725ae77Skettenis return status;
949b725ae77Skettenis }
950b725ae77Skettenis
951b725ae77Skettenis
952b725ae77Skettenis /*----------------------------------------------------------------------*/
953b725ae77Skettenis /*----angel_RDI_CPwrite--------------------------------------------------*/
954b725ae77Skettenis /*----------------------------------------------------------------------*/
955b725ae77Skettenis
956b725ae77Skettenis /* Write coprocessor's internal state. See dbg_cp.h for help. Use
957b725ae77Skettenis * ADP_CPwrite.
958b725ae77Skettenis */
959b725ae77Skettenis
angel_RDI_CPwrite(unsigned CPnum,unsigned long mask,ARMword const * buffer)960b725ae77Skettenis int angel_RDI_CPwrite(unsigned CPnum, unsigned long mask,
961b725ae77Skettenis ARMword const *buffer)
962b725ae77Skettenis {
963b725ae77Skettenis Packet *packet = NULL;
964b725ae77Skettenis int i, j, len, status, reason, OSinfo1, OSinfo2, err, debugID;
965b725ae77Skettenis unsigned char *rmap = cpwords[CPnum];
966b725ae77Skettenis int n;
967b725ae77Skettenis
968b725ae77Skettenis if (rmap == NULL) return RDIError_UnknownCoPro;
969b725ae77Skettenis n = rmap[-1];
970b725ae77Skettenis
971b725ae77Skettenis TracePrint(("angel_RDI_CPwrite: CPnum=%d mask=%.8lx\n", CPnum, mask));
972b725ae77Skettenis
973b725ae77Skettenis #ifdef RDI_VERBOSE
974b725ae77Skettenis if (rdi_log & 1) {
975b725ae77Skettenis for (i = 0, j = 0; j < n ; j++)
976b725ae77Skettenis if (mask & (1L << j)) {
977b725ae77Skettenis int nw = rmap[j];
978b725ae77Skettenis angel_DebugPrint("%2d ", j);
979b725ae77Skettenis while (--nw > 0)
980b725ae77Skettenis angel_DebugPrint("%.8lx ", (unsigned long)buffer[i++]);
981b725ae77Skettenis angel_DebugPrint("%.8lx\n", (unsigned long)buffer[i++]);
982b725ae77Skettenis }
983b725ae77Skettenis }
984b725ae77Skettenis #endif
985b725ae77Skettenis
986b725ae77Skettenis for (j=i=0; i < n ; i++) /* Count the number of registers. */
987b725ae77Skettenis if (mask & (1L << i)) j++;
988b725ae77Skettenis packet = DevSW_AllocatePacket(Armsd_BufferSize);
989b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%c%w",
990b725ae77Skettenis ADP_CPwrite | HtoT, 0,
991b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, CPnum, mask);
992b725ae77Skettenis for(i=0; i<j; i++)
993b725ae77Skettenis len+=msgbuild(BUFFERDATA(packet->pk_buffer) + len, "%w", buffer[i]);
994b725ae77Skettenis packet->pk_length = len;
995b725ae77Skettenis register_debug_message_handler();
996b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet); /* Transmit message. */
997b725ae77Skettenis reason=ADP_CPwrite | TtoH;
998b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
999b725ae77Skettenis &status, &packet);
1000b725ae77Skettenis DevSW_FreePacket(packet);
1001b725ae77Skettenis if (err != RDIError_NoError)
1002b725ae77Skettenis return err;
1003b725ae77Skettenis else
1004b725ae77Skettenis return status;
1005b725ae77Skettenis }
1006b725ae77Skettenis
1007b725ae77Skettenis
1008b725ae77Skettenis /*----------------------------------------------------------------------*/
1009b725ae77Skettenis /*----angel_RDI_pointinq-------------------------------------------------*/
1010b725ae77Skettenis /*----------------------------------------------------------------------*/
1011b725ae77Skettenis
1012b725ae77Skettenis /* Do test calls to ADP_SetBreak/ADP_SetWatch to see if resources exist to
1013b725ae77Skettenis carry out request. */
angel_RDI_pointinq(ARMword * address,unsigned type,unsigned datatype,ARMword * bound)1014b725ae77Skettenis int angel_RDI_pointinq(ARMword *address, unsigned type, unsigned datatype,
1015b725ae77Skettenis ARMword *bound)
1016b725ae77Skettenis {
1017b725ae77Skettenis Packet *packet = NULL;
1018b725ae77Skettenis int len, status, reason, OSinfo1, OSinfo2, err=RDIError_NoError;
1019b725ae77Skettenis /* stop a compiler warning */
1020b725ae77Skettenis int debugID, pointhandle;
1021b725ae77Skettenis TracePrint(
1022b725ae77Skettenis ("angel_RDI_pointinq: address=%.8lx type=%d datatype=%d bound=%.8lx ",
1023b725ae77Skettenis (unsigned long)*address, type, datatype, (unsigned long)*bound));
1024b725ae77Skettenis /* for a buffer. */
1025b725ae77Skettenis packet = DevSW_AllocatePacket(Armsd_BufferSize);
1026b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%b",
1027b725ae77Skettenis ((datatype == 0) ? ADP_SetBreak : ADP_SetWatch) | HtoT, 0,
1028b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, address, type);
1029b725ae77Skettenis if (datatype == 0)
1030b725ae77Skettenis len += msgbuild(BUFFERDATA(packet->pk_buffer) + 21, "%w", bound);
1031b725ae77Skettenis else
1032b725ae77Skettenis len += msgbuild(BUFFERDATA(packet->pk_buffer) + 21, "%b%w", datatype, bound);
1033b725ae77Skettenis
1034b725ae77Skettenis register_debug_message_handler();
1035b725ae77Skettenis packet->pk_length = len;
1036b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet);
1037b725ae77Skettenis reason = ((datatype == 0) ? ADP_SetBreak : ADP_SetWatch | TtoH);
1038b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1039b725ae77Skettenis &status, &packet);
1040b725ae77Skettenis if (err != RDIError_NoError) {
1041b725ae77Skettenis DevSW_FreePacket(packet);
1042b725ae77Skettenis return err; /* Was there an error? */
1043b725ae77Skettenis }
1044b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w",
1045b725ae77Skettenis &reason, &debugID, &OSinfo1, &OSinfo2, &status,
1046b725ae77Skettenis &pointhandle, &address, &bound);
1047b725ae77Skettenis DevSW_FreePacket(packet);
1048b725ae77Skettenis return err;
1049b725ae77Skettenis }
1050b725ae77Skettenis
1051b725ae77Skettenis
1052b725ae77Skettenis /*----------------------------------------------------------------------*/
1053b725ae77Skettenis /*----angel_RDI_setbreak-------------------------------------------------*/
1054b725ae77Skettenis /*----------------------------------------------------------------------*/
1055b725ae77Skettenis
1056b725ae77Skettenis /* Set a breakpoint: Use ADP_SetBreak */
angel_RDI_setbreak(ARMword address,unsigned type,ARMword bound,PointHandle * handle)1057b725ae77Skettenis int angel_RDI_setbreak(ARMword address, unsigned type, ARMword bound,
1058b725ae77Skettenis PointHandle *handle)
1059b725ae77Skettenis {
1060b725ae77Skettenis int status, reason, OSinfo1, OSinfo2, err, debugID;
1061b725ae77Skettenis int tmpval, tmpaddr, tmpbnd;
1062b725ae77Skettenis Packet *packet;
1063b725ae77Skettenis TracePrint(("angel_RDI_setbreak address=%.8lx type=%d bound=%.8lx \n",
1064b725ae77Skettenis (unsigned long)address, type, (unsigned long)bound));
1065b725ae77Skettenis
1066b725ae77Skettenis register_debug_message_handler();
1067b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%b%w",
1068b725ae77Skettenis ADP_SetBreak| HtoT, 0, ADP_HandleUnknown,
1069b725ae77Skettenis ADP_HandleUnknown, address, type, bound);
1070b725ae77Skettenis reason = ADP_SetBreak |TtoH;
1071b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1072b725ae77Skettenis &status, &packet);
1073b725ae77Skettenis if (err != RDIError_NoError) {
1074b725ae77Skettenis DevSW_FreePacket(packet);
1075b725ae77Skettenis return err; /* Was there an error? */
1076b725ae77Skettenis }
1077b725ae77Skettenis /* Work around varargs problem... -sts */
1078b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w",
1079b725ae77Skettenis &reason, &debugID, &OSinfo1, &OSinfo2, &status,
1080b725ae77Skettenis &tmpval, &tmpaddr, &tmpbnd);
1081b725ae77Skettenis *handle = tmpval;
1082b725ae77Skettenis address = tmpaddr;
1083b725ae77Skettenis bound = tmpbnd;
1084b725ae77Skettenis DevSW_FreePacket(packet);
1085b725ae77Skettenis if (status != RDIError_NoError) return status;
1086b725ae77Skettenis TracePrint(("returns handle %.8lx\n", (unsigned long)*handle));
1087b725ae77Skettenis return RDIError_NoError;
1088b725ae77Skettenis }
1089b725ae77Skettenis
1090b725ae77Skettenis
1091b725ae77Skettenis /*----------------------------------------------------------------------*/
1092b725ae77Skettenis /*----angel_RDI_clearbreak-----------------------------------------------*/
1093b725ae77Skettenis /*----------------------------------------------------------------------*/
1094b725ae77Skettenis
1095b725ae77Skettenis /* Clear a breakpoint: Use ADP_ClearBreak. */
angel_RDI_clearbreak(PointHandle handle)1096b725ae77Skettenis int angel_RDI_clearbreak(PointHandle handle)
1097b725ae77Skettenis {
1098b725ae77Skettenis Packet *packet = NULL;
1099b725ae77Skettenis int status, reason, OSinfo1, OSinfo2, err, debugID;
1100b725ae77Skettenis
1101b725ae77Skettenis TracePrint(("angel_RDI_clearbreak: handle=%.8lx\n", (unsigned long)handle));
1102b725ae77Skettenis
1103b725ae77Skettenis register_debug_message_handler();
1104b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w",
1105b725ae77Skettenis ADP_ClearBreak| HtoT, 0, ADP_HandleUnknown,
1106b725ae77Skettenis ADP_HandleUnknown, handle);
1107b725ae77Skettenis reason = ADP_ClearBreak|TtoH;
1108b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1109b725ae77Skettenis &status, &packet);
1110b725ae77Skettenis if (err != RDIError_NoError) {
1111b725ae77Skettenis DevSW_FreePacket(packet);
1112b725ae77Skettenis angel_DebugPrint("***RECEIVE DEBUG MESSAGE RETURNED ERR = %d.\n", err);
1113b725ae77Skettenis return err; /* Was there an error? */
1114b725ae77Skettenis }
1115b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", &reason,
1116b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &status);
1117b725ae77Skettenis DevSW_FreePacket(packet);
1118b725ae77Skettenis #ifdef DEBUG
1119b725ae77Skettenis angel_DebugPrint("DEBUG: Clear Break completed OK.\n");
1120b725ae77Skettenis #endif
1121b725ae77Skettenis return RDIError_NoError;
1122b725ae77Skettenis }
1123b725ae77Skettenis
1124b725ae77Skettenis
1125b725ae77Skettenis /*----------------------------------------------------------------------*/
1126b725ae77Skettenis /*----angel_RDI_setwatch-------------------------------------------------*/
1127b725ae77Skettenis /*----------------------------------------------------------------------*/
1128b725ae77Skettenis
1129b725ae77Skettenis /* Set a watchpoint: use ADP_SetWatch. */
angel_RDI_setwatch(ARMword address,unsigned type,unsigned datatype,ARMword bound,PointHandle * handle)1130b725ae77Skettenis int angel_RDI_setwatch(ARMword address, unsigned type, unsigned datatype,
1131b725ae77Skettenis ARMword bound, PointHandle *handle)
1132b725ae77Skettenis {
1133b725ae77Skettenis Packet *packet = NULL;
1134b725ae77Skettenis int status, reason, OSinfo1, OSinfo2, err, debugID;
1135b725ae77Skettenis
1136b725ae77Skettenis TracePrint(("angel_RDI_setwatch: address=%.8lx type=%d bound=%.8lx ",
1137b725ae77Skettenis (unsigned long)address, type, (unsigned long)bound));
1138b725ae77Skettenis
1139b725ae77Skettenis register_debug_message_handler();
1140b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%b%b%w",
1141b725ae77Skettenis ADP_SetWatch| HtoT, 0, ADP_HandleUnknown,
1142b725ae77Skettenis ADP_HandleUnknown, address, type, datatype, bound);
1143b725ae77Skettenis
1144b725ae77Skettenis reason = ADP_SetWatch | TtoH;
1145b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1146b725ae77Skettenis &status, &packet);
1147b725ae77Skettenis if (err != RDIError_NoError) {
1148b725ae77Skettenis DevSW_FreePacket(packet);
1149b725ae77Skettenis return err; /* Was there an error? */
1150b725ae77Skettenis }
1151b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w",
1152b725ae77Skettenis &reason, &debugID, &OSinfo1, &OSinfo2, &status,
1153b725ae77Skettenis handle, &address, &bound);
1154b725ae77Skettenis DevSW_FreePacket(packet);
1155b725ae77Skettenis TracePrint(("returns handle %.8lx\n", (unsigned long)*handle));
1156b725ae77Skettenis return RDIError_NoError;
1157b725ae77Skettenis }
1158b725ae77Skettenis
1159b725ae77Skettenis /*----------------------------------------------------------------------*/
1160b725ae77Skettenis /*----angel_RDI_clearwatch-----------------------------------------------*/
1161b725ae77Skettenis /*----------------------------------------------------------------------*/
1162b725ae77Skettenis
1163b725ae77Skettenis /* Clear a watchpoint: use ADP_ClearWatch. */
angel_RDI_clearwatch(PointHandle handle)1164b725ae77Skettenis int angel_RDI_clearwatch(PointHandle handle) {
1165b725ae77Skettenis
1166b725ae77Skettenis int status, reason, OSinfo1, OSinfo2, err, debugID;
1167b725ae77Skettenis Packet *packet = NULL;
1168b725ae77Skettenis
1169b725ae77Skettenis TracePrint(("angel_RDI_clearwatch: handle=%.8lx\n", (unsigned long)handle));
1170b725ae77Skettenis
1171b725ae77Skettenis register_debug_message_handler();
1172b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w",
1173b725ae77Skettenis ADP_ClearWatch| HtoT, 0, ADP_HandleUnknown,
1174b725ae77Skettenis ADP_HandleUnknown, handle);
1175b725ae77Skettenis reason = ADP_ClearWatch|TtoH;
1176b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1177b725ae77Skettenis &status, &packet);
1178b725ae77Skettenis if (err != RDIError_NoError) {
1179b725ae77Skettenis DevSW_FreePacket(packet);
1180b725ae77Skettenis return err; /* Was there an error? */
1181b725ae77Skettenis }
1182b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", &reason, &debugID,
1183b725ae77Skettenis &OSinfo1, &OSinfo2, &status);
1184b725ae77Skettenis DevSW_FreePacket(packet);
1185b725ae77Skettenis return RDIError_NoError;
1186b725ae77Skettenis }
1187b725ae77Skettenis
1188b725ae77Skettenis typedef struct {
1189b725ae77Skettenis unsigned stopped_reason;
1190b725ae77Skettenis int stopped_status;
1191b725ae77Skettenis int data;
1192b725ae77Skettenis } adp_stopped_struct;
1193b725ae77Skettenis
1194b725ae77Skettenis
angel_RDI_OnTargetStopping(angel_RDI_TargetStoppedProc * fn,void * arg)1195b725ae77Skettenis int angel_RDI_OnTargetStopping(angel_RDI_TargetStoppedProc *fn,
1196b725ae77Skettenis void *arg)
1197b725ae77Skettenis {
1198b725ae77Skettenis stoppedProcListElement **lptr = &stopped_proc_list;
1199b725ae77Skettenis
1200b725ae77Skettenis /* Find the address of the NULL ptr at the end of the list */
1201b725ae77Skettenis for (; *lptr!=NULL ; lptr = &((*lptr)->next))
1202b725ae77Skettenis ; /* Do nothing */
1203b725ae77Skettenis
1204b725ae77Skettenis *lptr = (stoppedProcListElement *) malloc(sizeof(stoppedProcListElement));
1205b725ae77Skettenis if (*lptr == NULL) return RDIError_OutOfStore;
1206b725ae77Skettenis (*lptr)->fn = fn;
1207b725ae77Skettenis (*lptr)->arg = arg;
1208b725ae77Skettenis
1209b725ae77Skettenis return RDIError_NoError;
1210b725ae77Skettenis }
1211b725ae77Skettenis
CallStoppedProcs(unsigned reason)1212b725ae77Skettenis static int CallStoppedProcs(unsigned reason)
1213b725ae77Skettenis {
1214b725ae77Skettenis stoppedProcListElement *p = stopped_proc_list;
1215b725ae77Skettenis int err=RDIError_NoError;
1216b725ae77Skettenis
1217b725ae77Skettenis for (; p!=NULL ; p=p->next) {
1218b725ae77Skettenis int local_err = p->fn(reason, p->arg);
1219b725ae77Skettenis if (local_err != RDIError_NoError) err=local_err;
1220b725ae77Skettenis }
1221b725ae77Skettenis
1222b725ae77Skettenis return err;
1223b725ae77Skettenis }
1224b725ae77Skettenis
1225b725ae77Skettenis /*----------------------------------------------------------------------*/
1226b725ae77Skettenis /*----angel_RDI_execute--------------------------------------------------*/
1227b725ae77Skettenis /*----------------------------------------------------------------------*/
1228b725ae77Skettenis
HandleStoppedMessage(Packet * packet,void * stateptr)1229b725ae77Skettenis static int HandleStoppedMessage(Packet *packet, void *stateptr) {
1230b725ae77Skettenis unsigned int err, reason, debugID, OSinfo1, OSinfo2, count;
1231b725ae77Skettenis adp_stopped_struct *stopped_info;
1232b725ae77Skettenis stopped_info = (adp_stopped_struct *) stateptr;
1233b725ae77Skettenis IGNORE(stateptr);
1234b725ae77Skettenis count = unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w",
1235b725ae77Skettenis &reason, &debugID,
1236b725ae77Skettenis &OSinfo1, &OSinfo2,
1237b725ae77Skettenis &stopped_info->stopped_reason, &stopped_info->data);
1238b725ae77Skettenis DevSW_FreePacket(packet);
1239b725ae77Skettenis
1240b725ae77Skettenis if (reason != (ADP_Stopped | TtoH)) {
1241b725ae77Skettenis #ifdef DEBUG
1242b725ae77Skettenis angel_DebugPrint("Expecting stopped message, got %x", reason);
1243b725ae77Skettenis #endif
1244b725ae77Skettenis return RDIError_Error;
1245b725ae77Skettenis }
1246b725ae77Skettenis else {
1247b725ae77Skettenis executing = FALSE;
1248b725ae77Skettenis #ifdef DEBUG
1249b725ae77Skettenis angel_DebugPrint("Received stopped message.\n");
1250b725ae77Skettenis #endif
1251b725ae77Skettenis }
1252b725ae77Skettenis
1253b725ae77Skettenis err = msgsend(CI_TADP, "%w%w%w%w%w", (ADP_Stopped | HtoT), 0,
1254b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, RDIError_NoError);
1255b725ae77Skettenis #ifdef DEBUG
1256b725ae77Skettenis angel_DebugPrint("Transmiting stopped acknowledge.\n");
1257b725ae77Skettenis #endif
1258b725ae77Skettenis if (err != RDIError_NoError) angel_DebugPrint("Transmit failed.\n");
1259b725ae77Skettenis #ifdef DEBUG
1260b725ae77Skettenis angel_DebugPrint("DEBUG: Stopped reason : %x\n", stopped_info->stopped_reason);
1261b725ae77Skettenis #endif
1262b725ae77Skettenis switch (stopped_info->stopped_reason) {
1263b725ae77Skettenis case ADP_Stopped_BranchThroughZero:
1264b725ae77Skettenis stopped_info->stopped_status = RDIError_BranchThrough0;
1265b725ae77Skettenis break;
1266b725ae77Skettenis case ADP_Stopped_UndefinedInstr:
1267b725ae77Skettenis stopped_info->stopped_status = RDIError_UndefinedInstruction;
1268b725ae77Skettenis break;
1269b725ae77Skettenis case ADP_Stopped_SoftwareInterrupt:
1270b725ae77Skettenis stopped_info->stopped_status = RDIError_SoftwareInterrupt;
1271b725ae77Skettenis break;
1272b725ae77Skettenis case ADP_Stopped_PrefetchAbort:
1273b725ae77Skettenis stopped_info->stopped_status = RDIError_PrefetchAbort;
1274b725ae77Skettenis break;
1275b725ae77Skettenis case ADP_Stopped_DataAbort:
1276b725ae77Skettenis stopped_info->stopped_status = RDIError_DataAbort;
1277b725ae77Skettenis break;
1278b725ae77Skettenis case ADP_Stopped_AddressException:
1279b725ae77Skettenis stopped_info->stopped_status = RDIError_AddressException;
1280b725ae77Skettenis break;
1281b725ae77Skettenis case ADP_Stopped_IRQ:
1282b725ae77Skettenis stopped_info->stopped_status = RDIError_IRQ;
1283b725ae77Skettenis break;
1284b725ae77Skettenis case ADP_Stopped_BreakPoint:
1285b725ae77Skettenis stopped_info->stopped_status = RDIError_BreakpointReached;
1286b725ae77Skettenis break;
1287b725ae77Skettenis case ADP_Stopped_WatchPoint:
1288b725ae77Skettenis stopped_info->stopped_status = RDIError_WatchpointAccessed;
1289b725ae77Skettenis break;
1290b725ae77Skettenis case ADP_Stopped_StepComplete:
1291b725ae77Skettenis stopped_info->stopped_status = RDIError_ProgramFinishedInStep;
1292b725ae77Skettenis break;
1293b725ae77Skettenis case ADP_Stopped_RunTimeErrorUnknown:
1294b725ae77Skettenis case ADP_Stopped_StackOverflow:
1295b725ae77Skettenis case ADP_Stopped_DivisionByZero:
1296b725ae77Skettenis stopped_info->stopped_status = RDIError_Error;
1297b725ae77Skettenis break;
1298b725ae77Skettenis case ADP_Stopped_FIQ:
1299b725ae77Skettenis stopped_info->stopped_status = RDIError_FIQ;
1300b725ae77Skettenis break;
1301b725ae77Skettenis case ADP_Stopped_UserInterruption:
1302b725ae77Skettenis case ADP_Stopped_OSSpecific:
1303b725ae77Skettenis stopped_info->stopped_status = RDIError_UserInterrupt;
1304b725ae77Skettenis break;
1305b725ae77Skettenis case ADP_Stopped_ApplicationExit:
1306b725ae77Skettenis stopped_info->stopped_status = RDIError_NoError;
1307b725ae77Skettenis break;
1308b725ae77Skettenis default:
1309b725ae77Skettenis stopped_info->stopped_status = RDIError_Error;
1310b725ae77Skettenis break;
1311b725ae77Skettenis }
1312b725ae77Skettenis return RDIError_NoError;
1313b725ae77Skettenis }
1314b725ae77Skettenis
1315b725ae77Skettenis
interrupt_target(void)1316b725ae77Skettenis static void interrupt_target( void )
1317b725ae77Skettenis {
1318b725ae77Skettenis Packet *packet = NULL;
1319b725ae77Skettenis int err;
1320b725ae77Skettenis int reason, debugID, OSinfo1, OSinfo2, status;
1321b725ae77Skettenis
1322b725ae77Skettenis #ifdef DEBUG
1323b725ae77Skettenis angel_DebugPrint("DEBUG: interrupt_target.\n");
1324b725ae77Skettenis #endif
1325b725ae77Skettenis
1326b725ae77Skettenis register_debug_message_handler();
1327b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w", ADP_InterruptRequest | HtoT, 0,
1328b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown);
1329b725ae77Skettenis
1330b725ae77Skettenis reason = ADP_InterruptRequest |TtoH;
1331b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1332b725ae77Skettenis &status, &packet);
1333b725ae77Skettenis DevSW_FreePacket(packet);
1334b725ae77Skettenis #ifdef DEBUG
1335b725ae77Skettenis angel_DebugPrint("DEBUG: got interrupt ack ok err = %d, status=%i\n",
1336b725ae77Skettenis err, status);
1337b725ae77Skettenis #endif
1338b725ae77Skettenis
1339b725ae77Skettenis return;
1340b725ae77Skettenis }
1341b725ae77Skettenis
1342b725ae77Skettenis #ifdef TEST_DC_APPL
1343b725ae77Skettenis extern void test_dc_appl_handler( const DeviceDescr *device,
1344b725ae77Skettenis Packet *packet );
1345b725ae77Skettenis #endif
1346b725ae77Skettenis
angel_RDI_stop_request(void)1347b725ae77Skettenis void angel_RDI_stop_request(void)
1348b725ae77Skettenis {
1349b725ae77Skettenis stop_request = 1;
1350b725ae77Skettenis }
1351b725ae77Skettenis
1352b725ae77Skettenis /* Core functionality for execute and step */
angel_RDI_ExecuteOrStep(PointHandle * handle,word type,unsigned ninstr)1353b725ae77Skettenis static int angel_RDI_ExecuteOrStep(PointHandle *handle, word type,
1354b725ae77Skettenis unsigned ninstr)
1355b725ae77Skettenis {
1356*63addd46Skettenis extern int (*deprecated_ui_loop_hook) (int);
1357b725ae77Skettenis int err;
1358b725ae77Skettenis adp_stopped_struct stopped_info;
1359b725ae77Skettenis void* stateptr = (void *)&stopped_info;
1360b725ae77Skettenis ChannelCallback HandleStoppedMessageFPtr=(ChannelCallback) HandleStoppedMessage;
1361b725ae77Skettenis int status, reasoncode, debugID, OSinfo1, OSinfo2;
1362b725ae77Skettenis Packet *packet = NULL;
1363b725ae77Skettenis
1364b725ae77Skettenis TracePrint(("angel_RDI_ExecuteOrStep\n"));
1365b725ae77Skettenis
1366b725ae77Skettenis err = Adp_ChannelRegisterRead(CI_TADP,
1367b725ae77Skettenis HandleStoppedMessageFPtr, stateptr);
1368b725ae77Skettenis if (err != RDIError_NoError) {
1369b725ae77Skettenis #ifdef DEBUG
1370b725ae77Skettenis angel_DebugPrint("TADP Register failed.\n");
1371b725ae77Skettenis #endif
1372b725ae77Skettenis return err;
1373b725ae77Skettenis }
1374b725ae77Skettenis /* Set executing TRUE here, as it must be set up before the target has
1375b725ae77Skettenis * had any chance at all to execute, or it may send its stopped message
1376b725ae77Skettenis * before we get round to setting executing = TRUE !!!
1377b725ae77Skettenis */
1378b725ae77Skettenis executing = TRUE;
1379b725ae77Skettenis
1380b725ae77Skettenis register_debug_message_handler();
1381b725ae77Skettenis
1382b725ae77Skettenis #ifdef TEST_DC_APPL
1383b725ae77Skettenis Adp_Install_DC_Appl_Handler( test_dc_appl_handler );
1384b725ae77Skettenis #endif
1385b725ae77Skettenis
1386b725ae77Skettenis #ifdef DEBUG
1387b725ae77Skettenis angel_DebugPrint("Transmiting %s message.\n",
1388b725ae77Skettenis type == ADP_Execute ? "execute": "step");
1389b725ae77Skettenis #endif
1390b725ae77Skettenis
1391b725ae77Skettenis register_debug_message_handler();
1392b725ae77Skettenis /* Extra ninstr parameter for execute message will simply be ignored */
1393b725ae77Skettenis err = msgsend(CI_HADP,"%w%w%w%w%w", type | HtoT, 0,
1394b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, ninstr);
1395b725ae77Skettenis #if DEBUG
1396b725ae77Skettenis if (err != RDIError_NoError) angel_DebugPrint("Transmit failed.\n");
1397b725ae77Skettenis #endif
1398b725ae77Skettenis
1399b725ae77Skettenis reasoncode = type | TtoH;
1400b725ae77Skettenis err = wait_for_debug_message( &reasoncode, &debugID, &OSinfo1, &OSinfo2,
1401b725ae77Skettenis &status, &packet );
1402b725ae77Skettenis if (err != RDIError_NoError)
1403b725ae77Skettenis return err;
1404b725ae77Skettenis else if (status != RDIError_NoError)
1405b725ae77Skettenis return status;
1406b725ae77Skettenis
1407b725ae77Skettenis #ifdef DEBUG
1408b725ae77Skettenis angel_DebugPrint("Waiting for program to finish...\n");
1409b725ae77Skettenis #endif
1410b725ae77Skettenis
1411b725ae77Skettenis interrupt_request = FALSE;
1412b725ae77Skettenis stop_request = FALSE;
1413b725ae77Skettenis
1414b725ae77Skettenis signal(SIGINT, ardi_sigint_handler);
1415b725ae77Skettenis while( executing )
1416b725ae77Skettenis {
1417*63addd46Skettenis if (deprecated_ui_loop_hook)
1418*63addd46Skettenis deprecated_ui_loop_hook(0);
1419b725ae77Skettenis
1420b725ae77Skettenis if (interrupt_request || stop_request)
1421b725ae77Skettenis {
1422b725ae77Skettenis interrupt_target();
1423b725ae77Skettenis interrupt_request = FALSE;
1424b725ae77Skettenis stop_request = FALSE;
1425b725ae77Skettenis }
1426b725ae77Skettenis Adp_AsynchronousProcessing( async_block_on_nothing );
1427b725ae77Skettenis }
1428b725ae77Skettenis signal(SIGINT, SIG_IGN);
1429b725ae77Skettenis
1430b725ae77Skettenis
1431b725ae77Skettenis #ifdef TEST_DC_APPL
1432b725ae77Skettenis Adp_Install_DC_Appl_Handler( NULL );
1433b725ae77Skettenis #endif
1434b725ae77Skettenis
1435b725ae77Skettenis (void)Adp_ChannelRegisterRead(CI_TADP, NULL, NULL);
1436b725ae77Skettenis
1437b725ae77Skettenis *handle = (PointHandle)stopped_info.data;
1438b725ae77Skettenis
1439b725ae77Skettenis CallStoppedProcs(stopped_info.stopped_reason);
1440b725ae77Skettenis
1441b725ae77Skettenis return stopped_info.stopped_status;
1442b725ae77Skettenis }
1443b725ae77Skettenis
1444b725ae77Skettenis /* Request that the target starts executing from the stored CPU state: use
1445b725ae77Skettenis ADP_Execute. */
angel_RDI_execute(PointHandle * handle)1446b725ae77Skettenis int angel_RDI_execute(PointHandle *handle)
1447b725ae77Skettenis {
1448b725ae77Skettenis return angel_RDI_ExecuteOrStep(handle, ADP_Execute, 0);
1449b725ae77Skettenis }
1450b725ae77Skettenis
1451b725ae77Skettenis #ifdef __WATCOMC__
1452b725ae77Skettenis typedef void handlertype(int);
1453b725ae77Skettenis
1454b725ae77Skettenis static int interrupted=0;
1455b725ae77Skettenis
myhandler(int sig)1456b725ae77Skettenis static void myhandler(int sig) {
1457b725ae77Skettenis IGNORE(sig);
1458b725ae77Skettenis interrupted=1;
1459b725ae77Skettenis signal(SIGINT, myhandler);
1460b725ae77Skettenis }
1461b725ae77Skettenis #endif
1462b725ae77Skettenis
1463b725ae77Skettenis /*----------------------------------------------------------------------*/
1464b725ae77Skettenis /*----angel_RDI_step-----------------------------------------------------*/
1465b725ae77Skettenis /*----------------------------------------------------------------------*/
1466b725ae77Skettenis
1467b725ae77Skettenis /* Step 'ninstr' through the code: use ADP_Step. */
angel_RDI_step(unsigned ninstr,PointHandle * handle)1468b725ae77Skettenis int angel_RDI_step(unsigned ninstr, PointHandle *handle)
1469b725ae77Skettenis {
1470b725ae77Skettenis int err = angel_RDI_ExecuteOrStep(handle, ADP_Step, ninstr);
1471b725ae77Skettenis if (err == RDIError_ProgramFinishedInStep)
1472b725ae77Skettenis return RDIError_NoError;
1473b725ae77Skettenis else
1474b725ae77Skettenis return err;
1475b725ae77Skettenis }
1476b725ae77Skettenis
1477b725ae77Skettenis
SetCPWords(int cpnum,struct Dbg_CoProDesc const * cpd)1478b725ae77Skettenis static void SetCPWords(int cpnum, struct Dbg_CoProDesc const *cpd) {
1479b725ae77Skettenis int i, rmax = 0;
1480b725ae77Skettenis for (i = 0; i < cpd->entries; i++)
1481b725ae77Skettenis if (cpd->regdesc[i].rmax > rmax)
1482b725ae77Skettenis rmax = cpd->regdesc[i].rmax;
1483b725ae77Skettenis
1484b725ae77Skettenis { unsigned char *rmap = (unsigned char *)malloc(rmax + 2);
1485b725ae77Skettenis *rmap++ = rmax + 1;
1486b725ae77Skettenis for (i = 0; i < cpd->entries; i++) {
1487b725ae77Skettenis int r;
1488b725ae77Skettenis for (r = cpd->regdesc[i].rmin; r <= cpd->regdesc[i].rmax; r++)
1489b725ae77Skettenis rmap[r] = (cpd->regdesc[i].nbytes+3) / 4;
1490b725ae77Skettenis }
1491b725ae77Skettenis /* if (cpwords[cpnum] != NULL) free(cpwords[cpnum]); */
1492b725ae77Skettenis cpwords[cpnum] = rmap;
1493b725ae77Skettenis }
1494b725ae77Skettenis }
1495b725ae77Skettenis
1496b725ae77Skettenis /*----------------------------------------------------------------------*/
1497b725ae77Skettenis /*----angel_RDI_info-----------------------------------------------------*/
1498b725ae77Skettenis /*----------------------------------------------------------------------*/
1499b725ae77Skettenis
1500b725ae77Skettenis /* Use ADP_Info, ADP_Ctrl and ADP_Profile calls to implement these,
1501b725ae77Skettenis see adp.h for more details. */
1502b725ae77Skettenis
angel_cc_exists(void)1503b725ae77Skettenis static int angel_cc_exists( void )
1504b725ae77Skettenis {
1505b725ae77Skettenis Packet *packet = NULL;
1506b725ae77Skettenis int err;
1507b725ae77Skettenis int reason, debugID, OSinfo1, OSinfo2, subreason, status;
1508b725ae77Skettenis
1509b725ae77Skettenis #ifdef DEBUG
1510b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEB_CC_Exists.\n");
1511b725ae77Skettenis #endif
1512b725ae77Skettenis
1513b725ae77Skettenis if ( angel_RDI_info( RDIInfo_Icebreaker, NULL, NULL ) == RDIError_NoError ) {
1514b725ae77Skettenis register_debug_message_handler();
1515b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w", ADP_ICEbreakerHADP | HtoT, 0,
1516b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
1517b725ae77Skettenis ADP_ICEB_CC_Exists );
1518b725ae77Skettenis reason = ADP_ICEbreakerHADP |TtoH;
1519b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1520b725ae77Skettenis &status, &packet);
1521b725ae77Skettenis if (err != RDIError_NoError) {
1522b725ae77Skettenis DevSW_FreePacket(packet);
1523b725ae77Skettenis return err;
1524b725ae77Skettenis }
1525b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,
1526b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status);
1527b725ae77Skettenis if (subreason != ADP_ICEB_CC_Exists) {
1528b725ae77Skettenis DevSW_FreePacket(packet);
1529b725ae77Skettenis return RDIError_Error;
1530b725ae77Skettenis }
1531b725ae77Skettenis else
1532b725ae77Skettenis return status;
1533b725ae77Skettenis }
1534b725ae77Skettenis else
1535b725ae77Skettenis return RDIError_UnimplementedMessage;
1536b725ae77Skettenis }
1537b725ae77Skettenis
1538b725ae77Skettenis typedef struct {
1539b725ae77Skettenis RDICCProc_ToHost *tohost; void *tohostarg;
1540b725ae77Skettenis RDICCProc_FromHost *fromhost; void *fromhostarg;
1541b725ae77Skettenis bool registered;
1542b725ae77Skettenis } CCState;
1543b725ae77Skettenis static CCState ccstate = { NULL, NULL, NULL, NULL, FALSE };
1544b725ae77Skettenis
HandleDCCMessage(Packet * packet,void * stateptr)1545b725ae77Skettenis static void HandleDCCMessage( Packet *packet, void *stateptr )
1546b725ae77Skettenis {
1547b725ae77Skettenis unsigned int reason, debugID, OSinfo1, OSinfo2;
1548b725ae77Skettenis int count;
1549b725ae77Skettenis CCState *ccstate_p = (CCState *)stateptr;
1550b725ae77Skettenis
1551b725ae77Skettenis count = unpack_message( BUFFERDATA(packet->pk_buffer), "%w%w%w%w",
1552b725ae77Skettenis &reason, &debugID, &OSinfo1, &OSinfo2 );
1553b725ae77Skettenis switch ( reason )
1554b725ae77Skettenis {
1555b725ae77Skettenis case ADP_TDCC_ToHost | TtoH:
1556b725ae77Skettenis {
1557b725ae77Skettenis /* only handles a single word of data, for now */
1558b725ae77Skettenis
1559b725ae77Skettenis unsigned int nbytes, data;
1560b725ae77Skettenis
1561b725ae77Skettenis unpack_message( BUFFERDATA(packet->pk_buffer)+count, "%w%w",
1562b725ae77Skettenis &nbytes, &data );
1563b725ae77Skettenis #ifdef DEBUG
1564b725ae77Skettenis angel_DebugPrint( "DEBUG: received CC_ToHost message: nbytes %d data %08x.\n",
1565b725ae77Skettenis nbytes, data );
1566b725ae77Skettenis #endif
1567b725ae77Skettenis ccstate_p->tohost( ccstate_p->tohostarg, data );
1568b725ae77Skettenis msgsend(CI_TTDCC, "%w%w%w%w%w",
1569b725ae77Skettenis ADP_TDCC_ToHost | HtoT, debugID, OSinfo1, OSinfo2,
1570b725ae77Skettenis RDIError_NoError );
1571b725ae77Skettenis break;
1572b725ae77Skettenis }
1573b725ae77Skettenis
1574b725ae77Skettenis case ADP_TDCC_FromHost | TtoH:
1575b725ae77Skettenis {
1576b725ae77Skettenis /* only handles a single word of data, for now */
1577b725ae77Skettenis
1578b725ae77Skettenis int valid;
1579b725ae77Skettenis ARMword data;
1580b725ae77Skettenis
1581b725ae77Skettenis ccstate_p->fromhost( ccstate_p->fromhostarg, &data, &valid );
1582b725ae77Skettenis #ifdef DEBUG
1583b725ae77Skettenis angel_DebugPrint( "DEBUG: received CC_FromHost message, returning: %08x %s.\n",
1584b725ae77Skettenis data, valid ? "VALID" : "INvalid" );
1585b725ae77Skettenis #endif
1586b725ae77Skettenis msgsend(CI_TTDCC, "%w%w%w%w%w%w%w",
1587b725ae77Skettenis ADP_TDCC_FromHost | HtoT, debugID, OSinfo1, OSinfo2,
1588b725ae77Skettenis RDIError_NoError, valid ? 1 : 0, data );
1589b725ae77Skettenis break;
1590b725ae77Skettenis }
1591b725ae77Skettenis
1592b725ae77Skettenis default:
1593b725ae77Skettenis #ifdef DEBUG
1594b725ae77Skettenis angel_DebugPrint( "Unexpected TDCC message %08x received\n", reason );
1595b725ae77Skettenis #endif
1596b725ae77Skettenis break;
1597b725ae77Skettenis }
1598b725ae77Skettenis DevSW_FreePacket(packet);
1599b725ae77Skettenis return;
1600b725ae77Skettenis }
1601b725ae77Skettenis
angel_check_DCC_handler(CCState * ccstate_p)1602b725ae77Skettenis static void angel_check_DCC_handler( CCState *ccstate_p )
1603b725ae77Skettenis {
1604b725ae77Skettenis int err;
1605b725ae77Skettenis
1606b725ae77Skettenis if ( ccstate_p->tohost != NULL || ccstate_p->fromhost != NULL )
1607b725ae77Skettenis {
1608b725ae77Skettenis /* doing DCC, so need a handler */
1609b725ae77Skettenis if ( ! ccstate_p->registered )
1610b725ae77Skettenis {
1611b725ae77Skettenis #ifdef DEBUG
1612b725ae77Skettenis angel_DebugPrint( "Registering handler for TTDCC channel.\n" );
1613b725ae77Skettenis #endif
1614b725ae77Skettenis err = Adp_ChannelRegisterRead( CI_TTDCC, HandleDCCMessage,
1615b725ae77Skettenis ccstate_p );
1616b725ae77Skettenis if ( err == adp_ok )
1617b725ae77Skettenis ccstate_p->registered = TRUE;
1618b725ae77Skettenis #ifdef DEBUG
1619b725ae77Skettenis else
1620b725ae77Skettenis angel_DebugPrint( "angel_check_DCC_handler: register failed!\n" );
1621b725ae77Skettenis #endif
1622b725ae77Skettenis }
1623b725ae77Skettenis }
1624b725ae77Skettenis else
1625b725ae77Skettenis {
1626b725ae77Skettenis /* not doing DCC, so don't need a handler */
1627b725ae77Skettenis if ( ccstate_p->registered )
1628b725ae77Skettenis {
1629b725ae77Skettenis #ifdef DEBUG
1630b725ae77Skettenis angel_DebugPrint( "Unregistering handler for TTDCC channel.\n" );
1631b725ae77Skettenis #endif
1632b725ae77Skettenis err = Adp_ChannelRegisterRead( CI_TTDCC, NULL, NULL );
1633b725ae77Skettenis if ( err == adp_ok )
1634b725ae77Skettenis ccstate_p->registered = FALSE;
1635b725ae77Skettenis #ifdef DEBUG
1636b725ae77Skettenis else
1637b725ae77Skettenis angel_DebugPrint( "angel_check_DCC_handler: unregister failed!\n" );
1638b725ae77Skettenis #endif
1639b725ae77Skettenis }
1640b725ae77Skettenis }
1641b725ae77Skettenis }
1642b725ae77Skettenis
1643b725ae77Skettenis
CheckSubMessageReply(int reason,int subreason)1644b725ae77Skettenis static int CheckSubMessageReply(int reason, int subreason) {
1645b725ae77Skettenis Packet *packet = NULL;
1646b725ae77Skettenis int status, debugID, OSinfo1, OSinfo2;
1647b725ae77Skettenis int err = RDIError_NoError;
1648b725ae77Skettenis reason |= TtoH;
1649b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1650b725ae77Skettenis &status, &packet);
1651b725ae77Skettenis if (err != RDIError_NoError) {
1652b725ae77Skettenis status = err;
1653b725ae77Skettenis } else {
1654b725ae77Skettenis int sr;
1655b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,
1656b725ae77Skettenis &OSinfo1, &OSinfo2, &sr, &status);
1657b725ae77Skettenis if (subreason != sr) status = RDIError_Error;
1658b725ae77Skettenis }
1659b725ae77Skettenis DevSW_FreePacket(packet);
1660b725ae77Skettenis return status;
1661b725ae77Skettenis }
1662b725ae77Skettenis
SendSubMessageAndCheckReply(int reason,int subreason)1663b725ae77Skettenis static int SendSubMessageAndCheckReply(int reason, int subreason) {
1664b725ae77Skettenis register_debug_message_handler();
1665b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w", reason | HtoT, 0,
1666b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
1667b725ae77Skettenis subreason);
1668b725ae77Skettenis return CheckSubMessageReply(reason, subreason);
1669b725ae77Skettenis }
1670b725ae77Skettenis
SendSubMessageWordAndCheckReply(int reason,int subreason,ARMword word)1671b725ae77Skettenis static int SendSubMessageWordAndCheckReply(int reason, int subreason, ARMword word) {
1672b725ae77Skettenis register_debug_message_handler();
1673b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w", reason | HtoT, 0,
1674b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
1675b725ae77Skettenis subreason, word);
1676b725ae77Skettenis return CheckSubMessageReply(reason, subreason);
1677b725ae77Skettenis }
1678b725ae77Skettenis
SendSubMessageGetWordAndCheckReply(int reason,int subreason,ARMword * resp)1679b725ae77Skettenis static int SendSubMessageGetWordAndCheckReply(int reason, int subreason, ARMword *resp) {
1680b725ae77Skettenis Packet *packet = NULL;
1681b725ae77Skettenis int status, debugID, OSinfo1, OSinfo2;
1682b725ae77Skettenis int err = RDIError_NoError;
1683b725ae77Skettenis
1684b725ae77Skettenis register_debug_message_handler();
1685b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w", reason | HtoT, 0,
1686b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
1687b725ae77Skettenis subreason);
1688b725ae77Skettenis reason |= TtoH;
1689b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1690b725ae77Skettenis &status, &packet);
1691b725ae77Skettenis if (err != RDIError_NoError) {
1692b725ae77Skettenis status = err;
1693b725ae77Skettenis } else {
1694b725ae77Skettenis int sr;
1695b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w", &reason, &debugID,
1696b725ae77Skettenis &OSinfo1, &OSinfo2, &sr, &status, resp);
1697b725ae77Skettenis if (subreason != sr) status = RDIError_Error;
1698b725ae77Skettenis }
1699b725ae77Skettenis DevSW_FreePacket(packet);
1700b725ae77Skettenis return status;
1701b725ae77Skettenis }
1702b725ae77Skettenis
1703b725ae77Skettenis static int const hostsex = 1;
1704b725ae77Skettenis
angel_RDI_info(unsigned type,ARMword * arg1,ARMword * arg2)1705b725ae77Skettenis int angel_RDI_info(unsigned type, ARMword *arg1, ARMword *arg2) {
1706b725ae77Skettenis Packet *packet = NULL;
1707b725ae77Skettenis int len, status, c, reason, subreason, debugID, OSinfo1, OSinfo2;
1708b725ae77Skettenis int err=RDIError_NoError, cpnum=0;
1709b725ae77Skettenis struct Dbg_CoProDesc *cpd;
1710b725ae77Skettenis int count, i;
1711b725ae77Skettenis unsigned char *bp;
1712b725ae77Skettenis
1713b725ae77Skettenis #ifdef DEBUG
1714b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_info.\n");
1715b725ae77Skettenis #endif
1716b725ae77Skettenis switch (type) {
1717b725ae77Skettenis case RDIInfo_Target:
1718b725ae77Skettenis #ifdef DEBUG
1719b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_Target.\n");
1720b725ae77Skettenis #endif
1721b725ae77Skettenis
1722b725ae77Skettenis register_debug_message_handler();
1723b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w", ADP_Info | HtoT, 0,
1724b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, ADP_Info_Target);
1725b725ae77Skettenis reason = ADP_Info |TtoH;
1726b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1727b725ae77Skettenis &status, &packet);
1728b725ae77Skettenis if (err != RDIError_NoError) {
1729b725ae77Skettenis DevSW_FreePacket(packet);
1730b725ae77Skettenis return err;
1731b725ae77Skettenis }
1732b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w", &reason,
1733b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status,
1734b725ae77Skettenis arg1, arg2);
1735b725ae77Skettenis DevSW_FreePacket(packet);
1736b725ae77Skettenis
1737b725ae77Skettenis if (subreason != ADP_Info_Target)
1738b725ae77Skettenis return RDIError_Error;
1739b725ae77Skettenis else
1740b725ae77Skettenis return status;
1741b725ae77Skettenis
1742b725ae77Skettenis case RDISignal_Stop:
1743b725ae77Skettenis #ifdef DEBUG
1744b725ae77Skettenis angel_DebugPrint("DEBUG: RDISignal_Stop.\n");
1745b725ae77Skettenis if (interrupt_request)
1746b725ae77Skettenis angel_DebugPrint(" STILL WAITING to send previous interrupt request\n");
1747b725ae77Skettenis #endif
1748b725ae77Skettenis interrupt_request = TRUE;
1749b725ae77Skettenis return RDIError_NoError;
1750b725ae77Skettenis
1751b725ae77Skettenis case RDIInfo_Points:
1752b725ae77Skettenis #ifdef DEBUG
1753b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_Points.\n");
1754b725ae77Skettenis #endif
1755b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_Info, ADP_Info_Points, arg1);
1756b725ae77Skettenis
1757b725ae77Skettenis case RDIInfo_Step:
1758b725ae77Skettenis #ifdef DEBUG
1759b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_Step.\n");
1760b725ae77Skettenis #endif
1761b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_Info, ADP_Info_Step, arg1);
1762b725ae77Skettenis
1763b725ae77Skettenis case RDISet_Cmdline:
1764b725ae77Skettenis #ifdef DEBUG
1765b725ae77Skettenis angel_DebugPrint("DEBUG: RDISet_Cmdline.\n");
1766b725ae77Skettenis #endif
1767b725ae77Skettenis if (ardi_commandline != &dummycline)
1768b725ae77Skettenis free(ardi_commandline);
1769b725ae77Skettenis ardi_commandline = (char *)malloc(strlen((char*)arg1) + 1) ;
1770b725ae77Skettenis (void)strcpy(ardi_commandline, (char *)arg1) ;
1771b725ae77Skettenis return RDIError_NoError;
1772b725ae77Skettenis
1773b725ae77Skettenis case RDIInfo_SetLog:
1774b725ae77Skettenis #ifdef DEBUG
1775b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_SetLog.\n");
1776b725ae77Skettenis #endif
1777b725ae77Skettenis rdi_log = (int) *arg1;
1778b725ae77Skettenis return RDIError_NoError;
1779b725ae77Skettenis
1780b725ae77Skettenis case RDIInfo_Log:
1781b725ae77Skettenis #ifdef DEBUG
1782b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_Log.\n");
1783b725ae77Skettenis #endif
1784b725ae77Skettenis *arg1 = rdi_log;
1785b725ae77Skettenis return RDIError_NoError;
1786b725ae77Skettenis
1787b725ae77Skettenis
1788b725ae77Skettenis case RDIInfo_MMU:
1789b725ae77Skettenis #ifdef DEBUG
1790b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_MMU.\n");
1791b725ae77Skettenis #endif
1792b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_Info, ADP_Info_MMU, arg1);
1793b725ae77Skettenis
1794b725ae77Skettenis case RDIInfo_SemiHosting:
1795b725ae77Skettenis #ifdef DEBUG
1796b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_SemiHosting.\n");
1797b725ae77Skettenis #endif
1798b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Info, ADP_Info_SemiHosting);
1799b725ae77Skettenis
1800b725ae77Skettenis case RDIInfo_CoPro:
1801b725ae77Skettenis #ifdef DEBUG
1802b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_CoPro.\n");
1803b725ae77Skettenis #endif
1804b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Info, ADP_Info_CoPro);
1805b725ae77Skettenis
1806b725ae77Skettenis case RDICycles:
1807b725ae77Skettenis #ifdef DEBUG
1808b725ae77Skettenis angel_DebugPrint("DEBUG: RDICycles.\n");
1809b725ae77Skettenis #endif
1810b725ae77Skettenis register_debug_message_handler();
1811b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w", ADP_Info | HtoT, 0,
1812b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown, ADP_Info_Cycles);
1813b725ae77Skettenis reason = ADP_Info |TtoH;
1814b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1815b725ae77Skettenis &status, &packet);
1816b725ae77Skettenis if (err != RDIError_NoError) {
1817b725ae77Skettenis DevSW_FreePacket(packet);
1818b725ae77Skettenis return err;
1819b725ae77Skettenis }
1820b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,
1821b725ae77Skettenis &OSinfo1, &OSinfo2, &subreason, &status);
1822b725ae77Skettenis DevSW_FreePacket(packet);
1823b725ae77Skettenis if (subreason != ADP_Info_Cycles)
1824b725ae77Skettenis return RDIError_Error;
1825b725ae77Skettenis if (status != RDIError_NoError) return status;
1826b725ae77Skettenis for (c=0; c<12; c++)
1827b725ae77Skettenis arg1[c]=GET32LE(BUFFERDATA(packet->pk_buffer)+24+(c*4));
1828b725ae77Skettenis return status;
1829b725ae77Skettenis
1830b725ae77Skettenis case RDIInfo_DescribeCoPro:
1831b725ae77Skettenis #ifdef DEBUG
1832b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_DescribeCoPro.\n");
1833b725ae77Skettenis #endif
1834b725ae77Skettenis cpnum = *(int *)arg1;
1835b725ae77Skettenis cpd = (struct Dbg_CoProDesc *)arg2;
1836b725ae77Skettenis packet = DevSW_AllocatePacket(Armsd_BufferSize);
1837b725ae77Skettenis if (angel_RDI_info(ADP_Info_CoPro, NULL, NULL) != RDIError_NoError)
1838b725ae77Skettenis return RDIError_Error;
1839b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", ADP_Info | HtoT, 0,
1840b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
1841b725ae77Skettenis ADP_Info_DescribeCoPro);
1842b725ae77Skettenis len +=msgbuild(BUFFERDATA(packet->pk_buffer)+20, "%b%b%b%b%b", cpnum,
1843b725ae77Skettenis cpd->regdesc[cpnum].rmin, cpd->regdesc[cpnum].rmax,
1844b725ae77Skettenis cpd->regdesc[cpnum].nbytes, cpd->regdesc[cpnum].access);
1845b725ae77Skettenis if ((cpd->regdesc[cpnum].access&0x3) == 0x3){
1846b725ae77Skettenis len += msgbuild(BUFFERDATA(packet->pk_buffer)+25, "%b%b%b%b%b",
1847b725ae77Skettenis cpd->regdesc[cpnum].accessinst.cprt.read_b0,
1848b725ae77Skettenis cpd->regdesc[cpnum].accessinst.cprt.read_b1,
1849b725ae77Skettenis cpd->regdesc[cpnum].accessinst.cprt.write_b0,
1850b725ae77Skettenis cpd->regdesc[cpnum].accessinst.cprt.write_b1, 0xff);
1851b725ae77Skettenis }
1852b725ae77Skettenis else {
1853b725ae77Skettenis len += msgbuild(BUFFERDATA(packet->pk_buffer)+25, "%b%b%b%b%b%",
1854b725ae77Skettenis cpd->regdesc[cpnum].accessinst.cpdt.rdbits,
1855b725ae77Skettenis cpd->regdesc[cpnum].accessinst.cpdt.nbit,0,0, 0xff);
1856b725ae77Skettenis }
1857b725ae77Skettenis register_debug_message_handler();
1858b725ae77Skettenis packet->pk_length = len;
1859b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet); /* Transmit message. */
1860b725ae77Skettenis reason = ADP_Info |TtoH;
1861b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1862b725ae77Skettenis &status, &packet);
1863b725ae77Skettenis if (err != RDIError_NoError) {
1864b725ae77Skettenis DevSW_FreePacket(packet);
1865b725ae77Skettenis return err;
1866b725ae77Skettenis }
1867b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,
1868b725ae77Skettenis &OSinfo1, &OSinfo2, &subreason, &status);
1869b725ae77Skettenis DevSW_FreePacket(packet);
1870b725ae77Skettenis if (subreason != ADP_Info_DescribeCoPro)
1871b725ae77Skettenis return RDIError_Error;
1872b725ae77Skettenis else
1873b725ae77Skettenis return status;
1874b725ae77Skettenis
1875b725ae77Skettenis case RDIInfo_RequestCoProDesc:
1876b725ae77Skettenis #ifdef DEBUG
1877b725ae77Skettenis angel_DebugPrint("DEBUG: RDIInfo_RequestCoProDesc.\n");
1878b725ae77Skettenis #endif
1879b725ae77Skettenis cpnum = *(int *)arg1;
1880b725ae77Skettenis cpd = (struct Dbg_CoProDesc *)arg2;
1881b725ae77Skettenis packet = DevSW_AllocatePacket(Armsd_BufferSize);
1882b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", ADP_Info | HtoT, 0,
1883b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
1884b725ae77Skettenis ADP_Info_RequestCoProDesc);
1885b725ae77Skettenis len += msgbuild(BUFFERDATA(packet->pk_buffer)+20, "%b", *(int *)arg1);
1886b725ae77Skettenis packet->pk_length = len;
1887b725ae77Skettenis register_debug_message_handler();
1888b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet); /* Transmit message. */
1889b725ae77Skettenis reason = ADP_Info |TtoH;
1890b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1891b725ae77Skettenis &status, &packet);
1892b725ae77Skettenis if (err != RDIError_NoError) {
1893b725ae77Skettenis DevSW_FreePacket(packet);
1894b725ae77Skettenis return err;
1895b725ae77Skettenis }
1896b725ae77Skettenis count = unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,
1897b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status);
1898b725ae77Skettenis if (subreason != ADP_Info_RequestCoProDesc) {
1899b725ae77Skettenis DevSW_FreePacket(packet);
1900b725ae77Skettenis return RDIError_Error;
1901b725ae77Skettenis } else if ( status != RDIError_NoError ) {
1902b725ae77Skettenis DevSW_FreePacket(packet);
1903b725ae77Skettenis return status;
1904b725ae77Skettenis } else {
1905b725ae77Skettenis bp = BUFFERDATA(packet->pk_buffer)+count;
1906b725ae77Skettenis for ( i = 0; *bp != 0xFF && i < cpd->entries; ++i ) {
1907b725ae77Skettenis cpd->regdesc[i].rmin = *bp++;
1908b725ae77Skettenis cpd->regdesc[i].rmax = *bp++;
1909b725ae77Skettenis cpd->regdesc[i].nbytes = *bp++;
1910b725ae77Skettenis cpd->regdesc[i].access = *bp++;
1911b725ae77Skettenis }
1912b725ae77Skettenis cpd->entries = i;
1913b725ae77Skettenis if ( *bp != 0xFF )
1914b725ae77Skettenis status = RDIError_BufferFull;
1915b725ae77Skettenis else
1916b725ae77Skettenis SetCPWords( cpnum, cpd );
1917b725ae77Skettenis DevSW_FreePacket(packet);
1918b725ae77Skettenis return status;
1919b725ae77Skettenis }
1920b725ae77Skettenis
1921b725ae77Skettenis case RDIInfo_GetLoadSize:
1922b725ae77Skettenis #ifdef DEBUG
1923b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Info_AngelBufferSize.\n");
1924b725ae77Skettenis #endif
1925b725ae77Skettenis register_debug_message_handler();
1926b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w", ADP_Info | HtoT, 0,
1927b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
1928b725ae77Skettenis ADP_Info_AngelBufferSize);
1929b725ae77Skettenis reason = ADP_Info |TtoH;
1930b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
1931b725ae77Skettenis &status, &packet);
1932b725ae77Skettenis if (err != RDIError_NoError) {
1933b725ae77Skettenis DevSW_FreePacket(packet);
1934b725ae77Skettenis return err;
1935b725ae77Skettenis }
1936b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,
1937b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status);
1938b725ae77Skettenis if (subreason != ADP_Info_AngelBufferSize) {
1939b725ae77Skettenis DevSW_FreePacket(packet);
1940b725ae77Skettenis return RDIError_Error;
1941b725ae77Skettenis }
1942b725ae77Skettenis else {
1943b725ae77Skettenis word defaultsize, longsize;
1944b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer)+24, "%w%w",
1945b725ae77Skettenis &defaultsize, &longsize);
1946b725ae77Skettenis *arg1 = longsize - ADP_WriteHeaderSize; /* space for ADP header */
1947b725ae77Skettenis #ifdef MONITOR_DOWNLOAD_PACKETS
1948b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Info_AngelBufferSize: got (%d, %d), returning %d.\n",
1949b725ae77Skettenis defaultsize, longsize, *arg1);
1950b725ae77Skettenis #endif
1951b725ae77Skettenis DevSW_FreePacket(packet);
1952b725ae77Skettenis return status;
1953b725ae77Skettenis }
1954b725ae77Skettenis
1955b725ae77Skettenis case RDIVector_Catch:
1956b725ae77Skettenis #ifdef DEBUG
1957b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_VectorCatch %lx.\n", *arg1);
1958b725ae77Skettenis #endif
1959b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_VectorCatch, *arg1);
1960b725ae77Skettenis
1961b725ae77Skettenis case RDISemiHosting_SetState:
1962b725ae77Skettenis #ifdef DEBUG
1963b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetState %lx.\n", *arg1);
1964b725ae77Skettenis #endif
1965b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetState, *arg1);
1966b725ae77Skettenis
1967b725ae77Skettenis case RDISemiHosting_GetState:
1968b725ae77Skettenis #ifdef DEBUG
1969b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetState.\n");
1970b725ae77Skettenis #endif
1971b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetState, arg1);
1972b725ae77Skettenis
1973b725ae77Skettenis case RDISemiHosting_SetVector:
1974b725ae77Skettenis #ifdef DEBUG
1975b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetVector %lx.\n", *arg1);
1976b725ae77Skettenis #endif
1977b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetVector, *arg1);
1978b725ae77Skettenis
1979b725ae77Skettenis case RDISemiHosting_GetVector:
1980b725ae77Skettenis #ifdef DEBUG
1981b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetVector.\n");
1982b725ae77Skettenis #endif
1983b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetVector, arg1);
1984b725ae77Skettenis
1985b725ae77Skettenis case RDISemiHosting_SetARMSWI:
1986b725ae77Skettenis #ifdef DEBUG
1987b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetARMSWI.\n");
1988b725ae77Skettenis #endif
1989b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetARMSWI, *arg1);
1990b725ae77Skettenis
1991b725ae77Skettenis case RDISemiHosting_GetARMSWI:
1992b725ae77Skettenis #ifdef DEBUG
1993b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetARMSWI.\n");
1994b725ae77Skettenis #endif
1995b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetARMSWI, arg1);
1996b725ae77Skettenis
1997b725ae77Skettenis case RDISemiHosting_SetThumbSWI:
1998b725ae77Skettenis #ifdef DEBUG
1999b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetThumbSWI.\n");
2000b725ae77Skettenis #endif
2001b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetThumbSWI, *arg1);
2002b725ae77Skettenis
2003b725ae77Skettenis case RDISemiHosting_GetThumbSWI:
2004b725ae77Skettenis #ifdef DEBUG
2005b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetThumbSWI.\n");
2006b725ae77Skettenis #endif
2007b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetThumbSWI, arg1);
2008b725ae77Skettenis
2009b725ae77Skettenis case RDIInfo_SetTopMem:
2010b725ae77Skettenis #ifdef DEBUG
2011b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_SetTopMem.\n");
2012b725ae77Skettenis #endif
2013b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SetTopMem, *arg1);
2014b725ae77Skettenis
2015b725ae77Skettenis case RDIPointStatus_Watch:
2016b725ae77Skettenis #ifdef DEBUG
2017b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_PointStatus_Watch.\n");
2018b725ae77Skettenis #endif
2019b725ae77Skettenis register_debug_message_handler();
2020b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_Control | HtoT, 0,
2021b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2022b725ae77Skettenis ADP_Ctrl_PointStatus_Watch, *arg1 );
2023b725ae77Skettenis reason = ADP_Control |TtoH;
2024b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2025b725ae77Skettenis &status, &packet);
2026b725ae77Skettenis if (err != RDIError_NoError) {
2027b725ae77Skettenis DevSW_FreePacket(packet);
2028b725ae77Skettenis return err;
2029b725ae77Skettenis }
2030b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w", &reason,
2031b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status,
2032b725ae77Skettenis arg1, arg2);
2033b725ae77Skettenis if (subreason != ADP_Ctrl_PointStatus_Watch) {
2034b725ae77Skettenis DevSW_FreePacket(packet);
2035b725ae77Skettenis return RDIError_Error;
2036b725ae77Skettenis }
2037b725ae77Skettenis else
2038b725ae77Skettenis return status;
2039b725ae77Skettenis
2040b725ae77Skettenis case RDIPointStatus_Break:
2041b725ae77Skettenis #ifdef DEBUG
2042b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_PointStatus_Break.\n");
2043b725ae77Skettenis #endif
2044b725ae77Skettenis register_debug_message_handler();
2045b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_Control | HtoT, 0,
2046b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2047b725ae77Skettenis ADP_Ctrl_PointStatus_Break, *arg1 );
2048b725ae77Skettenis reason = ADP_Control |TtoH;
2049b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2050b725ae77Skettenis &status, &packet);
2051b725ae77Skettenis if (err != RDIError_NoError) {
2052b725ae77Skettenis DevSW_FreePacket(packet);
2053b725ae77Skettenis return err;
2054b725ae77Skettenis }
2055b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w", &reason,
2056b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status,
2057b725ae77Skettenis arg1, arg2);
2058b725ae77Skettenis if (subreason != ADP_Ctrl_PointStatus_Break) {
2059b725ae77Skettenis DevSW_FreePacket(packet);
2060b725ae77Skettenis return RDIError_Error;
2061b725ae77Skettenis }
2062b725ae77Skettenis else
2063b725ae77Skettenis return status;
2064b725ae77Skettenis
2065b725ae77Skettenis case RDIInfo_DownLoad:
2066b725ae77Skettenis #ifdef DEBUG
2067b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Ctrl_Download_Supported.\n");
2068b725ae77Skettenis #endif
2069b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Control, ADP_Ctrl_Download_Supported);
2070b725ae77Skettenis
2071b725ae77Skettenis case RDIConfig_Count:
2072b725ae77Skettenis #ifdef DEBUG
2073b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEM_ConfigCount.\n");
2074b725ae77Skettenis #endif
2075b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_ICEman, ADP_ICEM_ConfigCount, arg1);
2076b725ae77Skettenis
2077b725ae77Skettenis case RDIConfig_Nth:
2078b725ae77Skettenis #ifdef DEBUG
2079b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEM_ConfigNth.\n");
2080b725ae77Skettenis #endif
2081b725ae77Skettenis register_debug_message_handler();
2082b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_ICEman | HtoT, 0,
2083b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2084b725ae77Skettenis ADP_ICEM_ConfigNth, *arg1 );
2085b725ae77Skettenis reason = ADP_ICEman |TtoH;
2086b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2087b725ae77Skettenis &status, &packet);
2088b725ae77Skettenis if (err != RDIError_NoError) {
2089b725ae77Skettenis DevSW_FreePacket(packet);
2090b725ae77Skettenis return err;
2091b725ae77Skettenis } else {
2092b725ae77Skettenis RDI_ConfigDesc *cd = (RDI_ConfigDesc *)arg2;
2093b725ae77Skettenis unsigned char n;
2094b725ae77Skettenis len = unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%b",
2095b725ae77Skettenis &reason, &debugID,
2096b725ae77Skettenis &OSinfo1, &OSinfo2, &subreason, &status,
2097b725ae77Skettenis &cd->version, &n);
2098b725ae77Skettenis if (subreason != ADP_ICEM_ConfigNth) {
2099b725ae77Skettenis DevSW_FreePacket(packet);
2100b725ae77Skettenis return RDIError_Error;
2101b725ae77Skettenis }
2102b725ae77Skettenis else {
2103b725ae77Skettenis memcpy( cd->name, BUFFERDATA(packet->pk_buffer)+len, n+1 );
2104b725ae77Skettenis cd->name[n] = 0;
2105b725ae77Skettenis return status;
2106b725ae77Skettenis }
2107b725ae77Skettenis }
2108b725ae77Skettenis
2109b725ae77Skettenis case RDIInfo_Icebreaker:
2110b725ae77Skettenis #ifdef DEBUG
2111b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEB_Exists.\n");
2112b725ae77Skettenis #endif
2113b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_ICEbreakerHADP, ADP_ICEB_Exists);
2114b725ae77Skettenis
2115b725ae77Skettenis case RDIIcebreaker_GetLocks:
2116b725ae77Skettenis #ifdef DEBUG
2117b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEB_GetLocks.\n");
2118b725ae77Skettenis #endif
2119b725ae77Skettenis return SendSubMessageGetWordAndCheckReply(ADP_ICEbreakerHADP, ADP_ICEB_GetLocks, arg1);
2120b725ae77Skettenis
2121b725ae77Skettenis case RDIIcebreaker_SetLocks:
2122b725ae77Skettenis #ifdef DEBUG
2123b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEB_SetLocks.\n");
2124b725ae77Skettenis #endif
2125b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_ICEbreakerHADP, ADP_ICEB_SetLocks, *arg1);
2126b725ae77Skettenis
2127b725ae77Skettenis case RDICommsChannel_ToHost:
2128b725ae77Skettenis #ifdef DEBUG
2129b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEB_CC_Connect_ToHost.\n");
2130b725ae77Skettenis #endif
2131b725ae77Skettenis if ( angel_cc_exists() == RDIError_NoError ) {
2132b725ae77Skettenis
2133b725ae77Skettenis /*
2134b725ae77Skettenis * The following three lines of code have to be removed in order to get
2135b725ae77Skettenis * the Windows Angel Channel Viewer working with the Thumb comms channel.
2136b725ae77Skettenis * At the moment it allows the ARMSD command line to register a CCIN/CCOUT
2137b725ae77Skettenis * callback which stops the ACV working!
2138b725ae77Skettenis */
2139b725ae77Skettenis #ifdef __unix
2140b725ae77Skettenis ccstate.tohost = (RDICCProc_ToHost *)arg1;
2141b725ae77Skettenis ccstate.tohostarg = arg2;
2142b725ae77Skettenis angel_check_DCC_handler( &ccstate );
2143b725ae77Skettenis #endif
2144b725ae77Skettenis #ifdef _WIN32
2145b725ae77Skettenis
2146b725ae77Skettenis #endif
2147b725ae77Skettenis
2148b725ae77Skettenis register_debug_message_handler();
2149b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%b", ADP_ICEbreakerHADP | HtoT, 0,
2150b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2151b725ae77Skettenis ADP_ICEB_CC_Connect_ToHost, (arg1 != NULL) );
2152b725ae77Skettenis return CheckSubMessageReply(ADP_ICEbreakerHADP, ADP_ICEB_CC_Connect_ToHost);
2153b725ae77Skettenis } else {
2154b725ae77Skettenis return RDIError_UnimplementedMessage;
2155b725ae77Skettenis }
2156b725ae77Skettenis
2157b725ae77Skettenis case RDICommsChannel_FromHost:
2158b725ae77Skettenis #ifdef DEBUG
2159b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_ICEB_CC_Connect_FromHost.\n");
2160b725ae77Skettenis #endif
2161b725ae77Skettenis if ( angel_cc_exists() == RDIError_NoError ) {
2162b725ae77Skettenis
2163b725ae77Skettenis ccstate.fromhost = (RDICCProc_FromHost *)arg1;
2164b725ae77Skettenis ccstate.fromhostarg = arg2;
2165b725ae77Skettenis angel_check_DCC_handler( &ccstate );
2166b725ae77Skettenis
2167b725ae77Skettenis register_debug_message_handler();
2168b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%b", ADP_ICEbreakerHADP | HtoT, 0,
2169b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2170b725ae77Skettenis ADP_ICEB_CC_Connect_FromHost, (arg1 != NULL) );
2171b725ae77Skettenis return CheckSubMessageReply(ADP_ICEbreakerHADP, ADP_ICEB_CC_Connect_FromHost);
2172b725ae77Skettenis } else {
2173b725ae77Skettenis return RDIError_UnimplementedMessage;
2174b725ae77Skettenis }
2175b725ae77Skettenis
2176b725ae77Skettenis case RDIProfile_Stop:
2177b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Profile, ADP_Profile_Stop);
2178b725ae77Skettenis
2179b725ae77Skettenis case RDIProfile_ClearCounts:
2180b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Profile, ADP_Profile_ClearCounts);
2181b725ae77Skettenis
2182b725ae77Skettenis case RDIProfile_Start:
2183b725ae77Skettenis #ifdef DEBUG
2184b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Profile_Start %ld.\n", (long)*arg1);
2185b725ae77Skettenis #endif
2186b725ae77Skettenis return SendSubMessageWordAndCheckReply(ADP_Profile, ADP_Profile_Start, *arg1);
2187b725ae77Skettenis
2188b725ae77Skettenis case RDIProfile_WriteMap:
2189b725ae77Skettenis { RDI_ProfileMap *map = (RDI_ProfileMap *)arg1;
2190b725ae77Skettenis int32 maplen = map->len,
2191b725ae77Skettenis offset,
2192b725ae77Skettenis size;
2193b725ae77Skettenis int32 chunk = (Armsd_LongBufSize-CHAN_HEADER_SIZE-ADP_ProfileWriteHeaderSize) / sizeof(ARMword);
2194b725ae77Skettenis /* Maximum number of words sendable in one message */
2195b725ae77Skettenis int oldrev = bytesex_reversing();
2196b725ae77Skettenis int host_little = *(uint8 const *)&hostsex;
2197b725ae77Skettenis #ifdef DEBUG
2198b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Profile_WriteMap %ld.\n", maplen);
2199b725ae77Skettenis #endif
2200b725ae77Skettenis status = RDIError_NoError;
2201b725ae77Skettenis if (!host_little) {
2202b725ae77Skettenis bytesex_reverse(1);
2203b725ae77Skettenis for (offset = 0; offset < maplen; offset++)
2204b725ae77Skettenis map->map[offset] = bytesex_hostval(map->map[offset]);
2205b725ae77Skettenis }
2206b725ae77Skettenis for (offset = 0; offset < maplen; offset += size) {
2207b725ae77Skettenis unsigned hdrlen;
2208b725ae77Skettenis size = maplen - offset;
2209b725ae77Skettenis packet = (Packet *)DevSW_AllocatePacket(Armsd_LongBufSize);
2210b725ae77Skettenis if (size > chunk) size = chunk;
2211b725ae77Skettenis hdrlen = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w",
2212b725ae77Skettenis ADP_Profile | HtoT, 0, ADP_HandleUnknown,
2213b725ae77Skettenis ADP_HandleUnknown, ADP_Profile_WriteMap,
2214b725ae77Skettenis maplen, size, offset);
2215b725ae77Skettenis
2216b725ae77Skettenis /* Copy the data into the packet. */
2217b725ae77Skettenis memcpy(BUFFERDATA(packet->pk_buffer)+hdrlen,
2218b725ae77Skettenis &map->map[offset], (size_t)size * sizeof(ARMword));
2219b725ae77Skettenis packet->pk_length = size * sizeof(ARMword) + hdrlen;
2220b725ae77Skettenis register_debug_message_handler();
2221b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet);
2222b725ae77Skettenis reason = ADP_Profile | TtoH;
2223b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2224b725ae77Skettenis &status, &packet);
2225b725ae77Skettenis if (err == RDIError_NoError) {
2226b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,
2227b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status);
2228b725ae77Skettenis if (subreason != ADP_Profile_WriteMap) {
2229b725ae77Skettenis err = RDIError_Error;
2230b725ae77Skettenis }
2231b725ae77Skettenis DevSW_FreePacket(packet);
2232b725ae77Skettenis }
2233b725ae77Skettenis if (err != RDIError_NoError) { status = err; break; }
2234b725ae77Skettenis }
2235b725ae77Skettenis if (!host_little) {
2236b725ae77Skettenis for (offset = 0; offset < maplen; offset++)
2237b725ae77Skettenis map->map[offset] = bytesex_hostval(map->map[offset]);
2238b725ae77Skettenis bytesex_reverse(oldrev);
2239b725ae77Skettenis }
2240b725ae77Skettenis return status;
2241b725ae77Skettenis }
2242b725ae77Skettenis
2243b725ae77Skettenis case RDIProfile_ReadMap:
2244b725ae77Skettenis { int32 maplen = *(int32 *)arg1,
2245b725ae77Skettenis offset = 0,
2246b725ae77Skettenis size;
2247b725ae77Skettenis int32 chunk = (Armsd_BufferSize-CHAN_HEADER_SIZE-ADP_ProfileReadHeaderSize) / sizeof(ARMword);
2248b725ae77Skettenis #ifdef DEBUG
2249b725ae77Skettenis angel_DebugPrint("DEBUG: ADP_Profile_ReadMap %ld.\n", maplen);
2250b725ae77Skettenis #endif
2251b725ae77Skettenis status = RDIError_NoError;
2252b725ae77Skettenis for (offset = 0; offset < maplen; offset += size) {
2253b725ae77Skettenis size = maplen - offset;
2254b725ae77Skettenis if (size > chunk) size = chunk;
2255b725ae77Skettenis register_debug_message_handler();
2256b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w%w", ADP_Profile | HtoT, 0,
2257b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2258b725ae77Skettenis ADP_Profile_ReadMap, offset, size);
2259b725ae77Skettenis reason = ADP_Profile | TtoH;
2260b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2261b725ae77Skettenis &status, &packet);
2262b725ae77Skettenis if (err != RDIError_NoError) return err;
2263b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,
2264b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status);
2265b725ae77Skettenis memcpy(&arg2[offset], BUFFERDATA(packet->pk_buffer)+ADP_ProfileReadHeaderSize,
2266b725ae77Skettenis size * sizeof(ARMword));
2267b725ae77Skettenis DevSW_FreePacket(packet);
2268b725ae77Skettenis if (status != RDIError_NoError) break;
2269b725ae77Skettenis }
2270b725ae77Skettenis { int oldrev = bytesex_reversing();
2271b725ae77Skettenis int host_little = *(uint8 const *)&hostsex;
2272b725ae77Skettenis if (!host_little) {
2273b725ae77Skettenis bytesex_reverse(1);
2274b725ae77Skettenis for (offset = 0; offset < maplen; offset++)
2275b725ae77Skettenis arg2[offset] = bytesex_hostval(arg2[offset]);
2276b725ae77Skettenis }
2277b725ae77Skettenis bytesex_reverse(oldrev);
2278b725ae77Skettenis }
2279b725ae77Skettenis return status;
2280b725ae77Skettenis }
2281b725ae77Skettenis
2282b725ae77Skettenis case RDIInfo_CanTargetExecute:
2283b725ae77Skettenis #ifdef DEBUG
2284b725ae77Skettenis printf("DEBUG: RDIInfo_CanTargetExecute.\n");
2285b725ae77Skettenis #endif
2286b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Info, ADP_Info_CanTargetExecute);
2287b725ae77Skettenis
2288b725ae77Skettenis case RDIInfo_AgentEndianess:
2289b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Info, ADP_Info_AgentEndianess);
2290b725ae77Skettenis
2291b725ae77Skettenis default:
2292b725ae77Skettenis #ifdef DEBUG
2293b725ae77Skettenis angel_DebugPrint("DEBUG: Fell through ADP_Info, default case taken.\n");
2294b725ae77Skettenis angel_DebugPrint("DEBUG: type = 0x%x.\n", type);
2295b725ae77Skettenis #endif
2296b725ae77Skettenis if (type & RDIInfo_CapabilityRequest) {
2297b725ae77Skettenis switch (type & ~RDIInfo_CapabilityRequest) {
2298b725ae77Skettenis case RDISemiHosting_SetARMSWI:
2299b725ae77Skettenis return SendSubMessageAndCheckReply(ADP_Info, ADP_Info_ChangeableSHSWI);
2300b725ae77Skettenis default:
2301b725ae77Skettenis #ifdef DEBUG
2302b725ae77Skettenis angel_DebugPrint(
2303b725ae77Skettenis "DEBUG: ADP_Info - Capability Request(%d) - reporting unimplemented \n",
2304b725ae77Skettenis type & ~RDIInfo_CapabilityRequest);
2305b725ae77Skettenis #endif
2306b725ae77Skettenis break;
2307b725ae77Skettenis }
2308b725ae77Skettenis }
2309b725ae77Skettenis return RDIError_UnimplementedMessage;
2310b725ae77Skettenis }
2311b725ae77Skettenis }
2312b725ae77Skettenis
2313b725ae77Skettenis
2314b725ae77Skettenis /*----------------------------------------------------------------------*/
2315b725ae77Skettenis /*----angel_RDI_AddConfig------------------------------------------------*/
2316b725ae77Skettenis /*----------------------------------------------------------------------*/
2317b725ae77Skettenis
2318b725ae77Skettenis /* Add a configuration: use ADP_ICEM_AddConfig. */
angel_RDI_AddConfig(unsigned long nbytes)2319b725ae77Skettenis int angel_RDI_AddConfig(unsigned long nbytes) {
2320b725ae77Skettenis Packet *packet = NULL;
2321b725ae77Skettenis int status, reason, subreason, debugID, OSinfo1, OSinfo2, err;
2322b725ae77Skettenis
2323b725ae77Skettenis #ifdef DEBUG
2324b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_AddConfig.\n");
2325b725ae77Skettenis #endif
2326b725ae77Skettenis register_debug_message_handler();
2327b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_ICEman | HtoT,
2328b725ae77Skettenis 0, ADP_HandleUnknown, ADP_HandleUnknown,
2329b725ae77Skettenis ADP_ICEM_AddConfig, nbytes);
2330b725ae77Skettenis reason=ADP_ICEman | TtoH;
2331b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2332b725ae77Skettenis &status, &packet);
2333b725ae77Skettenis if (err != RDIError_NoError) {
2334b725ae77Skettenis DevSW_FreePacket(packet);
2335b725ae77Skettenis return -1;
2336b725ae77Skettenis }
2337b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,
2338b725ae77Skettenis &OSinfo1, &OSinfo2, &subreason, &status);
2339b725ae77Skettenis DevSW_FreePacket(packet);
2340b725ae77Skettenis if ( subreason != ADP_ICEM_AddConfig )
2341b725ae77Skettenis return RDIError_Error;
2342b725ae77Skettenis else
2343b725ae77Skettenis return status;
2344b725ae77Skettenis }
2345b725ae77Skettenis
2346b725ae77Skettenis
2347b725ae77Skettenis /*----------------------------------------------------------------------*/
2348b725ae77Skettenis /*----angel_RDI_LoadConfigData-------------------------------------------*/
2349b725ae77Skettenis /*----------------------------------------------------------------------*/
2350b725ae77Skettenis
2351b725ae77Skettenis /* Load configuration data: use ADP_Ctrl_Download_Data. */
angel_RDI_LoadConfigData(unsigned long nbytes,char const * data)2352b725ae77Skettenis int angel_RDI_LoadConfigData(unsigned long nbytes, char const *data) {
2353b725ae77Skettenis Packet *packet = NULL;
2354b725ae77Skettenis int len, status, reason, subreason, debugID, OSinfo1, OSinfo2, err;
2355b725ae77Skettenis
2356b725ae77Skettenis #ifdef DEBUG
2357b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_LoadConfigData (%d bytes)\n", nbytes);
2358b725ae77Skettenis #endif
2359b725ae77Skettenis #if 0
2360b725ae77Skettenis if (err = angel_RDI_AddConfig(nbytes) != RDIError_NoError)
2361b725ae77Skettenis return err;
2362b725ae77Skettenis #endif
2363b725ae77Skettenis packet = DevSW_AllocatePacket(Armsd_LongBufSize);
2364b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w",
2365b725ae77Skettenis ADP_Control | HtoT, 0,
2366b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2367b725ae77Skettenis ADP_Ctrl_Download_Data, nbytes);
2368b725ae77Skettenis memcpy(BUFFERDATA(packet->pk_buffer)+len, data, nbytes);
2369b725ae77Skettenis len += nbytes;
2370b725ae77Skettenis packet->pk_length = len;
2371b725ae77Skettenis #ifdef DEBUG
2372b725ae77Skettenis angel_DebugPrint("DEBUG: packet len %d.\n", len);
2373b725ae77Skettenis #endif
2374b725ae77Skettenis register_debug_message_handler();
2375b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet);
2376b725ae77Skettenis reason=ADP_Control | TtoH;
2377b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2378b725ae77Skettenis &status, &packet);
2379b725ae77Skettenis if (err != RDIError_NoError) {
2380b725ae77Skettenis DevSW_FreePacket(packet);
2381b725ae77Skettenis return -1;
2382b725ae77Skettenis }
2383b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,
2384b725ae77Skettenis &OSinfo1, &OSinfo2, &subreason, &status);
2385b725ae77Skettenis DevSW_FreePacket(packet);
2386b725ae77Skettenis if ( subreason != ADP_Ctrl_Download_Data )
2387b725ae77Skettenis return RDIError_Error;
2388b725ae77Skettenis else
2389b725ae77Skettenis return status;
2390b725ae77Skettenis }
2391b725ae77Skettenis
2392b725ae77Skettenis
2393b725ae77Skettenis /*----------------------------------------------------------------------*/
2394b725ae77Skettenis /*----angel_RDI_SelectConfig---------------------------------------------*/
2395b725ae77Skettenis /*----------------------------------------------------------------------*/
2396b725ae77Skettenis
2397b725ae77Skettenis /* Select a configuration: use ADP_ICEM_SelecConfig.*/
angel_RDI_SelectConfig(RDI_ConfigAspect aspect,char const * name,RDI_ConfigMatchType matchtype,unsigned versionreq,unsigned * versionp)2398b725ae77Skettenis int angel_RDI_SelectConfig(RDI_ConfigAspect aspect, char const *name,
2399b725ae77Skettenis RDI_ConfigMatchType matchtype, unsigned versionreq,
2400b725ae77Skettenis unsigned *versionp)
2401b725ae77Skettenis {
2402b725ae77Skettenis Packet *packet = NULL;
2403b725ae77Skettenis int len, status, reason, subreason, debugID, OSinfo1, OSinfo2, err;
2404b725ae77Skettenis
2405b725ae77Skettenis #ifdef DEBUG
2406b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_SelectConfig.\n");
2407b725ae77Skettenis #endif
2408b725ae77Skettenis packet = DevSW_AllocatePacket(Armsd_BufferSize);
2409b725ae77Skettenis len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%b%b%b%w",
2410b725ae77Skettenis ADP_ICEman | HtoT, 0,
2411b725ae77Skettenis ADP_HandleUnknown, ADP_HandleUnknown,
2412b725ae77Skettenis ADP_ICEM_SelectConfig, aspect, strlen(name),
2413b725ae77Skettenis matchtype, versionreq);
2414b725ae77Skettenis /* copy the name into the buffer */
2415b725ae77Skettenis memcpy(BUFFERDATA(packet->pk_buffer)+len, name, strlen(name));
2416b725ae77Skettenis len += strlen(name);
2417b725ae77Skettenis packet->pk_length = len;
2418b725ae77Skettenis register_debug_message_handler();
2419b725ae77Skettenis Adp_ChannelWrite(CI_HADP, packet);
2420b725ae77Skettenis reason=ADP_ICEman | TtoH;
2421b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2422b725ae77Skettenis &status, &packet);
2423b725ae77Skettenis if (err != RDIError_NoError) {
2424b725ae77Skettenis DevSW_FreePacket(packet);
2425b725ae77Skettenis return err;
2426b725ae77Skettenis }
2427b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w",
2428b725ae77Skettenis &reason, &debugID, &OSinfo1, &OSinfo2,
2429b725ae77Skettenis &subreason, &status, versionp);
2430b725ae77Skettenis DevSW_FreePacket(packet);
2431b725ae77Skettenis if ( subreason != ADP_ICEM_SelectConfig )
2432b725ae77Skettenis return RDIError_Error;
2433b725ae77Skettenis else
2434b725ae77Skettenis return status;
2435b725ae77Skettenis }
2436b725ae77Skettenis
2437b725ae77Skettenis
2438b725ae77Skettenis /*----------------------------------------------------------------------*/
2439b725ae77Skettenis /*----angel_RDI_LoadAgent------------------------------------------------*/
2440b725ae77Skettenis /*----------------------------------------------------------------------*/
2441b725ae77Skettenis
2442b725ae77Skettenis /* Load a new debug agent: use ADP_Ctrl_Download_Agent. */
angel_RDI_LoadAgent(ARMword dest,unsigned long size,getbufferproc * getb,void * getbarg)2443b725ae77Skettenis int angel_RDI_LoadAgent(ARMword dest, unsigned long size,
2444b725ae77Skettenis getbufferproc *getb, void *getbarg)
2445b725ae77Skettenis {
2446b725ae77Skettenis Packet *packet = NULL;
2447b725ae77Skettenis int status, reason, subreason, debugID, OSinfo1, OSinfo2, err;
2448b725ae77Skettenis time_t t;
2449b725ae77Skettenis
2450b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2451b725ae77Skettenis angel_DebugPrint("DEBUG: Entered angel_RDI_LoadAgent.\n");
2452b725ae77Skettenis #endif
2453b725ae77Skettenis register_debug_message_handler();
2454b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w%w", ADP_Control | HtoT,
2455b725ae77Skettenis 0, ADP_HandleUnknown, ADP_HandleUnknown,
2456b725ae77Skettenis ADP_Ctrl_Download_Agent, dest, size);
2457b725ae77Skettenis reason=ADP_Control | TtoH;
2458b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2459b725ae77Skettenis &status, &packet);
2460b725ae77Skettenis if (err != RDIError_NoError) {
2461b725ae77Skettenis DevSW_FreePacket(packet);
2462b725ae77Skettenis return -1;
2463b725ae77Skettenis }
2464b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,
2465b725ae77Skettenis &OSinfo1, &OSinfo2, &subreason, &status);
2466b725ae77Skettenis DevSW_FreePacket(packet);
2467b725ae77Skettenis if ( subreason != ADP_Ctrl_Download_Agent )
2468b725ae77Skettenis return RDIError_Error;
2469b725ae77Skettenis if ( status != RDIError_NoError )
2470b725ae77Skettenis return status;
2471b725ae77Skettenis
2472b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2473b725ae77Skettenis angel_DebugPrint("DEBUG: starting agent data download.\n");
2474b725ae77Skettenis #endif
2475b725ae77Skettenis { unsigned long pos = 0, segsize;
2476b725ae77Skettenis for (; pos < size; pos += segsize) {
2477b725ae77Skettenis char *b = getb(getbarg, &segsize);
2478b725ae77Skettenis if (b == NULL) return RDIError_NoError;
2479b725ae77Skettenis err = angel_RDI_LoadConfigData( segsize, b );
2480b725ae77Skettenis if (err != RDIError_NoError) return err;
2481b725ae77Skettenis }
2482b725ae77Skettenis }
2483b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2484b725ae77Skettenis angel_DebugPrint("DEBUG: finished downloading new agent.\n");
2485b725ae77Skettenis #endif
2486b725ae77Skettenis
2487b725ae77Skettenis /* renegotiate back down */
2488b725ae77Skettenis err = angel_negotiate_defaults();
2489b725ae77Skettenis if (err != adp_ok)
2490b725ae77Skettenis return err;
2491b725ae77Skettenis
2492b725ae77Skettenis /* Output a message to tell the user what is going on. This is vital
2493b725ae77Skettenis * when switching from ADP EICE to ADP over JTAG, as then the user
2494b725ae77Skettenis * has to reset the target board !
2495b725ae77Skettenis */
2496b725ae77Skettenis { char msg[256];
2497b725ae77Skettenis int len=angel_RDI_errmess(msg, 256, adp_new_agent_starting);
2498b725ae77Skettenis angel_hostif->write(angel_hostif->hostosarg, msg, len);
2499b725ae77Skettenis }
2500b725ae77Skettenis
2501b725ae77Skettenis /* get new image started */
2502b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2503b725ae77Skettenis angel_DebugPrint("DEBUG: sending start message for new agent.\n");
2504b725ae77Skettenis #endif
2505b725ae77Skettenis
2506b725ae77Skettenis register_debug_message_handler();
2507b725ae77Skettenis msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_Control | HtoT,
2508b725ae77Skettenis 0, ADP_HandleUnknown, ADP_HandleUnknown,
2509b725ae77Skettenis ADP_Ctrl_Start_Agent, dest);
2510b725ae77Skettenis reason=ADP_Control | TtoH;
2511b725ae77Skettenis err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,
2512b725ae77Skettenis &status, &packet);
2513b725ae77Skettenis if (err != RDIError_NoError) {
2514b725ae77Skettenis DevSW_FreePacket(packet);
2515b725ae77Skettenis return -1;
2516b725ae77Skettenis }
2517b725ae77Skettenis unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,
2518b725ae77Skettenis &debugID, &OSinfo1, &OSinfo2, &subreason, &status);
2519b725ae77Skettenis DevSW_FreePacket(packet);
2520b725ae77Skettenis if ( subreason != ADP_Ctrl_Start_Agent )
2521b725ae77Skettenis return RDIError_Error;
2522b725ae77Skettenis if ( status != RDIError_NoError )
2523b725ae77Skettenis return status;
2524b725ae77Skettenis
2525b725ae77Skettenis /* wait for image to start up */
2526b725ae77Skettenis heartbeat_enabled = FALSE;
2527b725ae77Skettenis t=time(NULL);
2528b725ae77Skettenis do {
2529b725ae77Skettenis Adp_AsynchronousProcessing(async_block_on_nothing);
2530b725ae77Skettenis if ((time(NULL)-t) > 2) {
2531b725ae77Skettenis #ifdef DEBUG
2532b725ae77Skettenis angel_DebugPrint("DEBUG: no booted message from new image yet.\n");
2533b725ae77Skettenis #endif
2534b725ae77Skettenis break;
2535b725ae77Skettenis }
2536b725ae77Skettenis } while (booted_not_received);
2537b725ae77Skettenis booted_not_received=1;
2538b725ae77Skettenis
2539b725ae77Skettenis /* Give device driver a chance to do any necessary resyncing with new agent.
2540b725ae77Skettenis * Only used by etherdrv.c at the moment.
2541b725ae77Skettenis */
2542b725ae77Skettenis (void)Adp_Ioctl( DC_RESYNC, NULL );
2543b725ae77Skettenis
2544b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2545b725ae77Skettenis angel_DebugPrint("DEBUG: reopening to new agent.\n");
2546b725ae77Skettenis #endif
2547b725ae77Skettenis err = angel_RDI_open(0, NULL, NULL, NULL);
2548b725ae77Skettenis switch ( err )
2549b725ae77Skettenis {
2550b725ae77Skettenis case RDIError_NoError:
2551b725ae77Skettenis {
2552b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2553b725ae77Skettenis angel_DebugPrint( "LoadAgent: Open returned RDIError_NoError\n" );
2554b725ae77Skettenis #endif
2555b725ae77Skettenis break;
2556b725ae77Skettenis }
2557b725ae77Skettenis
2558b725ae77Skettenis case RDIError_LittleEndian:
2559b725ae77Skettenis {
2560b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2561b725ae77Skettenis angel_DebugPrint( "LoadAgent: Open returned RDIError_LittleEndian (OK)\n" );
2562b725ae77Skettenis #endif
2563b725ae77Skettenis err = RDIError_NoError;
2564b725ae77Skettenis break;
2565b725ae77Skettenis }
2566b725ae77Skettenis
2567b725ae77Skettenis case RDIError_BigEndian:
2568b725ae77Skettenis {
2569b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2570b725ae77Skettenis angel_DebugPrint( "LoadAgent: Open returned RDIError_BigEndian (OK)\n" );
2571b725ae77Skettenis #endif
2572b725ae77Skettenis err = RDIError_NoError;
2573b725ae77Skettenis break;
2574b725ae77Skettenis }
2575b725ae77Skettenis
2576b725ae77Skettenis default:
2577b725ae77Skettenis {
2578b725ae77Skettenis #if defined(DEBUG) || defined(DEBUG_LOADAGENT)
2579b725ae77Skettenis angel_DebugPrint( "LoadAgent: Open returned %d - unexpected!\n", err );
2580b725ae77Skettenis #endif
2581b725ae77Skettenis break;
2582b725ae77Skettenis }
2583b725ae77Skettenis }
2584b725ae77Skettenis #ifndef NO_HEARTBEAT
2585b725ae77Skettenis heartbeat_enabled = TRUE;
2586b725ae77Skettenis #endif
2587b725ae77Skettenis return err;
2588b725ae77Skettenis }
2589b725ae77Skettenis
angel_RDI_errmess(char * buf,int blen,int errnum)2590b725ae77Skettenis static int angel_RDI_errmess(char *buf, int blen, int errnum) {
2591b725ae77Skettenis char *s=NULL;
2592b725ae77Skettenis int n;
2593b725ae77Skettenis
2594b725ae77Skettenis switch (errnum) {
2595b725ae77Skettenis case adp_malloc_failure:
2596b725ae77Skettenis s=AdpMess_MallocFailed; break;
2597b725ae77Skettenis case adp_illegal_args:
2598b725ae77Skettenis s=AdpMess_IllegalArgs; break;
2599b725ae77Skettenis case adp_device_not_found:
2600b725ae77Skettenis s=AdpMess_DeviceNotFound; break;
2601b725ae77Skettenis case adp_device_open_failed:
2602b725ae77Skettenis s=AdpMess_DeviceOpenFailed; break;
2603b725ae77Skettenis case adp_device_already_open:
2604b725ae77Skettenis s=AdpMess_DeviceAlreadyOpen; break;
2605b725ae77Skettenis case adp_device_not_open:
2606b725ae77Skettenis s=AdpMess_DeviceNotOpen; break;
2607b725ae77Skettenis case adp_bad_channel_id:
2608b725ae77Skettenis s=AdpMess_BadChannelId; break;
2609b725ae77Skettenis case adp_callback_already_registered:
2610b725ae77Skettenis s=AdpMess_CBAlreadyRegd; break;
2611b725ae77Skettenis case adp_write_busy:
2612b725ae77Skettenis s=AdpMess_WriteBusy; break;
2613b725ae77Skettenis case adp_bad_packet:
2614b725ae77Skettenis s=AdpMess_BadPacket; break;
2615b725ae77Skettenis case adp_seq_high:
2616b725ae77Skettenis s=AdpMess_SeqHigh; break;
2617b725ae77Skettenis case adp_seq_low:
2618b725ae77Skettenis s=AdpMess_SeqLow; break;
2619b725ae77Skettenis case adp_timeout_on_open:
2620b725ae77Skettenis s=AdpMess_TimeoutOnOpen; break;
2621b725ae77Skettenis case adp_failed:
2622b725ae77Skettenis s=AdpMess_Failed; break;
2623b725ae77Skettenis case adp_abandon_boot_wait:
2624b725ae77Skettenis s=AdpMess_AbandonBootWait; break;
2625b725ae77Skettenis case adp_late_startup:
2626b725ae77Skettenis s=AdpMess_LateStartup; break;
2627b725ae77Skettenis case adp_new_agent_starting:
2628b725ae77Skettenis s=AdpMess_NewAgentStarting; break;
2629b725ae77Skettenis default: return 0;
2630b725ae77Skettenis }
2631b725ae77Skettenis n=strlen(s);
2632b725ae77Skettenis if (n>blen-1) n=blen-1;
2633b725ae77Skettenis memcpy(buf, s, n);
2634b725ae77Skettenis buf[n++]=0;
2635b725ae77Skettenis return n;
2636b725ae77Skettenis }
2637b725ae77Skettenis
2638b725ae77Skettenis extern const struct RDIProcVec angel_rdi;
2639b725ae77Skettenis const struct RDIProcVec angel_rdi = {
2640b725ae77Skettenis "ADP",
2641b725ae77Skettenis angel_RDI_open,
2642b725ae77Skettenis angel_RDI_close,
2643b725ae77Skettenis angel_RDI_read,
2644b725ae77Skettenis angel_RDI_write,
2645b725ae77Skettenis angel_RDI_CPUread,
2646b725ae77Skettenis angel_RDI_CPUwrite,
2647b725ae77Skettenis angel_RDI_CPread,
2648b725ae77Skettenis angel_RDI_CPwrite,
2649b725ae77Skettenis angel_RDI_setbreak,
2650b725ae77Skettenis angel_RDI_clearbreak,
2651b725ae77Skettenis angel_RDI_setwatch,
2652b725ae77Skettenis angel_RDI_clearwatch,
2653b725ae77Skettenis angel_RDI_execute,
2654b725ae77Skettenis angel_RDI_step,
2655b725ae77Skettenis angel_RDI_info,
2656b725ae77Skettenis angel_RDI_pointinq,
2657b725ae77Skettenis
2658b725ae77Skettenis angel_RDI_AddConfig,
2659b725ae77Skettenis angel_RDI_LoadConfigData,
2660b725ae77Skettenis angel_RDI_SelectConfig,
2661b725ae77Skettenis
2662b725ae77Skettenis 0, /*angel_RDI_drivernames,*/
2663b725ae77Skettenis 0, /* cpunames */
2664b725ae77Skettenis
2665b725ae77Skettenis angel_RDI_errmess,
2666b725ae77Skettenis
2667b725ae77Skettenis angel_RDI_LoadAgent
2668b725ae77Skettenis };
2669b725ae77Skettenis
2670b725ae77Skettenis /* EOF ardi.c */
2671b725ae77Skettenis
2672b725ae77Skettenis /* Not strictly necessary, but allows linking this code into armsd. */
2673b725ae77Skettenis
2674b725ae77Skettenis struct foo {
2675b725ae77Skettenis char *name;
2676b725ae77Skettenis int (*action)();
2677b725ae77Skettenis char *syntax;
2678b725ae77Skettenis char **helpmessage;
2679b725ae77Skettenis int doafterend;
2680b725ae77Skettenis int dobeforestart;
2681b725ae77Skettenis int doinmidline;
2682b725ae77Skettenis } hostappl_CmdTable[1] = {{"", NULL}};
2683b725ae77Skettenis
2684b725ae77Skettenis void
hostappl_Init()2685b725ae77Skettenis hostappl_Init()
2686b725ae77Skettenis {
2687b725ae77Skettenis }
2688b725ae77Skettenis
2689b725ae77Skettenis int
hostappl_Backstop()2690b725ae77Skettenis hostappl_Backstop()
2691b725ae77Skettenis {
2692b725ae77Skettenis return -30;
2693b725ae77Skettenis }
2694