OSDN Git Service

Updated copyright notices for most files.
[pf3gnuchains/pf3gnuchains3x.git] / sim / common / sim-io.c
1 /* The common simulator framework for GDB, the GNU Debugger.
2
3    Copyright 2002, 2007, 2008 Free Software Foundation, Inc.
4
5    Contributed by Andrew Cagney and Red Hat.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22
23 #include "sim-main.h"
24 #include "sim-io.h"
25 #include "targ-vals.h"
26
27 #include <errno.h>
28 #if HAVE_FCNTL_H
29 #include <fcntl.h>
30 #endif
31
32 #if HAVE_UNISTD_H
33 #include <unistd.h>
34 #endif
35
36 /* Define the rate at which the simulator should poll the host
37    for a quit. */
38 #ifndef POLL_QUIT_INTERVAL
39 #define POLL_QUIT_INTERVAL 0x10
40 #endif
41
42 static int poll_quit_count = POLL_QUIT_INTERVAL;
43
44 /* See the file include/callbacks.h for a description */
45
46
47 int
48 sim_io_init(SIM_DESC sd)
49 {
50   return STATE_CALLBACK (sd)->init (STATE_CALLBACK (sd));
51 }
52
53
54 int
55 sim_io_shutdown(SIM_DESC sd)
56 {
57   return STATE_CALLBACK (sd)->shutdown (STATE_CALLBACK (sd));
58 }
59
60
61 int
62 sim_io_unlink(SIM_DESC sd,
63               const char *f1)
64 {
65   return STATE_CALLBACK (sd)->unlink (STATE_CALLBACK (sd), f1);
66 }
67
68
69 long
70 sim_io_time(SIM_DESC sd,
71             long *t)
72 {
73   return STATE_CALLBACK (sd)->time (STATE_CALLBACK (sd), t);
74 }
75
76
77 int
78 sim_io_system(SIM_DESC sd, const char *s)
79 {
80   return STATE_CALLBACK (sd)->system (STATE_CALLBACK (sd), s);
81 }
82
83
84 int
85 sim_io_rename(SIM_DESC sd,
86               const char *f1,
87               const char *f2)
88 {
89   return STATE_CALLBACK (sd)->rename (STATE_CALLBACK (sd), f1, f2);
90 }
91
92
93 int
94 sim_io_write_stdout(SIM_DESC sd,
95                     const char *buf,
96                     int len)
97 {
98   switch (CURRENT_STDIO) {
99   case DO_USE_STDIO:
100     return STATE_CALLBACK (sd)->write_stdout (STATE_CALLBACK (sd), buf, len);
101     break;
102   case DONT_USE_STDIO:
103     return STATE_CALLBACK (sd)->write (STATE_CALLBACK (sd), 1, buf, len);
104     break;
105   default:
106     sim_io_error (sd, "sim_io_write_stdout: unaccounted switch\n");
107     break;
108   }
109   return 0;
110 }
111
112
113 void
114 sim_io_flush_stdout(SIM_DESC sd)
115 {
116   switch (CURRENT_STDIO) {
117   case DO_USE_STDIO:
118     STATE_CALLBACK (sd)->flush_stdout (STATE_CALLBACK (sd));
119     break;
120   case DONT_USE_STDIO:
121     break;
122   default:
123     sim_io_error (sd, "sim_io_flush_stdout: unaccounted switch\n");
124     break;
125   }
126 }
127
128
129 int
130 sim_io_write_stderr(SIM_DESC sd,
131                     const char *buf,
132                     int len)
133 {
134   switch (CURRENT_STDIO) {
135   case DO_USE_STDIO:
136     return STATE_CALLBACK (sd)->write_stderr (STATE_CALLBACK (sd), buf, len);
137     break;
138   case DONT_USE_STDIO:
139     return STATE_CALLBACK (sd)->write (STATE_CALLBACK (sd), 2, buf, len);
140     break;
141   default:
142     sim_io_error (sd, "sim_io_write_stderr: unaccounted switch\n");
143     break;
144   }
145   return 0;
146 }
147
148
149 void
150 sim_io_flush_stderr(SIM_DESC sd)
151 {
152   switch (CURRENT_STDIO) {
153   case DO_USE_STDIO:
154     STATE_CALLBACK (sd)->flush_stderr (STATE_CALLBACK (sd));
155     break;
156   case DONT_USE_STDIO:
157     break;
158   default:
159     sim_io_error (sd, "sim_io_flush_stderr: unaccounted switch\n");
160     break;
161   }
162 }
163
164
165 int
166 sim_io_write(SIM_DESC sd,
167              int fd,
168              const char *buf,
169              int len)
170 {
171   return STATE_CALLBACK (sd)->write (STATE_CALLBACK (sd), fd, buf, len);
172 }
173
174
175 int
176 sim_io_read_stdin(SIM_DESC sd,
177                   char *buf,
178                   int len)
179 {
180   switch (CURRENT_STDIO) {
181   case DO_USE_STDIO:
182     return STATE_CALLBACK (sd)->read_stdin (STATE_CALLBACK (sd), buf, len);
183     break;
184   case DONT_USE_STDIO:
185     return STATE_CALLBACK (sd)->read (STATE_CALLBACK (sd), 0, buf, len);
186     break;
187   default:
188     sim_io_error (sd, "sim_io_read_stdin: unaccounted switch\n");
189     break;
190   }
191   return 0;
192 }
193
194
195 int
196 sim_io_read(SIM_DESC sd, int fd,
197             char *buf,
198             int len)
199 {
200   return STATE_CALLBACK (sd)->read (STATE_CALLBACK (sd), fd, buf, len);
201 }
202
203
204 int
205 sim_io_open(SIM_DESC sd,
206             const char *name,
207             int flags)
208 {
209   return STATE_CALLBACK (sd)->open (STATE_CALLBACK (sd), name, flags);
210 }
211
212
213 int
214 sim_io_lseek(SIM_DESC sd,
215              int fd,
216              long off,
217              int way)
218 {
219   return STATE_CALLBACK (sd)->lseek (STATE_CALLBACK (sd), fd, off, way);
220 }
221
222
223 int
224 sim_io_isatty(SIM_DESC sd,
225               int fd)
226 {
227   return STATE_CALLBACK (sd)->isatty (STATE_CALLBACK (sd), fd);
228 }
229
230
231 int
232 sim_io_get_errno(SIM_DESC sd)
233 {
234   return STATE_CALLBACK (sd)->get_errno (STATE_CALLBACK (sd));
235 }
236
237
238 int
239 sim_io_close(SIM_DESC sd,
240              int fd)
241 {
242   return STATE_CALLBACK (sd)->close (STATE_CALLBACK (sd), fd);
243 }
244
245
246 void
247 sim_io_printf(SIM_DESC sd,
248               const char *fmt,
249               ...)
250 {
251   va_list ap;
252   va_start(ap, fmt);
253   STATE_CALLBACK (sd)->vprintf_filtered (STATE_CALLBACK (sd), fmt, ap);
254   va_end(ap);
255 }
256
257
258 void
259 sim_io_vprintf(SIM_DESC sd,
260                const char *fmt,
261                va_list ap)
262 {
263   STATE_CALLBACK (sd)->vprintf_filtered (STATE_CALLBACK (sd), fmt, ap);
264 }
265
266
267 void
268 sim_io_eprintf(SIM_DESC sd,
269               const char *fmt,
270               ...)
271 {
272   va_list ap;
273   va_start(ap, fmt);
274   STATE_CALLBACK (sd)->evprintf_filtered (STATE_CALLBACK (sd), fmt, ap);
275   va_end(ap);
276 }
277
278
279 void
280 sim_io_evprintf(SIM_DESC sd,
281                 const char *fmt,
282                 va_list ap)
283 {
284   STATE_CALLBACK (sd)->evprintf_filtered (STATE_CALLBACK (sd), fmt, ap);
285 }
286
287
288 void
289 sim_io_error(SIM_DESC sd,
290              const char *fmt,
291              ...)
292 {
293   if (sd == NULL || STATE_CALLBACK (sd) == NULL) {
294     va_list ap;
295     va_start(ap, fmt);
296     vfprintf (stderr, fmt, ap);
297     va_end(ap);
298     fprintf (stderr, "\n");
299     abort ();
300   }
301   else {
302     va_list ap;
303     va_start(ap, fmt);
304     STATE_CALLBACK (sd)->evprintf_filtered (STATE_CALLBACK (sd), fmt, ap);
305     va_end(ap);
306     STATE_CALLBACK (sd)->error (STATE_CALLBACK (sd), "");
307   }
308 }
309
310
311 void
312 sim_io_poll_quit(SIM_DESC sd)
313 {
314   if (STATE_CALLBACK (sd)->poll_quit != NULL && poll_quit_count-- < 0)
315     {
316       poll_quit_count = POLL_QUIT_INTERVAL;
317       if (STATE_CALLBACK (sd)->poll_quit (STATE_CALLBACK (sd)))
318         sim_stop (sd);
319     }
320 }
321
322
323 /* Based on gdb-4.17/sim/ppc/main.c:sim_io_read_stdin().
324
325    FIXME: Should not be calling fcntl() or grubbing around inside of
326    ->fdmap and ->errno.
327
328    FIXME: Some completly new mechanism for handling the general
329    problem of asynchronous IO is needed.
330
331    FIXME: This function does not supress the echoing (ECHO) of input.
332    Consequently polled input is always displayed.
333
334    FIXME: This function does not perform uncooked reads.
335    Consequently, data will not be read until an EOLN character has
336    been entered. A cntrl-d may force the early termination of a line */
337
338
339 int
340 sim_io_poll_read (SIM_DESC sd,
341                   int sim_io_fd,
342                   char *buf,
343                   int sizeof_buf)
344 {
345 #if defined(O_NDELAY) && defined(F_GETFL) && defined(F_SETFL)
346   int fd = STATE_CALLBACK (sd)->fdmap[sim_io_fd];
347   int flags;
348   int status;
349   int nr_read;
350   int result;
351   STATE_CALLBACK (sd)->last_errno = 0;
352   /* get the old status */
353   flags = fcntl (fd, F_GETFL, 0);
354   if (flags == -1)
355     {
356       perror ("sim_io_poll_read");
357       return 0;
358     }
359   /* temp, disable blocking IO */
360   status = fcntl (fd, F_SETFL, flags | O_NDELAY);
361   if (status == -1)
362     {
363       perror ("sim_io_read_stdin");
364       return 0;
365     }
366   /* try for input */
367   nr_read = read (fd, buf, sizeof_buf);
368   if (nr_read >= 0)
369     {
370       /* printf ("<nr-read=%d>\n", nr_read); */
371       result = nr_read;
372     }
373   else
374     { /* nr_read < 0 */
375       result = -1;
376       STATE_CALLBACK (sd)->last_errno = errno;
377     }
378   /* return to regular vewing */
379   status = fcntl (fd, F_SETFL, flags);
380   if (status == -1)
381     {
382       perror ("sim_io_read_stdin");
383       /* return 0; */
384     }
385   return result;
386 #else
387   return sim_io_read (sd, sim_io_fd, buf, sizeof_buf);
388 #endif
389 }