4a1c86435bcb65ed03a58d49707543dc61632ef9
[external/binutils.git] / gdb / guile / scm-ports.c
1 /* Support for connecting Guile's stdio to GDB's.
2    as well as r/w memory via ports.
3
4    Copyright (C) 2014-2017 Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 /* See README file in this directory for implementation notes, coding
22    conventions, et.al.  */
23
24 #include "defs.h"
25 #include "gdb_select.h"
26 #include "top.h"
27 #include "target.h"
28 #include "guile-internal.h"
29
30 #ifdef HAVE_POLL
31 #if defined (HAVE_POLL_H)
32 #include <poll.h>
33 #elif defined (HAVE_SYS_POLL_H)
34 #include <sys/poll.h>
35 #endif
36 #endif
37
38 /* A ui-file for sending output to Guile.  */
39
40 typedef struct
41 {
42   int *magic;
43   SCM port;
44 } ioscm_file_port;
45
46 /* Data for a memory port.  */
47
48 typedef struct
49 {
50   /* Bounds of memory range this port is allowed to access: [start, end).
51      This means that 0xff..ff is not accessible.  I can live with that.  */
52   CORE_ADDR start, end;
53
54   /* (end - start), recorded for convenience.  */
55   ULONGEST size;
56
57   /* Think of this as the lseek value maintained by the kernel.
58      This value is always in the range [0, size].  */
59   ULONGEST current;
60
61   /* The size of the internal r/w buffers.
62      Scheme ports aren't a straightforward mapping to memory r/w.
63      Generally the user specifies how much to r/w and all access is
64      unbuffered.  We don't try to provide equivalent access, but we allow
65      the user to specify these values to help get something similar.  */
66   unsigned read_buf_size, write_buf_size;
67 } ioscm_memory_port;
68
69 /* Copies of the original system input/output/error ports.
70    These are recorded for debugging purposes.  */
71 static SCM orig_input_port_scm;
72 static SCM orig_output_port_scm;
73 static SCM orig_error_port_scm;
74
75 /* This is the stdio port descriptor, scm_ptob_descriptor.  */
76 static scm_t_bits stdio_port_desc;
77
78 /* Note: scm_make_port_type takes a char * instead of a const char *.  */
79 static /*const*/ char stdio_port_desc_name[] = "gdb:stdio-port";
80
81 /* Names of each gdb port.  */
82 static const char input_port_name[] = "gdb:stdin";
83 static const char output_port_name[] = "gdb:stdout";
84 static const char error_port_name[] = "gdb:stderr";
85
86 /* This is the actual port used from Guile.
87    We don't expose these to the user though, to ensure they're not
88    overwritten.  */
89 static SCM input_port_scm;
90 static SCM output_port_scm;
91 static SCM error_port_scm;
92
93 /* Magic number to identify port ui-files.
94    Actually, the address of this variable is the magic number.  */
95 static int file_port_magic;
96
97 /* Internal enum for specifying output port.  */
98 enum oport { GDB_STDOUT, GDB_STDERR };
99
100 /* This is the memory port descriptor, scm_ptob_descriptor.  */
101 static scm_t_bits memory_port_desc;
102
103 /* Note: scm_make_port_type takes a char * instead of a const char *.  */
104 static /*const*/ char memory_port_desc_name[] = "gdb:memory-port";
105
106 /* The default amount of memory to fetch for each read/write request.
107    Scheme ports don't provide a way to specify the size of a read,
108    which is important to us to minimize the number of inferior interactions,
109    which over a remote link can be important.  To compensate we augment the
110    port API with a new function that let's the user specify how much the next
111    read request should fetch.  This is the initial value for each new port.  */
112 static const unsigned default_read_buf_size = 16;
113 static const unsigned default_write_buf_size = 16;
114
115 /* Arbitrarily limit memory port buffers to 1 byte to 4K.  */
116 static const unsigned min_memory_port_buf_size = 1;
117 static const unsigned max_memory_port_buf_size = 4096;
118
119 /* "out of range" error message for buf sizes.  */
120 static char *out_of_range_buf_size;
121
122 /* Keywords used by open-memory.  */
123 static SCM mode_keyword;
124 static SCM start_keyword;
125 static SCM size_keyword;
126 \f
127 /* Helper to do the low level work of opening a port.
128    Newer versions of Guile (2.1.x) have scm_c_make_port.  */
129
130 static SCM
131 ioscm_open_port (scm_t_bits port_type, long mode_bits)
132 {
133   SCM port;
134
135 #if 0 /* TODO: Guile doesn't export this.  What to do?  */
136   scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex);
137 #endif
138
139   port = scm_new_port_table_entry (port_type);
140
141   SCM_SET_CELL_TYPE (port, port_type | mode_bits);
142
143 #if 0 /* TODO: Guile doesn't export this.  What to do?  */
144   scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex);
145 #endif
146
147   return port;
148 }
149 \f
150 /* Support for connecting Guile's stdio ports to GDB's stdio ports.  */
151
152 /* The scm_t_ptob_descriptor.input_waiting "method".
153    Return a lower bound on the number of bytes available for input.  */
154
155 static int
156 ioscm_input_waiting (SCM port)
157 {
158   int fdes = 0;
159
160   if (! scm_is_eq (port, input_port_scm))
161     return 0;
162
163 #ifdef HAVE_POLL
164   {
165     /* This is copied from libguile/fports.c.  */
166     struct pollfd pollfd = { fdes, POLLIN, 0 };
167     static int use_poll = -1;
168
169     if (use_poll < 0)
170       {
171         /* This is copied from event-loop.c: poll cannot be used for stdin on
172            m68k-motorola-sysv.  */
173         struct pollfd test_pollfd = { fdes, POLLIN, 0 };
174
175         if (poll (&test_pollfd, 1, 0) == 1 && (test_pollfd.revents & POLLNVAL))
176           use_poll = 0;
177         else
178           use_poll = 1;
179       }
180
181     if (use_poll)
182       {
183         /* Guile doesn't export SIGINT hooks like Python does.
184            For now pass EINTR to scm_syserror, that's what fports.c does.  */
185         if (poll (&pollfd, 1, 0) < 0)
186           scm_syserror (FUNC_NAME);
187
188         return pollfd.revents & POLLIN ? 1 : 0;
189       }
190   }
191   /* Fall through.  */
192 #endif
193
194   {
195     struct timeval timeout;
196     fd_set input_fds;
197     int num_fds = fdes + 1;
198     int num_found;
199
200     memset (&timeout, 0, sizeof (timeout));
201     FD_ZERO (&input_fds);
202     FD_SET (fdes, &input_fds);
203
204     num_found = interruptible_select (num_fds,
205                                       &input_fds, NULL, NULL,
206                                       &timeout);
207     if (num_found < 0)
208       {
209         /* Guile doesn't export SIGINT hooks like Python does.
210            For now pass EINTR to scm_syserror, that's what fports.c does.  */
211         scm_syserror (FUNC_NAME);
212       }
213     return num_found > 0 && FD_ISSET (fdes, &input_fds);
214   }
215 }
216
217 /* The scm_t_ptob_descriptor.fill_input "method".  */
218
219 static int
220 ioscm_fill_input (SCM port)
221 {
222   /* Borrowed from libguile/fports.c.  */
223   long count;
224   scm_t_port *pt = SCM_PTAB_ENTRY (port);
225
226   /* If we're called on stdout,stderr, punt.  */
227   if (! scm_is_eq (port, input_port_scm))
228     return (scm_t_wchar) EOF; /* Set errno and return -1?  */
229
230   gdb_flush (gdb_stdout);
231   gdb_flush (gdb_stderr);
232
233   count = ui_file_read (gdb_stdin, (char *) pt->read_buf, pt->read_buf_size);
234   if (count == -1)
235     scm_syserror (FUNC_NAME);
236   if (count == 0)
237     return (scm_t_wchar) EOF;
238
239   pt->read_pos = pt->read_buf;
240   pt->read_end = pt->read_buf + count;
241   return *pt->read_buf;
242 }
243
244 /* Like fputstrn_filtered, but don't escape characters, except nul.
245    Also like fputs_filtered, but a length is specified.  */
246
247 static void
248 fputsn_filtered (const char *s, size_t size, struct ui_file *stream)
249 {
250   size_t i;
251
252   for (i = 0; i < size; ++i)
253     {
254       if (s[i] == '\0')
255         fputs_filtered ("\\000", stream);
256       else
257         fputc_filtered (s[i], stream);
258     }
259 }
260
261 /* Write to gdb's stdout or stderr.  */
262
263 static void
264 ioscm_write (SCM port, const void *data, size_t size)
265 {
266
267   /* If we're called on stdin, punt.  */
268   if (scm_is_eq (port, input_port_scm))
269     return;
270
271   TRY
272     {
273       if (scm_is_eq (port, error_port_scm))
274         fputsn_filtered ((const char *) data, size, gdb_stderr);
275       else
276         fputsn_filtered ((const char *) data, size, gdb_stdout);
277     }
278   CATCH (except, RETURN_MASK_ALL)
279     {
280       GDBSCM_HANDLE_GDB_EXCEPTION (except);
281     }
282   END_CATCH
283 }
284
285 /* Flush gdb's stdout or stderr.  */
286
287 static void
288 ioscm_flush (SCM port)
289 {
290   /* If we're called on stdin, punt.  */
291   if (scm_is_eq (port, input_port_scm))
292     return;
293
294   if (scm_is_eq (port, error_port_scm))
295     gdb_flush (gdb_stderr);
296   else
297     gdb_flush (gdb_stdout);
298 }
299
300 /* Initialize the gdb stdio port type.
301
302    N.B. isatty? will fail on these ports, it is only supported for file
303    ports.  IWBN if we could "subclass" file ports.  */
304
305 static void
306 ioscm_init_gdb_stdio_port (void)
307 {
308   stdio_port_desc = scm_make_port_type (stdio_port_desc_name,
309                                         ioscm_fill_input, ioscm_write);
310
311   scm_set_port_input_waiting (stdio_port_desc, ioscm_input_waiting);
312   scm_set_port_flush (stdio_port_desc, ioscm_flush);
313 }
314
315 /* Subroutine of ioscm_make_gdb_stdio_port to simplify it.
316    Set up the buffers of port PORT.
317    MODE_BITS are the mode bits of PORT.  */
318
319 static void
320 ioscm_init_stdio_buffers (SCM port, long mode_bits)
321 {
322   scm_t_port *pt = SCM_PTAB_ENTRY (port);
323 #define GDB_STDIO_BUFFER_DEFAULT_SIZE 1024
324   int size = mode_bits & SCM_BUF0 ? 0 : GDB_STDIO_BUFFER_DEFAULT_SIZE;
325   int writing = (mode_bits & SCM_WRTNG) != 0;
326
327   /* This is heavily copied from scm_fport_buffer_add.  */
328
329   if (!writing && size > 0)
330     {
331       pt->read_buf
332         = (unsigned char *) scm_gc_malloc_pointerless (size, "port buffer");
333       pt->read_pos = pt->read_end = pt->read_buf;
334       pt->read_buf_size = size;
335     }
336   else
337     {
338       pt->read_pos = pt->read_buf = pt->read_end = &pt->shortbuf;
339       pt->read_buf_size = 1;
340     }
341
342   if (writing && size > 0)
343     {
344       pt->write_buf
345         = (unsigned char *) scm_gc_malloc_pointerless (size, "port buffer");
346       pt->write_pos = pt->write_buf;
347       pt->write_buf_size = size;
348     }
349   else
350     {
351       pt->write_buf = pt->write_pos = &pt->shortbuf;
352       pt->write_buf_size = 1;
353     }
354   pt->write_end = pt->write_buf + pt->write_buf_size;
355 }
356
357 /* Create a gdb stdio port.  */
358
359 static SCM
360 ioscm_make_gdb_stdio_port (int fd)
361 {
362   int is_a_tty = isatty (fd);
363   const char *name;
364   const char *mode_str;
365   long mode_bits;
366   SCM port;
367
368   switch (fd)
369     {
370     case 0:
371       name = input_port_name;
372       mode_str = is_a_tty ? "r0" : "r";
373       break;
374     case 1:
375       name = output_port_name;
376       mode_str = is_a_tty ? "w0" : "w";
377       break;
378     case 2:
379       name = error_port_name;
380       mode_str = is_a_tty ? "w0" : "w";
381       break;
382     default:
383       gdb_assert_not_reached ("bad stdio file descriptor");
384     }
385
386   mode_bits = scm_mode_bits ((char *) mode_str);
387   port = ioscm_open_port (stdio_port_desc, mode_bits);
388
389   scm_set_port_filename_x (port, gdbscm_scm_from_c_string (name));
390
391   ioscm_init_stdio_buffers (port, mode_bits);
392
393   return port;
394 }
395
396 /* (stdio-port? object) -> boolean */
397
398 static SCM
399 gdbscm_stdio_port_p (SCM scm)
400 {
401   /* This is copied from SCM_FPORTP.  */
402   return scm_from_bool (!SCM_IMP (scm)
403                         && (SCM_TYP16 (scm) == stdio_port_desc));
404 }
405 \f
406 /* GDB's ports are accessed via functions to keep them read-only.  */
407
408 /* (input-port) -> port */
409
410 static SCM
411 gdbscm_input_port (void)
412 {
413   return input_port_scm;
414 }
415
416 /* (output-port) -> port */
417
418 static SCM
419 gdbscm_output_port (void)
420 {
421   return output_port_scm;
422 }
423
424 /* (error-port) -> port */
425
426 static SCM
427 gdbscm_error_port (void)
428 {
429   return error_port_scm;
430 }
431 \f
432 /* Support for sending GDB I/O to Guile ports.  */
433
434 static void
435 ioscm_file_port_delete (struct ui_file *file)
436 {
437   ioscm_file_port *stream = (ioscm_file_port *) ui_file_data (file);
438
439   if (stream->magic != &file_port_magic)
440     internal_error (__FILE__, __LINE__,
441                     _("ioscm_file_port_delete: bad magic number"));
442   xfree (stream);
443 }
444
445 static void
446 ioscm_file_port_rewind (struct ui_file *file)
447 {
448   ioscm_file_port *stream = (ioscm_file_port *) ui_file_data (file);
449
450   if (stream->magic != &file_port_magic)
451     internal_error (__FILE__, __LINE__,
452                     _("ioscm_file_port_rewind: bad magic number"));
453
454   scm_truncate_file (stream->port, 0);
455 }
456
457 static void
458 ioscm_file_port_put (struct ui_file *file,
459                      ui_file_put_method_ftype *write,
460                      void *dest)
461 {
462   ioscm_file_port *stream = (ioscm_file_port *) ui_file_data (file);
463
464   if (stream->magic != &file_port_magic)
465     internal_error (__FILE__, __LINE__,
466                     _("ioscm_file_port_put: bad magic number"));
467
468   /* This function doesn't meld with ports very well.  */
469 }
470
471 static void
472 ioscm_file_port_write (struct ui_file *file,
473                        const char *buffer,
474                        long length_buffer)
475 {
476   ioscm_file_port *stream = (ioscm_file_port *) ui_file_data (file);
477
478   if (stream->magic != &file_port_magic)
479     internal_error (__FILE__, __LINE__,
480                     _("ioscm_pot_file_write: bad magic number"));
481
482   scm_c_write (stream->port, buffer, length_buffer);
483 }
484
485 /* Return a ui_file that writes to PORT.  */
486
487 static struct ui_file *
488 ioscm_file_port_new (SCM port)
489 {
490   ioscm_file_port *stream = XCNEW (ioscm_file_port);
491   struct ui_file *file = ui_file_new ();
492
493   set_ui_file_data (file, stream, ioscm_file_port_delete);
494   set_ui_file_rewind (file, ioscm_file_port_rewind);
495   set_ui_file_put (file, ioscm_file_port_put);
496   set_ui_file_write (file, ioscm_file_port_write);
497   stream->magic = &file_port_magic;
498   stream->port = port;
499
500   return file;
501 }
502 \f
503 /* Helper routine for with-{output,error}-to-port.  */
504
505 static SCM
506 ioscm_with_output_to_port_worker (SCM port, SCM thunk, enum oport oport,
507                                   const char *func_name)
508 {
509   struct ui_file *port_file;
510   struct cleanup *cleanups;
511   SCM result;
512
513   SCM_ASSERT_TYPE (gdbscm_is_true (scm_output_port_p (port)), port,
514                    SCM_ARG1, func_name, _("output port"));
515   SCM_ASSERT_TYPE (gdbscm_is_true (scm_thunk_p (thunk)), thunk,
516                    SCM_ARG2, func_name, _("thunk"));
517
518   cleanups = set_batch_flag_and_make_cleanup_restore_page_info ();
519
520   make_cleanup_restore_integer (&current_ui->async);
521   current_ui->async = 0;
522
523   port_file = ioscm_file_port_new (port);
524
525   make_cleanup_ui_file_delete (port_file);
526
527   scoped_restore save_file = make_scoped_restore (oport == GDB_STDERR
528                                                   ? &gdb_stderr : &gdb_stdout);
529
530   if (oport == GDB_STDERR)
531     gdb_stderr = port_file;
532   else
533     {
534       current_uiout->redirect (port_file);
535       make_cleanup_ui_out_redirect_pop (current_uiout);
536
537       gdb_stdout = port_file;
538     }
539
540   result = gdbscm_safe_call_0 (thunk, NULL);
541
542   do_cleanups (cleanups);
543
544   if (gdbscm_is_exception (result))
545     gdbscm_throw (result);
546
547   return result;
548 }
549
550 /* (%with-gdb-output-to-port port thunk) -> object
551    This function is experimental.
552    IWBN to not include "gdb" in the name, but it would collide with a standard
553    procedure, and it's common to import the gdb module without a prefix.
554    There are ways around this, but they're more cumbersome.
555
556    This has % in the name because it's experimental, and we want the
557    user-visible version to come from module (gdb experimental).  */
558
559 static SCM
560 gdbscm_percent_with_gdb_output_to_port (SCM port, SCM thunk)
561 {
562   return ioscm_with_output_to_port_worker (port, thunk, GDB_STDOUT, FUNC_NAME);
563 }
564
565 /* (%with-gdb-error-to-port port thunk) -> object
566    This function is experimental.
567    IWBN to not include "gdb" in the name, but it would collide with a standard
568    procedure, and it's common to import the gdb module without a prefix.
569    There are ways around this, but they're more cumbersome.
570
571    This has % in the name because it's experimental, and we want the
572    user-visible version to come from module (gdb experimental).  */
573
574 static SCM
575 gdbscm_percent_with_gdb_error_to_port (SCM port, SCM thunk)
576 {
577   return ioscm_with_output_to_port_worker (port, thunk, GDB_STDERR, FUNC_NAME);
578 }
579 \f
580 /* Support for r/w memory via ports.  */
581
582 /* Perform an "lseek" to OFFSET,WHENCE on memory port IOMEM.
583    OFFSET must be in the range [0,size].
584    The result is non-zero for success, zero for failure.  */
585
586 static int
587 ioscm_lseek_address (ioscm_memory_port *iomem, LONGEST offset, int whence)
588 {
589   CORE_ADDR new_current;
590
591   gdb_assert (iomem->current <= iomem->size);
592
593   switch (whence)
594     {
595     case SEEK_CUR:
596       /* Catch over/underflow.  */
597       if ((offset < 0 && iomem->current + offset > iomem->current)
598           || (offset > 0 && iomem->current + offset < iomem->current))
599         return 0;
600       new_current = iomem->current + offset;
601       break;
602     case SEEK_SET:
603       new_current = offset;
604       break;
605     case SEEK_END:
606       if (offset == 0)
607         {
608           new_current = iomem->size;
609           break;
610         }
611       /* TODO: Not supported yet.  */
612       return 0;
613     default:
614       return 0;
615     }
616
617   if (new_current > iomem->size)
618     return 0;
619   iomem->current = new_current;
620   return 1;
621 }
622
623 /* "fill_input" method for memory ports.  */
624
625 static int
626 gdbscm_memory_port_fill_input (SCM port)
627 {
628   scm_t_port *pt = SCM_PTAB_ENTRY (port);
629   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (port);
630   size_t to_read;
631
632   /* "current" is the offset of the first byte we want to read.  */
633   gdb_assert (iomem->current <= iomem->size);
634   if (iomem->current == iomem->size)
635     return EOF;
636
637   /* Don't read outside the allowed memory range.  */
638   to_read = pt->read_buf_size;
639   if (to_read > iomem->size - iomem->current)
640     to_read = iomem->size - iomem->current;
641
642   if (target_read_memory (iomem->start + iomem->current, pt->read_buf,
643                           to_read) != 0)
644     gdbscm_memory_error (FUNC_NAME, _("error reading memory"), SCM_EOL);
645
646   iomem->current += to_read;
647   pt->read_pos = pt->read_buf;
648   pt->read_end = pt->read_buf + to_read;
649   return *pt->read_buf;
650 }
651
652 /* "end_input" method for memory ports.
653    Clear the read buffer and adjust the file position for unread bytes.  */
654
655 static void
656 gdbscm_memory_port_end_input (SCM port, int offset)
657 {
658   scm_t_port *pt = SCM_PTAB_ENTRY (port);
659   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (port);
660   size_t remaining = pt->read_end - pt->read_pos;
661
662   /* Note: Use of "int offset" is specified by Guile ports API.  */
663   if ((offset < 0 && remaining + offset > remaining)
664       || (offset > 0 && remaining + offset < remaining))
665     {
666       gdbscm_out_of_range_error (FUNC_NAME, 0, scm_from_int (offset),
667                                  _("overflow in offset calculation"));
668     }
669   offset += remaining;
670
671   if (offset > 0)
672     {
673       pt->read_pos = pt->read_end;
674       /* Throw error if unread-char used at beginning of file
675          then attempting to write.  Seems correct.  */
676       if (!ioscm_lseek_address (iomem, -offset, SEEK_CUR))
677         {
678           gdbscm_out_of_range_error (FUNC_NAME, 0, scm_from_int (offset),
679                                      _("bad offset"));
680         }
681     }
682
683   pt->rw_active = SCM_PORT_NEITHER;
684 }
685
686 /* "flush" method for memory ports.  */
687
688 static void
689 gdbscm_memory_port_flush (SCM port)
690 {
691   scm_t_port *pt = SCM_PTAB_ENTRY (port);
692   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (port);
693   size_t to_write = pt->write_pos - pt->write_buf;
694
695   if (to_write == 0)
696     return;
697
698   /* There's no way to indicate a short write, so if the request goes past
699      the end of the port's memory range, flag an error.  */
700   if (to_write > iomem->size - iomem->current)
701     {
702       gdbscm_out_of_range_error (FUNC_NAME, 0,
703                                  gdbscm_scm_from_ulongest (to_write),
704                                  _("writing beyond end of memory range"));
705     }
706
707   if (target_write_memory (iomem->start + iomem->current, pt->write_buf,
708                            to_write) != 0)
709     gdbscm_memory_error (FUNC_NAME, _("error writing memory"), SCM_EOL);
710
711   iomem->current += to_write;
712   pt->write_pos = pt->write_buf;
713   pt->rw_active = SCM_PORT_NEITHER;
714 }
715
716 /* "write" method for memory ports.  */
717
718 static void
719 gdbscm_memory_port_write (SCM port, const void *void_data, size_t size)
720 {
721   scm_t_port *pt = SCM_PTAB_ENTRY (port);
722   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (port);
723   const gdb_byte *data = (const gdb_byte *) void_data;
724
725   /* There's no way to indicate a short write, so if the request goes past
726      the end of the port's memory range, flag an error.  */
727   if (size > iomem->size - iomem->current)
728     {
729       gdbscm_out_of_range_error (FUNC_NAME, 0, gdbscm_scm_from_ulongest (size),
730                                  _("writing beyond end of memory range"));
731     }
732
733   if (pt->write_buf == &pt->shortbuf)
734     {
735       /* Unbuffered port.  */
736       if (target_write_memory (iomem->start + iomem->current, data, size) != 0)
737         gdbscm_memory_error (FUNC_NAME, _("error writing memory"), SCM_EOL);
738       iomem->current += size;
739       return;
740     }
741
742   /* Note: The edge case of what to do when the buffer exactly fills is
743      debatable.  Guile flushes when the buffer exactly fills up, so we
744      do too.  It's counter-intuitive to my mind, but in case there's a
745      subtlety somewhere that depends on this, we do the same.  */
746
747   {
748     size_t space = pt->write_end - pt->write_pos;
749
750     if (size < space)
751       {
752         /* Data fits in buffer, and does not fill it.  */
753         memcpy (pt->write_pos, data, size);
754         pt->write_pos += size;
755       }
756     else
757       {
758         memcpy (pt->write_pos, data, space);
759         pt->write_pos = pt->write_end;
760         gdbscm_memory_port_flush (port);
761         {
762           const gdb_byte *ptr = data + space;
763           size_t remaining = size - space;
764
765           if (remaining >= pt->write_buf_size)
766             {
767               if (target_write_memory (iomem->start + iomem->current, ptr,
768                                        remaining) != 0)
769                 gdbscm_memory_error (FUNC_NAME, _("error writing memory"),
770                                      SCM_EOL);
771               iomem->current += remaining;
772             }
773           else
774             {
775               memcpy (pt->write_pos, ptr, remaining);
776               pt->write_pos += remaining;
777             }
778         }
779       }
780   }
781 }
782
783 /* "seek" method for memory ports.  */
784
785 static scm_t_off
786 gdbscm_memory_port_seek (SCM port, scm_t_off offset, int whence)
787 {
788   scm_t_port *pt = SCM_PTAB_ENTRY (port);
789   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (port);
790   CORE_ADDR result;
791   int rc;
792
793   if (pt->rw_active == SCM_PORT_WRITE)
794     {
795       if (offset != 0 || whence != SEEK_CUR)
796         {
797           gdbscm_memory_port_flush (port);
798           rc = ioscm_lseek_address (iomem, offset, whence);
799           result = iomem->current;
800         }
801       else
802         {
803           /* Read current position without disturbing the buffer,
804              but flag an error if what's in the buffer goes outside the
805              allowed range.  */
806           CORE_ADDR current = iomem->current;
807           size_t delta = pt->write_pos - pt->write_buf;
808
809           if (current + delta < current
810               || current + delta > iomem->size)
811             rc = 0;
812           else
813             {
814               result = current + delta;
815               rc = 1;
816             }
817         }
818     }
819   else if (pt->rw_active == SCM_PORT_READ)
820     {
821       if (offset != 0 || whence != SEEK_CUR)
822         {
823           scm_end_input (port);
824           rc = ioscm_lseek_address (iomem, offset, whence);
825           result = iomem->current;
826         }
827       else
828         {
829           /* Read current position without disturbing the buffer
830              (particularly the unread-char buffer).  */
831           CORE_ADDR current = iomem->current;
832           size_t remaining = pt->read_end - pt->read_pos;
833
834           if (current - remaining > current
835               || current - remaining < iomem->start)
836             rc = 0;
837           else
838             {
839               result = current - remaining;
840               rc = 1;
841             }
842
843           if (rc != 0 && pt->read_buf == pt->putback_buf)
844             {
845               size_t saved_remaining = pt->saved_read_end - pt->saved_read_pos;
846
847               if (result - saved_remaining > result
848                   || result - saved_remaining < iomem->start)
849                 rc = 0;
850               else
851                 result -= saved_remaining;
852             }
853         }
854     }
855   else /* SCM_PORT_NEITHER */
856     {
857       rc = ioscm_lseek_address (iomem, offset, whence);
858       result = iomem->current;
859     }
860
861   if (rc == 0)
862     {
863       gdbscm_out_of_range_error (FUNC_NAME, 0,
864                                  gdbscm_scm_from_longest (offset),
865                                  _("bad seek"));
866     }
867
868   /* TODO: The Guile API doesn't support 32x64.  We can't fix that here,
869      and there's no need to throw an error if the new address can't be
870      represented in a scm_t_off.  But we could return something less
871      clumsy.  */
872   return result;
873 }
874
875 /* "close" method for memory ports.  */
876
877 static int
878 gdbscm_memory_port_close (SCM port)
879 {
880   scm_t_port *pt = SCM_PTAB_ENTRY (port);
881   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (port);
882
883   gdbscm_memory_port_flush (port);
884
885   if (pt->read_buf == pt->putback_buf)
886     pt->read_buf = pt->saved_read_buf;
887   if (pt->read_buf != &pt->shortbuf)
888     xfree (pt->read_buf);
889   if (pt->write_buf != &pt->shortbuf)
890     xfree (pt->write_buf);
891   scm_gc_free (iomem, sizeof (*iomem), "memory port");
892
893   return 0;
894 }
895
896 /* "free" method for memory ports.  */
897
898 static size_t
899 gdbscm_memory_port_free (SCM port)
900 {
901   gdbscm_memory_port_close (port);
902
903   return 0;
904 }
905
906 /* "print" method for memory ports.  */
907
908 static int
909 gdbscm_memory_port_print (SCM exp, SCM port, scm_print_state *pstate)
910 {
911   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (exp);
912   char *type = SCM_PTOBNAME (SCM_PTOBNUM (exp));
913
914   scm_puts ("#<", port);
915   scm_print_port_mode (exp, port);
916   /* scm_print_port_mode includes a trailing space.  */
917   gdbscm_printf (port, "%s %s-%s", type,
918                  hex_string (iomem->start), hex_string (iomem->end));
919   scm_putc ('>', port);
920   return 1;
921 }
922
923 /* Create the port type used for memory.  */
924
925 static void
926 ioscm_init_memory_port_type (void)
927 {
928   memory_port_desc = scm_make_port_type (memory_port_desc_name,
929                                          gdbscm_memory_port_fill_input,
930                                          gdbscm_memory_port_write);
931
932   scm_set_port_end_input (memory_port_desc, gdbscm_memory_port_end_input);
933   scm_set_port_flush (memory_port_desc, gdbscm_memory_port_flush);
934   scm_set_port_seek (memory_port_desc, gdbscm_memory_port_seek);
935   scm_set_port_close (memory_port_desc, gdbscm_memory_port_close);
936   scm_set_port_free (memory_port_desc, gdbscm_memory_port_free);
937   scm_set_port_print (memory_port_desc, gdbscm_memory_port_print);
938 }
939
940 /* Helper for gdbscm_open_memory to parse the mode bits.
941    An exception is thrown if MODE is invalid.  */
942
943 static long
944 ioscm_parse_mode_bits (const char *func_name, const char *mode)
945 {
946   const char *p;
947   long mode_bits;
948
949   if (*mode != 'r' && *mode != 'w')
950     {
951       gdbscm_out_of_range_error (func_name, 0,
952                                  gdbscm_scm_from_c_string (mode),
953                                  _("bad mode string"));
954     }
955   for (p = mode + 1; *p != '\0'; ++p)
956     {
957       switch (*p)
958         {
959         case '0':
960         case 'b':
961         case '+':
962           break;
963         default:
964           gdbscm_out_of_range_error (func_name, 0,
965                                      gdbscm_scm_from_c_string (mode),
966                                      _("bad mode string"));
967         }
968     }
969
970   /* Kinda awkward to convert the mode from SCM -> string only to have Guile
971      convert it back to SCM, but that's the API we have to work with.  */
972   mode_bits = scm_mode_bits ((char *) mode);
973
974   return mode_bits;
975 }
976
977 /* Helper for gdbscm_open_memory to finish initializing the port.
978    The port has address range [start,end).
979    This means that address of 0xff..ff is not accessible.
980    I can live with that.  */
981
982 static void
983 ioscm_init_memory_port (SCM port, CORE_ADDR start, CORE_ADDR end)
984 {
985   scm_t_port *pt;
986   ioscm_memory_port *iomem;
987   int buffered = (SCM_CELL_WORD_0 (port) & SCM_BUF0) == 0;
988
989   gdb_assert (start <= end);
990
991   iomem = (ioscm_memory_port *) scm_gc_malloc_pointerless (sizeof (*iomem),
992                                                            "memory port");
993
994   iomem->start = start;
995   iomem->end = end;
996   iomem->size = end - start;
997   iomem->current = 0;
998   if (buffered)
999     {
1000       iomem->read_buf_size = default_read_buf_size;
1001       iomem->write_buf_size = default_write_buf_size;
1002     }
1003   else
1004     {
1005       iomem->read_buf_size = 1;
1006       iomem->write_buf_size = 1;
1007     }
1008
1009   pt = SCM_PTAB_ENTRY (port);
1010   /* Match the expectation of `binary-port?'.  */
1011   pt->encoding = NULL;
1012   pt->rw_random = 1;
1013   pt->read_buf_size = iomem->read_buf_size;
1014   pt->write_buf_size = iomem->write_buf_size;
1015   if (buffered)
1016     {
1017       pt->read_buf = (unsigned char *) xmalloc (pt->read_buf_size);
1018       pt->write_buf = (unsigned char *) xmalloc (pt->write_buf_size);
1019     }
1020   else
1021     {
1022       pt->read_buf = &pt->shortbuf;
1023       pt->write_buf = &pt->shortbuf;
1024     }
1025   pt->read_pos = pt->read_end = pt->read_buf;
1026   pt->write_pos = pt->write_buf;
1027   pt->write_end = pt->write_buf + pt->write_buf_size;
1028
1029   SCM_SETSTREAM (port, iomem);
1030 }
1031
1032 /* Re-initialize a memory port, updating its read/write buffer sizes.
1033    An exception is thrown if the port is unbuffered.
1034    TODO: Allow switching buffered/unbuffered.
1035    An exception is also thrown if data is still buffered, except in the case
1036    where the buffer size isn't changing (since that's just a nop).  */
1037
1038 static void
1039 ioscm_reinit_memory_port (SCM port, size_t read_buf_size,
1040                           size_t write_buf_size, const char *func_name)
1041 {
1042   scm_t_port *pt = SCM_PTAB_ENTRY (port);
1043   ioscm_memory_port *iomem = (ioscm_memory_port *) SCM_STREAM (port);
1044
1045   gdb_assert (read_buf_size >= min_memory_port_buf_size
1046               && read_buf_size <= max_memory_port_buf_size);
1047   gdb_assert (write_buf_size >= min_memory_port_buf_size
1048               && write_buf_size <= max_memory_port_buf_size);
1049
1050   /* First check if the port is unbuffered.  */
1051
1052   if (pt->read_buf == &pt->shortbuf)
1053     {
1054       gdb_assert (pt->write_buf == &pt->shortbuf);
1055       scm_misc_error (func_name, _("port is unbuffered: ~a"),
1056                       scm_list_1 (port));
1057     }
1058
1059   /* Next check if anything is buffered.  */
1060
1061   if (read_buf_size != pt->read_buf_size
1062       && pt->read_end != pt->read_buf)
1063     {
1064       scm_misc_error (func_name, _("read buffer not empty: ~a"),
1065                       scm_list_1 (port));
1066     }
1067
1068   if (write_buf_size != pt->write_buf_size
1069       && pt->write_pos != pt->write_buf)
1070     {
1071       scm_misc_error (func_name, _("write buffer not empty: ~a"),
1072                       scm_list_1 (port));
1073     }
1074
1075   /* Now we can update the buffer sizes, but only if the size has changed.  */
1076
1077   if (read_buf_size != pt->read_buf_size)
1078     {
1079       iomem->read_buf_size = read_buf_size;
1080       pt->read_buf_size = read_buf_size;
1081       xfree (pt->read_buf);
1082       pt->read_buf = (unsigned char *) xmalloc (pt->read_buf_size);
1083       pt->read_pos = pt->read_end = pt->read_buf;
1084     }
1085
1086   if (write_buf_size != pt->write_buf_size)
1087     {
1088       iomem->write_buf_size = write_buf_size;
1089       pt->write_buf_size = write_buf_size;
1090       xfree (pt->write_buf);
1091       pt->write_buf = (unsigned char *) xmalloc (pt->write_buf_size);
1092       pt->write_pos = pt->write_buf;
1093       pt->write_end = pt->write_buf + pt->write_buf_size;
1094     }
1095 }
1096
1097 /* (open-memory [#:mode string] [#:start address] [#:size integer]) -> port
1098    Return a port that can be used for reading and writing memory.
1099    MODE is a string, and must be one of "r", "w", or "r+".
1100    "0" may be appended to MODE to mark the port as unbuffered.
1101    For compatibility "b" (binary) may also be appended, but we ignore it:
1102    memory ports are binary only.
1103
1104    The chunk of memory that can be accessed can be bounded.
1105    If both START,SIZE are unspecified, all of memory can be accessed
1106    (except 0xff..ff).  If only START is specified, all of memory from that
1107    point on can be accessed (except 0xff..ff).  If only SIZE if specified,
1108    all memory in [0,SIZE) can be accessed.  If both are specified, all memory
1109    in [START,START+SIZE) can be accessed.
1110
1111    Note: If it becomes useful enough we can later add #:end as an alternative
1112    to #:size.  For now it is left out.
1113
1114    The result is a Scheme port, and its semantics are a bit odd for accessing
1115    memory (e.g., unget), but we don't try to hide this.  It's a port.
1116
1117    N.B. Seeks on the port must be in the range [0,size].
1118    This is for similarity with bytevector ports, and so that one can seek
1119    to the first byte.  */
1120
1121 static SCM
1122 gdbscm_open_memory (SCM rest)
1123 {
1124   const SCM keywords[] = {
1125     mode_keyword, start_keyword, size_keyword, SCM_BOOL_F
1126   };
1127   char *mode = NULL;
1128   CORE_ADDR start = 0;
1129   CORE_ADDR end;
1130   int mode_arg_pos = -1, start_arg_pos = -1, size_arg_pos = -1;
1131   ULONGEST size;
1132   SCM port;
1133   long mode_bits;
1134
1135   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "#sUU", rest,
1136                               &mode_arg_pos, &mode,
1137                               &start_arg_pos, &start,
1138                               &size_arg_pos, &size);
1139
1140   scm_dynwind_begin ((scm_t_dynwind_flags) 0);
1141
1142   if (mode == NULL)
1143     mode = xstrdup ("r");
1144   scm_dynwind_free (mode);
1145
1146   if (size_arg_pos > 0)
1147     {
1148       /* For now be strict about start+size overflowing.  If it becomes
1149          a nuisance we can relax things later.  */
1150       if (start + size < start)
1151         {
1152           gdbscm_out_of_range_error (FUNC_NAME, 0,
1153                                 scm_list_2 (gdbscm_scm_from_ulongest (start),
1154                                             gdbscm_scm_from_ulongest (size)),
1155                                      _("start+size overflows"));
1156         }
1157       end = start + size;
1158     }
1159   else
1160     end = ~(CORE_ADDR) 0;
1161
1162   mode_bits = ioscm_parse_mode_bits (FUNC_NAME, mode);
1163
1164   port = ioscm_open_port (memory_port_desc, mode_bits);
1165
1166   ioscm_init_memory_port (port, start, end);
1167
1168   scm_dynwind_end ();
1169
1170   /* TODO: Set the file name as "memory-start-end"?  */
1171   return port;
1172 }
1173
1174 /* Return non-zero if OBJ is a memory port.  */
1175
1176 static int
1177 gdbscm_is_memory_port (SCM obj)
1178 {
1179   return !SCM_IMP (obj) && (SCM_TYP16 (obj) == memory_port_desc);
1180 }
1181
1182 /* (memory-port? obj) -> boolean */
1183
1184 static SCM
1185 gdbscm_memory_port_p (SCM obj)
1186 {
1187   return scm_from_bool (gdbscm_is_memory_port (obj));
1188 }
1189
1190 /* (memory-port-range port) -> (start end) */
1191
1192 static SCM
1193 gdbscm_memory_port_range (SCM port)
1194 {
1195   ioscm_memory_port *iomem;
1196
1197   SCM_ASSERT_TYPE (gdbscm_is_memory_port (port), port, SCM_ARG1, FUNC_NAME,
1198                    memory_port_desc_name);
1199
1200   iomem = (ioscm_memory_port *) SCM_STREAM (port);
1201   return scm_list_2 (gdbscm_scm_from_ulongest (iomem->start),
1202                      gdbscm_scm_from_ulongest (iomem->end));
1203 }
1204
1205 /* (memory-port-read-buffer-size port) -> integer */
1206
1207 static SCM
1208 gdbscm_memory_port_read_buffer_size (SCM port)
1209 {
1210   ioscm_memory_port *iomem;
1211
1212   SCM_ASSERT_TYPE (gdbscm_is_memory_port (port), port, SCM_ARG1, FUNC_NAME,
1213                    memory_port_desc_name);
1214
1215   iomem = (ioscm_memory_port *) SCM_STREAM (port);
1216   return scm_from_uint (iomem->read_buf_size);
1217 }
1218
1219 /* (set-memory-port-read-buffer-size! port size) -> unspecified
1220    An exception is thrown if read data is still buffered or if the port
1221    is unbuffered.  */
1222
1223 static SCM
1224 gdbscm_set_memory_port_read_buffer_size_x (SCM port, SCM size)
1225 {
1226   ioscm_memory_port *iomem;
1227
1228   SCM_ASSERT_TYPE (gdbscm_is_memory_port (port), port, SCM_ARG1, FUNC_NAME,
1229                    memory_port_desc_name);
1230   SCM_ASSERT_TYPE (scm_is_integer (size), size, SCM_ARG2, FUNC_NAME,
1231                    _("integer"));
1232
1233   if (!scm_is_unsigned_integer (size, min_memory_port_buf_size,
1234                                 max_memory_port_buf_size))
1235     {
1236       gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG2, size,
1237                                  out_of_range_buf_size);
1238     }
1239
1240   iomem = (ioscm_memory_port *) SCM_STREAM (port);
1241   ioscm_reinit_memory_port (port, scm_to_uint (size), iomem->write_buf_size,
1242                             FUNC_NAME);
1243
1244   return SCM_UNSPECIFIED;
1245 }
1246
1247 /* (memory-port-write-buffer-size port) -> integer */
1248
1249 static SCM
1250 gdbscm_memory_port_write_buffer_size (SCM port)
1251 {
1252   ioscm_memory_port *iomem;
1253
1254   SCM_ASSERT_TYPE (gdbscm_is_memory_port (port), port, SCM_ARG1, FUNC_NAME,
1255                    memory_port_desc_name);
1256
1257   iomem = (ioscm_memory_port *) SCM_STREAM (port);
1258   return scm_from_uint (iomem->write_buf_size);
1259 }
1260
1261 /* (set-memory-port-write-buffer-size! port size) -> unspecified
1262    An exception is thrown if write data is still buffered or if the port
1263    is unbuffered.  */
1264
1265 static SCM
1266 gdbscm_set_memory_port_write_buffer_size_x (SCM port, SCM size)
1267 {
1268   ioscm_memory_port *iomem;
1269
1270   SCM_ASSERT_TYPE (gdbscm_is_memory_port (port), port, SCM_ARG1, FUNC_NAME,
1271                    memory_port_desc_name);
1272   SCM_ASSERT_TYPE (scm_is_integer (size), size, SCM_ARG2, FUNC_NAME,
1273                    _("integer"));
1274
1275   if (!scm_is_unsigned_integer (size, min_memory_port_buf_size,
1276                                 max_memory_port_buf_size))
1277     {
1278       gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG2, size,
1279                                  out_of_range_buf_size);
1280     }
1281
1282   iomem = (ioscm_memory_port *) SCM_STREAM (port);
1283   ioscm_reinit_memory_port (port, iomem->read_buf_size, scm_to_uint (size),
1284                             FUNC_NAME);
1285
1286   return SCM_UNSPECIFIED;
1287 }
1288 \f
1289 /* Initialize gdb ports.  */
1290
1291 static const scheme_function port_functions[] =
1292 {
1293   { "input-port", 0, 0, 0, as_a_scm_t_subr (gdbscm_input_port),
1294     "\
1295 Return gdb's input port." },
1296
1297   { "output-port", 0, 0, 0, as_a_scm_t_subr (gdbscm_output_port),
1298     "\
1299 Return gdb's output port." },
1300
1301   { "error-port", 0, 0, 0, as_a_scm_t_subr (gdbscm_error_port),
1302     "\
1303 Return gdb's error port." },
1304
1305   { "stdio-port?", 1, 0, 0, as_a_scm_t_subr (gdbscm_stdio_port_p),
1306     "\
1307 Return #t if the object is a gdb:stdio-port." },
1308
1309   { "open-memory", 0, 0, 1, as_a_scm_t_subr (gdbscm_open_memory),
1310     "\
1311 Return a port that can be used for reading/writing inferior memory.\n\
1312 \n\
1313   Arguments: [#:mode string] [#:start address] [#:size integer]\n\
1314   Returns: A port object." },
1315
1316   { "memory-port?", 1, 0, 0, as_a_scm_t_subr (gdbscm_memory_port_p),
1317     "\
1318 Return #t if the object is a memory port." },
1319
1320   { "memory-port-range", 1, 0, 0, as_a_scm_t_subr (gdbscm_memory_port_range),
1321     "\
1322 Return the memory range of the port as (start end)." },
1323
1324   { "memory-port-read-buffer-size", 1, 0, 0,
1325     as_a_scm_t_subr (gdbscm_memory_port_read_buffer_size),
1326     "\
1327 Return the size of the read buffer for the memory port." },
1328
1329   { "set-memory-port-read-buffer-size!", 2, 0, 0,
1330     as_a_scm_t_subr (gdbscm_set_memory_port_read_buffer_size_x),
1331     "\
1332 Set the size of the read buffer for the memory port.\n\
1333 \n\
1334   Arguments: port integer\n\
1335   Returns: unspecified." },
1336
1337   { "memory-port-write-buffer-size", 1, 0, 0,
1338     as_a_scm_t_subr (gdbscm_memory_port_write_buffer_size),
1339     "\
1340 Return the size of the write buffer for the memory port." },
1341
1342   { "set-memory-port-write-buffer-size!", 2, 0, 0,
1343     as_a_scm_t_subr (gdbscm_set_memory_port_write_buffer_size_x),
1344     "\
1345 Set the size of the write buffer for the memory port.\n\
1346 \n\
1347   Arguments: port integer\n\
1348   Returns: unspecified." },
1349
1350   END_FUNCTIONS
1351 };
1352
1353 static const scheme_function private_port_functions[] =
1354 {
1355 #if 0 /* TODO */
1356   { "%with-gdb-input-from-port", 2, 0, 0,
1357     as_a_scm_t_subr (gdbscm_percent_with_gdb_input_from_port),
1358     "\
1359 Temporarily set GDB's input port to PORT and then invoke THUNK.\n\
1360 \n\
1361   Arguments: port thunk\n\
1362   Returns: The result of calling THUNK.\n\
1363 \n\
1364 This procedure is experimental." },
1365 #endif
1366
1367   { "%with-gdb-output-to-port", 2, 0, 0,
1368     as_a_scm_t_subr (gdbscm_percent_with_gdb_output_to_port),
1369     "\
1370 Temporarily set GDB's output port to PORT and then invoke THUNK.\n\
1371 \n\
1372   Arguments: port thunk\n\
1373   Returns: The result of calling THUNK.\n\
1374 \n\
1375 This procedure is experimental." },
1376
1377   { "%with-gdb-error-to-port", 2, 0, 0,
1378     as_a_scm_t_subr (gdbscm_percent_with_gdb_error_to_port),
1379     "\
1380 Temporarily set GDB's error port to PORT and then invoke THUNK.\n\
1381 \n\
1382   Arguments: port thunk\n\
1383   Returns: The result of calling THUNK.\n\
1384 \n\
1385 This procedure is experimental." },
1386
1387   END_FUNCTIONS
1388 };
1389
1390 void
1391 gdbscm_initialize_ports (void)
1392 {
1393   /* Save the original stdio ports for debugging purposes.  */
1394
1395   orig_input_port_scm = scm_current_input_port ();
1396   orig_output_port_scm = scm_current_output_port ();
1397   orig_error_port_scm = scm_current_error_port ();
1398
1399   /* Set up the stdio ports.  */
1400
1401   ioscm_init_gdb_stdio_port ();
1402   input_port_scm = ioscm_make_gdb_stdio_port (0);
1403   output_port_scm = ioscm_make_gdb_stdio_port (1);
1404   error_port_scm = ioscm_make_gdb_stdio_port (2);
1405
1406   /* Set up memory ports.  */
1407
1408   ioscm_init_memory_port_type ();
1409
1410   /* Install the accessor functions.  */
1411
1412   gdbscm_define_functions (port_functions, 1);
1413   gdbscm_define_functions (private_port_functions, 0);
1414
1415   /* Keyword args for open-memory.  */
1416
1417   mode_keyword = scm_from_latin1_keyword ("mode");
1418   start_keyword = scm_from_latin1_keyword ("start");
1419   size_keyword = scm_from_latin1_keyword ("size");
1420
1421   /* Error message text for "out of range" memory port buffer sizes.  */
1422
1423   out_of_range_buf_size = xstrprintf ("size not between %u - %u",
1424                                       min_memory_port_buf_size,
1425                                       max_memory_port_buf_size);
1426 }