1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
|
/*
* Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
*
* This software may be freely used, copied, modified, and distributed
* provided that the above copyright notice is preserved in all copies of the
* software.
*/
/* sys.h
***********************************************************************
* Angel C Libary support channel protocol definitions
*
* $Revision$
* $Date$
*
*
*
*
* MESSAGE FORMAT
* --------------
* Format of the "data" section of C Lib Support Channel Messages.
* You will notice that the format is much the same as the format
* of ADP messages - this is so that multi-threaded C Libraries can
* be supported.
*
* unsigned32 reason - Main C Library reason code.
* unsigned32 debugID - Info. describing host debug world;
* private to host and used in any target
* initiated messages.
* unsigned32 OSinfo1 \ Target OS information to identify process/thread
* unsigned32 OSinfo2 / world, etc. These two fields are target defined.
* byte args[n] - Data for message "reason" code.
*
* The "debugID" is defined by the host-end of the protocol, and is used
* by the host to ensure that messages are routed to the correct handler
* program/veneer (eg. imagine several threads having opened stdout and
* each writing to a different window in a windowed debugger).
*
* NOTE: The reason that there is no "size" information, is that the
* message IDs themselves encode the format of any arguments.
*
* For further discussion of the format see adp.h
*
* N.B. All streams are little endian.
*
* CLIB REASON CODE
* ----------------
* The message reason codes contain some information that ties them to
* the channel and direction that the message will be used with. This
* will ensure that even if the message "#define name" is not
* completely descriptive, the message reason code is.
*
* b31 = direction. 0=Host-to-Target; 1=Target-to-Host;
* b30-16 = reserved. should be zero
* b15-0 = message reason code.
*
* Note that typically a request will be initiated by the target side, and
* that the host will then respond with either an acknowledgement or some
* data. In either case the same reason code will be used, but the direction
* bit will be reveresed.
*/
#ifndef __sys_h
#define __sys_h
#ifndef HtoT
#define HtoT ((unsigned)0 << 31) /* Host-to-Target message */
#define TtoH ((unsigned)1 << 31) /* Target-to-Host message */
#endif
/*
* The following are error codes used in the status field returned on
* sending a message. 0 represents no error having occurred, non-zero
* represents a general error. More codes should be added as required.
*/
#ifndef ErrCode
#define NoError 0x0
#endif
/*************************************************************************/
/* The following are direct conversions of the DeMon SWI's */
/* NB: nbytes is the number of bytes INCLUDING THE NULL character where */
/* applicable. */
/* This message is used as a response to a packet whose message
* was not understood. The return parameter, code is the reason
* code which was not understood. Although intended for use as a
* default case on a received message switch it can also be used
* as a proper message*/
#define CL_Unrecognised 0x00
/* Unrecognised()
* return(word code)
*/
/* Write a character to the terminal.
*/
#define CL_WriteC 0x01
/* WriteC(byte data)
* return(word status)
*/
/* Write a NULL terminated string of characters to the terminal. The length
* of the string excluding the NULL terminating character is passed in
* 'nbytes'.
*/
#define CL_Write0 0x02
/* Write0(word nbytes, bytes data)
* return(word status)
*/
/* Read a character from the terminal - probably the keyboard.
*/
#define CL_ReadC 0x04
/* ReadC(void)
* return(word status, byte data)
*/
/* Perform system call, pass NULL terminated string to host's command
* line interpreter(NOT AVAILABLE IN PC/DOS RELEASE). The data byte
* returned holds the return code from the system call.
*/
#define CL_System 0x05
/* CLI(word nbytes, bytes data)
* return(word status, word data)
*/
/* It returns the address of the null terminated command line string used to
* invoke the program. status will be set to NoError if the command line
* can be returned. Other status values will be treated as error conditions.
*/
#define CL_GetCmdLine 0x10
/* GetCmdLine(void)
* return(word status, word nbytes, bytes argline)
*/
/* Return the number of centi-seconds since the support code began
* execution. Only the difference between successive calls can be
* meaningful.
*/
#define CL_Clock 0x61
/* Clock(void)
* return(word status, word clks)
*/
/* Return the number of seconds since the beginning of 1970.
*/
#define CL_Time 0x63
/* Time(void)
* return(word status, word time)
*/
/* Delete(remove, un-link, wipe, destroy) the file named by the
* NULL-terminated string 'name'.
*/
#define CL_Remove 0x64
/* Remove(word nbytes, bytes name)
* return(word status)
*/
/* Rename the file specified by the NULL-terminated string 'oname'
* to 'nname'.
*/
#define CL_Rename 0x65
/* Rename(word nbytes, bytes oname, word nbytes, bytes nname)
* return(word status)
*/
/* 'name' specifies a NULL-terminated string containing a file name or a
* device name. Opens the file/device and returns a non-zero handle on
* success that can be quoted to CL_Close, CL_Read, CL_Write, CL_Seek,
* CL_Flen or CL_IsTTY. The mode is an integer in the range 0-11:-
*
* Mode: 0 1 2 3 4 5 6 7 8 9 10 11
* ANSI C fopen mode: r rb r+ r+b w wb w+ w+b a ab a+ a+b
*
* Values 12-15 are illegal. If 'name' is ":tt" the stdin/stdout is
* opened depending on whether 'mode' is read or write.
*/
#define CL_Open 0x66
/* Open(word nbytes, bytes name, word mode)
* return(word handle)
*/
/* 'handle' is a file handle previously returned by CL_Open. CL_Close
* closes the file.
*/
#define CL_Close 0x68
/* Close(word handle)
* return(word status)
*/
/* Writes data of length nbytes to the file/device specified by
* handle. nbtotal represents the total number of bytes to be
* written, whereas nbytes is the number of bytes in this packet
*
* If nbtotal is <= DATASIZE - CL_Write message header size in the
* packet then nbytes = nbtotal and the number of bytes not written
* is returned. If nbtotal is > the packet size then the CL_Write
* must be followed by a number of CL_WriteX's to complete the write,
* the nbytes returned by CL_Write can be ignored
* If the status word returned is non zero, an error has occurred and
* the write request has been aborted.
*
*/
#define CL_Write 0x69
/* Write(word handle, word nbtotal, word nbytes, bytes data)
* return(word status, word nbytes)
*/
/* Write Extension is a reads a continuation of data from a CL_Write
* which was too big to fit in a single packet.
* nbytes is the number of bytes of data in this packet, the
* returned value of nbytes can be ignored except if it is the
* last packet, in which case it is the number of bytes that were NOT
* written
*/
#define CL_WriteX 0x6A
/* WriteX(word nbytes, bytes data)
* return(word status, word nbytes)
*/
/* Reads 'nbytes' from the file/device specified by 'handle'.
*
* If nbytes <= DATASIZE then the read will occur in a single packet
* and the returned value of nbytes will be the number of bytes actually
* read and nbmore will be 0. If nbytes> DATASIZE then multiple packets
* will have to be used ie CL_Read followed by 1 or more CL_ReadX
* packets. In this case CL_Read will return nbytes read in the current
* packet and nbmore representing how many more bytes are expected to be
* read
* If the status word is non zero then the request has completed with an
* error. If the status word is 0xFFFFFFFF (-1) then an EOF condition
* has been reached.
*/
#define CL_Read 0x6B
/* Read(word handle, word nbytes)
* return(word status, word nbytes, word nbmore, bytes data)
*/
/* Read eXtension returns a continuation of the data that was opened for
* read in the earlier CL_Read. The return value nbytes is the number of
* data bytes in the packet, nbmore is the number of bytes more that are
* expected to be read in subsequent packets.
*/
#define CL_ReadX 0x6C
/* ReadX()
* return(word status, word nbytes, word nbmore, bytes data)
*/
/* Seeks to byte position 'posn' in the file/device specified by 'handle'.
*/
#define CL_Seek 0x6D
/* Seek(word handle, word posn)
* return(word status)
*/
/* Returns the current length of the file specified by 'handle' in 'len'.
* If an error occurs 'len' is set to -1.
*/
#define CL_Flen 0x6E
/* Flen(word handle)
* return(word len)
*/
/* Returns NoError if 'handle' specifies an interactive device, otherwise
* returns GenError
*/
#define CL_IsTTY 0x6F
/* IsTTY(word handle)
* return(word status)
*/
/* Returns a temporary host file name. The maximum length of a file name
* is passed to the host. The TargetID is some identifier from the target
* for this particular temporary filename. This value is could be used
* directly in the generation of the filename.
*
* If the host cannot create a suitable name or the generated name is too
* long then status is non zero. status will be NoError if the host can create
* a name.
*/
#define CL_TmpNam 0x70
/* TmpNam(word maxlength, word TargetID)
* return(word status, word nbytes, bytes fname)
*/
/* Note there is no message for Exit, EnterOS, InstallHandler or
* GenerateError as these will be supported entirely at the host end,
* or by the underlying Operating system.
*/
#define CL_UnknownReason (-1)
extern unsigned int GetRaiseHandler( void );
extern unsigned int SysLibraryHandler(unsigned int sysCode, unsigned int *args);
extern void angel_SysLibraryInit(void);
/*
* Function: Angel_IsSysHandlerRunning
* Purpose: return whether or not SysLibraryHandler is running
*
* No paramaters
*
* Returns 1 if SysLibraryHandler is running
* 0 otherwise
*/
extern int Angel_IsSysHandlerRunning(void);
#ifdef ICEMAN2
/* This function exists in an ICEman2 system only, and can be called by
* debug support code when the debugger tells it how much memory the
* target has. This will then be used to deal with the HEAPINFO SWI
*/
extern void angel_SetTopMem(unsigned addr);
#endif
#endif
|