xref: /openbsd-src/gnu/usr.bin/binutils/gdb/rdi-share/hostchan.h (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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 /* -*-C-*-
10b725ae77Skettenis  *
11*63addd46Skettenis  * $Revision: 1.3 $
12*63addd46Skettenis  *     $Date: 2004/12/27 14:00:54 $
13b725ae77Skettenis  *
14b725ae77Skettenis  */
15b725ae77Skettenis #ifndef angsd_hostchan_h
16b725ae77Skettenis #define angsd_hostchan_h
17b725ae77Skettenis 
18b725ae77Skettenis /* A temporary sop to older compilers */
19b725ae77Skettenis #if defined (__NetBSD__) || defined (unix)
20b725ae77Skettenis #  ifndef __unix              /* (good for long-term portability?)  */
21b725ae77Skettenis #    define __unix    1
22b725ae77Skettenis #  endif
23b725ae77Skettenis #endif
24b725ae77Skettenis 
25b725ae77Skettenis /* struct timeval */
26b725ae77Skettenis #if defined(__unix) || defined(__CYGWIN__)
27b725ae77Skettenis #  include <sys/time.h>
28b725ae77Skettenis #else
29b725ae77Skettenis #  include "winsock.h"
30b725ae77Skettenis #  include "time.h"
31b725ae77Skettenis #endif
32b725ae77Skettenis 
33b725ae77Skettenis #include "chandefs.h"
34b725ae77Skettenis #include "adperr.h"
35b725ae77Skettenis #include "devsw.h"
36b725ae77Skettenis 
37b725ae77Skettenis /*
38b725ae77Skettenis  * asynchronous processing modes
39b725ae77Skettenis  */
40b725ae77Skettenis enum AsyncMode
41b725ae77Skettenis {
42b725ae77Skettenis     async_block_on_nothing,
43b725ae77Skettenis     async_block_on_read,
44b725ae77Skettenis     async_block_on_write
45b725ae77Skettenis };
46b725ae77Skettenis 
47b725ae77Skettenis #ifndef __cplusplus
48b725ae77Skettenis typedef enum AsyncMode AsyncMode;
49b725ae77Skettenis #endif
50b725ae77Skettenis 
51b725ae77Skettenis /*
52b725ae77Skettenis  * prototype for channels callback function
53b725ae77Skettenis  */
54b725ae77Skettenis typedef void (*ChannelCallback)(Packet *packet, void *state);
55b725ae77Skettenis 
56b725ae77Skettenis /*
57b725ae77Skettenis  *  Function: Adp_initSeq
58b725ae77Skettenis  *   Purpose: initialise the channel protocol and sequence numbers
59b725ae77Skettenis  *
60b725ae77Skettenis  *    Params: none
61b725ae77Skettenis  *
62b725ae77Skettenis  *   Returns: Nothing
63b725ae77Skettenis  */
64b725ae77Skettenis extern void Adp_initSeq(void);
65b725ae77Skettenis 
66b725ae77Skettenis /*
67b725ae77Skettenis  *  Function: Adp_addToQueue
68b725ae77Skettenis  *   Purpose: chain a Packet to the end of a linked list of such structures
69b725ae77Skettenis  *
70b725ae77Skettenis  *    Params:
71b725ae77Skettenis  *      In/Out: head    Head of the linked list
72b725ae77Skettenis  *
73b725ae77Skettenis  *              newpkt  Packet to be chained onto the list
74b725ae77Skettenis  *
75b725ae77Skettenis  *   Returns: Nothing
76b725ae77Skettenis  */
77b725ae77Skettenis extern void Adp_addToQueue(Packet **head, Packet *newpkt);
78b725ae77Skettenis 
79b725ae77Skettenis /*
80b725ae77Skettenis  *  Function: removeFromQueue
81b725ae77Skettenis  *   Purpose: remove a Packet from the head of a linked list of such structures
82b725ae77Skettenis  *
83b725ae77Skettenis  *    Params:
84b725ae77Skettenis  *      In/Out: head    Head of the linked list
85b725ae77Skettenis  *
86b725ae77Skettenis  *   Returns: Old head from the linked list
87b725ae77Skettenis  *
88b725ae77Skettenis  * Post-conditions: Second element in the list will be the new head.
89b725ae77Skettenis  */
90b725ae77Skettenis 
91b725ae77Skettenis extern Packet *Adp_removeFromQueue(Packet **head);
92b725ae77Skettenis 
93b725ae77Skettenis /*
94b725ae77Skettenis  * Set log file and Enable/disable logging of ADP packets to file.
95b725ae77Skettenis  */
96b725ae77Skettenis 
97b725ae77Skettenis void Adp_SetLogfile(const char *filename);
98b725ae77Skettenis void Adp_SetLogEnable(int logEnableFlag);
99b725ae77Skettenis 
100b725ae77Skettenis /*
101b725ae77Skettenis  *  Function: Adp_OpenDevice
102b725ae77Skettenis  *   Purpose: Open a device to use for channels communication.  This is a
103b725ae77Skettenis  *              very thin veneer to the device drivers: what hostchan.c
104b725ae77Skettenis  *              will do is call DeviceMatch for each device driver until it
105b725ae77Skettenis  *              finds a driver that will accept name and arg, then call
106b725ae77Skettenis  *              DeviceOpen for that device.
107b725ae77Skettenis  *
108b725ae77Skettenis  *  Pre-conditions: No previous open is still active
109b725ae77Skettenis  *
110b725ae77Skettenis  *    Params:
111b725ae77Skettenis  *       Input: name    Identifies which device to open.  This can either be
112b725ae77Skettenis  *                      a host specific identifier (e.g. "/dev/ttya",
113b725ae77Skettenis  *                      "COM1:"), or a number which is used to refer to
114b725ae77Skettenis  *                      `standard' interfaces, so "1" would be the first host
115b725ae77Skettenis  *                      interface, "2" the second, and so on.
116b725ae77Skettenis  *
117b725ae77Skettenis  *              arg     Driver specific arguments.  For example, some serial
118b725ae77Skettenis  *                      drivers accept speed and control arguments such as
119b725ae77Skettenis  *                      "9600" or "19200/NO_BREAK".  These arguments are
120b725ae77Skettenis  *                      completely free-form: it is the individual drivers
121b725ae77Skettenis  *                      which do the necessary interpretation.
122b725ae77Skettenis  *
123b725ae77Skettenis  *              heartbeat_on  Incicates if the heartbeat is configured to be
124b725ae77Skettenis  *                      used or not, true if it is, false otherwise
125b725ae77Skettenis  *
126b725ae77Skettenis  *   Returns:
127b725ae77Skettenis  *          OK: adp_ok
128b725ae77Skettenis  *       Error: adp_device_not_known,
129b725ae77Skettenis  *              adp_device_open_failed
130b725ae77Skettenis  *              adp_device_already_open
131b725ae77Skettenis  */
132b725ae77Skettenis AdpErrs Adp_OpenDevice(const char *name, const char *arg,
133b725ae77Skettenis                        unsigned int heartbeat_on);
134b725ae77Skettenis 
135b725ae77Skettenis /*
136b725ae77Skettenis  *  Function: Adp_CloseDevice
137b725ae77Skettenis  *   Purpose: Close the device used for channels communication.
138b725ae77Skettenis  *
139b725ae77Skettenis  *    Params: None
140b725ae77Skettenis  *
141b725ae77Skettenis  *   Returns:
142b725ae77Skettenis  *          OK: adp_ok
143b725ae77Skettenis  *       Error: adp_device_not_open
144b725ae77Skettenis  */
145b725ae77Skettenis AdpErrs Adp_CloseDevice(void);
146b725ae77Skettenis 
147b725ae77Skettenis /*
148b725ae77Skettenis  *  Function: Adp_Ioctl
149b725ae77Skettenis  *   Purpose: Perform miscellaneous control operations on
150b725ae77Skettenis  *              the device used for channels communication.
151b725ae77Skettenis  *              This is a minimal veneer to DevSW_Ioctl.
152b725ae77Skettenis  *
153b725ae77Skettenis  *    Params:
154b725ae77Skettenis  *       Input: opcode  Reason code indicating the operation to perform.
155b725ae77Skettenis  *      In/Out: args    Pointer to opcode-sensitive arguments/result space.
156b725ae77Skettenis  *
157b725ae77Skettenis  *
158b725ae77Skettenis  *   Returns:
159b725ae77Skettenis  *          OK: adp_ok
160b725ae77Skettenis  *       Error: adp_device_not_open, adp_failed
161b725ae77Skettenis  */
162b725ae77Skettenis AdpErrs Adp_Ioctl(int opcode, void *args);
163b725ae77Skettenis 
164b725ae77Skettenis /*
165b725ae77Skettenis  *  Function: Adp_ChannelRegisterRead
166b725ae77Skettenis  *   Purpose: Register a callback function for received packets on a given
167b725ae77Skettenis  *              channel
168b725ae77Skettenis  *
169b725ae77Skettenis  *    Params:
170b725ae77Skettenis  *       Input: chan    The channel the callback function is for.
171b725ae77Skettenis  *
172b725ae77Skettenis  *              cbfunc  The callback function.  If NULL, then the current
173b725ae77Skettenis  *                      callback is removed.
174b725ae77Skettenis  *
175b725ae77Skettenis  *              cbstate State pointer to pass into the callback function
176b725ae77Skettenis  *
177b725ae77Skettenis  *   Returns:
178b725ae77Skettenis  *          OK: adp_ok
179b725ae77Skettenis  *       Error: adp_device_not_open
180b725ae77Skettenis  *              adp_bad_channel_id
181b725ae77Skettenis  *
182b725ae77Skettenis  * Post-conditions: The callback function is responsible for freeing the
183b725ae77Skettenis  *                      packet that is passed to it, when that packet is
184b725ae77Skettenis  *                      no longer needed.
185b725ae77Skettenis  */
186b725ae77Skettenis #ifdef __cplusplus
187b725ae77Skettenis     extern "C" {
188b725ae77Skettenis #endif
189b725ae77Skettenis 
190b725ae77Skettenis 
191b725ae77Skettenis extern AdpErrs Adp_ChannelRegisterRead(const ChannelID chan,
192b725ae77Skettenis                                const ChannelCallback cbfunc,
193b725ae77Skettenis                                 void *cbstate);
194b725ae77Skettenis 
195b725ae77Skettenis #ifdef __cplusplus
196b725ae77Skettenis     }
197b725ae77Skettenis #endif
198b725ae77Skettenis /*
199b725ae77Skettenis  *  Function: Adp_ChannelRead
200b725ae77Skettenis  *   Purpose: Wait until a packet has been read for a given channel, and
201b725ae77Skettenis  *              then return it.  Callbacks for other channels are still
202b725ae77Skettenis  *              active while this read is blocking.
203b725ae77Skettenis  *
204b725ae77Skettenis  *  Pre-conditions: No callback has been already been registered for
205b725ae77Skettenis  *                      the channel.
206b725ae77Skettenis  *
207b725ae77Skettenis  *    Params:
208b725ae77Skettenis  *       Input: chan    The channel to read.
209b725ae77Skettenis  *
210b725ae77Skettenis  *      Output: packet  The received packet.
211b725ae77Skettenis  *
212b725ae77Skettenis  *   Returns:
213b725ae77Skettenis  *          OK: adp_ok
214b725ae77Skettenis  *       Error: adp_device_not_open
215b725ae77Skettenis  *              adp_bad_channel_id
216b725ae77Skettenis  *              adp_callback_already_registered
217b725ae77Skettenis  *
218b725ae77Skettenis  * Post-conditions: The calling function is responsible for freeing the
219b725ae77Skettenis  *                      received packet, when that packet is no longer
220b725ae77Skettenis  *                      needed.
221b725ae77Skettenis  */
222b725ae77Skettenis AdpErrs Adp_ChannelRead(const ChannelID chan, Packet **packet);
223b725ae77Skettenis 
224b725ae77Skettenis /*
225b725ae77Skettenis  *  Function: Adp_ChannelWrite
226b725ae77Skettenis  *   Purpose: Write a packet to the given channel
227b725ae77Skettenis  *
228b725ae77Skettenis  *  Pre-conditions: Channel must have been previously opened.
229b725ae77Skettenis  *
230b725ae77Skettenis  *    Params:
231b725ae77Skettenis  *       Input: chan    The channel to write.
232b725ae77Skettenis  *
233b725ae77Skettenis  *              packet  The packet to write.
234b725ae77Skettenis  *
235b725ae77Skettenis  *   Returns:
236b725ae77Skettenis  *          OK: adp_ok
237b725ae77Skettenis  *       Error: adp_device_not_open
238b725ae77Skettenis  *              adp_bad_channel_id
239b725ae77Skettenis  *
240b725ae77Skettenis  * Post-conditions: The packet being written becomes the "property" of
241b725ae77Skettenis  *                      Adp_ChannelWrite, which is responsible for freeing
242b725ae77Skettenis  *                      the packet when it is no longer needed.
243b725ae77Skettenis  */
244b725ae77Skettenis AdpErrs Adp_ChannelWrite(const ChannelID chan, Packet *packet);
245b725ae77Skettenis 
246b725ae77Skettenis /*
247b725ae77Skettenis  *  Function: Adp_ChannelWriteAsync
248b725ae77Skettenis  *   Purpose: Write a packet to the given channel, but don't wait
249b725ae77Skettenis  *            for the write to complete before returning.
250b725ae77Skettenis  *
251b725ae77Skettenis  *  Pre-conditions: Channel must have been previously opened.
252b725ae77Skettenis  *
253b725ae77Skettenis  *    Params:
254b725ae77Skettenis  *       Input: chan    The channel to write.
255b725ae77Skettenis  *
256b725ae77Skettenis  *              packet  The packet to write.
257b725ae77Skettenis  *
258b725ae77Skettenis  *   Returns:
259b725ae77Skettenis  *          OK: adp_ok
260b725ae77Skettenis  *       Error: adp_device_not_open
261b725ae77Skettenis  *              adp_bad_channel_id
262b725ae77Skettenis  *
263b725ae77Skettenis  * Post-conditions: The packet being written becomes the "property" of
264b725ae77Skettenis  *                      Adp_ChannelWrite, which is responsible for freeing
265b725ae77Skettenis  *                      the packet when it is no longer needed.
266b725ae77Skettenis  */
267b725ae77Skettenis AdpErrs Adp_ChannelWriteAsync(const ChannelID chan, Packet *packet);
268b725ae77Skettenis 
269b725ae77Skettenis /*
270b725ae77Skettenis  *  Function: Adp_AsynchronousProcessing
271b725ae77Skettenis  *   Purpose: This routine should be called from persistent any idle loop
272b725ae77Skettenis  *              to give the data I/O routines a chance to poll for packet
273b725ae77Skettenis  *              activity.  Depending upon the requested mode, this routine
274b725ae77Skettenis  *              may, or may not, block.
275b725ae77Skettenis  *
276b725ae77Skettenis  *    Params:
277b725ae77Skettenis  *       Input: mode    Specifies whether to block until a complete packet
278b725ae77Skettenis  *                      has been read, all pending writes have completed,
279b725ae77Skettenis  *                      or not to block at all.
280b725ae77Skettenis  *
281b725ae77Skettenis  *   Returns: Nothing.
282b725ae77Skettenis  */
283b725ae77Skettenis void Adp_AsynchronousProcessing(const AsyncMode mode);
284b725ae77Skettenis 
285b725ae77Skettenis /*
286b725ae77Skettenis  * prototype for DC_APPL packet handler
287b725ae77Skettenis  */
288b725ae77Skettenis typedef void (*DC_Appl_Handler)(const DeviceDescr *device, Packet *packet);
289b725ae77Skettenis 
290b725ae77Skettenis /*
291b725ae77Skettenis  * install a handler for DC_APPL packets (can be NULL), returning old one.
292b725ae77Skettenis  */
293b725ae77Skettenis DC_Appl_Handler Adp_Install_DC_Appl_Handler(const DC_Appl_Handler handler);
294b725ae77Skettenis 
295b725ae77Skettenis /*
296b725ae77Skettenis  * prototype for asynchronous processing callback
297b725ae77Skettenis  */
298b725ae77Skettenis typedef void (*Adp_Async_Callback)(const DeviceDescr *device,
299b725ae77Skettenis                                    const struct timeval *const time_now);
300b725ae77Skettenis 
301b725ae77Skettenis /*
302b725ae77Skettenis  * add an asynchronous processing callback to the list
303b725ae77Skettenis  * TRUE == okay, FALSE == no more async processing slots
304b725ae77Skettenis  */
305b725ae77Skettenis bool Adp_Install_Async_Callback( const Adp_Async_Callback callback_proc );
306b725ae77Skettenis 
307b725ae77Skettenis /*
308b725ae77Skettenis  * delay for a given period (in microseconds)
309b725ae77Skettenis  */
310b725ae77Skettenis void Adp_delay(unsigned int period);
311b725ae77Skettenis 
312b725ae77Skettenis #endif /* ndef angsd_hostchan_h */
313b725ae77Skettenis 
314b725ae77Skettenis /* EOF hostchan.h */
315