1 /* Remote target system call support.
2 Copyright 1997 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 /* This interface isn't intended to be specific to any particular kind
22 of remote (hardware, simulator, whatever). As such, support for it
23 (e.g. sim/common/callback.c) should *not* live in the simulator source
24 tree, nor should it live in the gdb source tree. K&R C must be
31 #include "libiberty.h"
32 #ifdef ANSI_PROTOTYPES
47 #include <sys/types.h>
50 #include "targ-vals.h"
56 #define ENAMETOOLONG EINVAL
59 /* Maximum length of a path name. */
61 #define MAX_PATH_LEN 1024
64 /* When doing file read/writes, do this many bytes at a time. */
65 #define FILE_XFR_SIZE 4096
68 #define TWORD unsigned long
69 #define TADDR unsigned long
71 /* Utility of cb_syscall to fetch a path name or other string from the target.
72 The result is 0 for success or a host errno value. */
75 get_string (cb
, sc
, buf
, buflen
, addr
)
84 for (p
= buf
, pend
= buf
+ buflen
; p
< pend
; ++p
, ++addr
)
86 /* No, it isn't expected that this would cause one transaction with
87 the remote target for each byte. The target could send the
88 path name along with the syscall request, and cache the file
89 name somewhere (or otherwise tweak this as desired). */
90 unsigned int count
= (*sc
->read_mem
) (cb
, sc
, addr
, p
, 1);
102 /* Utility of cb_syscall to fetch a path name.
103 The buffer is malloc'd and the address is stored in BUFP.
104 The result is that of get_string.
105 If an error occurs, no buffer is left malloc'd. */
108 get_path (cb
, sc
, addr
, bufp
)
114 char *buf
= xmalloc (MAX_PATH_LEN
);
117 result
= get_string (cb
, sc
, buf
, MAX_PATH_LEN
, addr
);
125 /* Perform a system call on behalf of the target. */
132 /* ??? Need to consider target word size. */
133 long result
= 0, errcode
= 0;
135 switch (cb_target_to_host_syscall (cb
, sc
->func
))
137 #if 0 /* FIXME: wip */
138 case CB_SYS_argvlen
:
140 /* Compute how much space is required to store the argv,envp
141 strings so that the program can allocate the space and then
142 call SYS_argv to fetch the values. */
143 int addr_size
= cb
->addr_size
;
144 int argc
,envc
,arglen
,envlen
;
145 const char **argv
= cb
->init_argv
;
146 const char **envp
= cb
->init_envp
;
151 for ( ; argv
[argc
]; ++argc
)
152 arglen
+= strlen (argv
[argc
]) + 1;
157 for ( ; envp
[envc
]; ++envc
)
158 envlen
+= strlen (envp
[envc
]) + 1;
160 result
= arglen
+ envlen
;
166 /* Pointer to target's buffer. */
167 TADDR tbuf
= sc
->arg1
;
169 int bufsize
= sc
->arg2
;
170 /* Q is the target address of where all the strings go. */
172 int word_size
= cb
->word_size
;
174 const char **argv
= cb
->init_argv
;
175 const char **envp
= cb
->init_envp
;
180 for ( ; argv
[argc
]; ++argc
)
182 int len
= strlen (argv
[argc
]);
183 int written
= (*sc
->write_mem
) (cb
, sc
, tbuf
, argv
[argc
], len
+ 1);
193 if ((*sc
->write_mem
) (cb
, sc
, tbuf
, "", 1) != 1)
203 for ( ; envp
[envc
]; ++envc
)
205 int len
= strlen (envp
[envc
]);
206 int written
= (*sc
->write_mem
) (cb
, sc
, tbuf
, envp
[envc
], len
+ 1);
216 if ((*sc
->write_mem
) (cb
, sc
, tbuf
, "", 1) != 1)
229 /* Caller must catch and handle. */
236 errcode
= get_path (cb
, sc
, sc
->arg1
, &path
);
242 result
= (*cb
->open
) (cb
, path
, sc
->arg2
/*, sc->arg3*/);
250 result
= (*cb
->close
) (cb
, sc
->arg1
);
257 /* ??? Perfect handling of error conditions may require only one
258 call to cb->read. One can't assume all the data is
259 contiguously stored in host memory so that would require
260 malloc'ing/free'ing the space. Maybe later. */
261 char buf
[FILE_XFR_SIZE
];
263 TADDR addr
= sc
->arg2
;
264 size_t count
= sc
->arg3
;
265 size_t bytes_read
= 0;
271 result
= (int) (*cb
->read_stdin
) (cb
, buf
,
272 (count
< FILE_XFR_SIZE
273 ? count
: FILE_XFR_SIZE
));
275 result
= (int) (*cb
->read
) (cb
, fd
, buf
,
276 (count
< FILE_XFR_SIZE
277 ? count
: FILE_XFR_SIZE
));
280 bytes_written
= (*sc
->write_mem
) (cb
, sc
, addr
, buf
, result
);
281 if (bytes_written
!= result
)
287 bytes_read
+= result
;
297 /* ??? Perfect handling of error conditions may require only one
298 call to cb->write. One can't assume all the data is
299 contiguously stored in host memory so that would require
300 malloc'ing/free'ing the space. Maybe later. */
301 char buf
[FILE_XFR_SIZE
];
303 TADDR addr
= sc
->arg2
;
304 size_t count
= sc
->arg3
;
306 size_t bytes_written
= 0;
310 int bytes_to_read
= count
< FILE_XFR_SIZE
? count
: FILE_XFR_SIZE
;
311 bytes_read
= (*sc
->read_mem
) (cb
, sc
, addr
, buf
, bytes_to_read
);
312 if (bytes_read
!= bytes_to_read
)
319 result
= (int) (*cb
->write_stdout
) (cb
, buf
, bytes_read
);
321 result
= (int) (*cb
->write_stderr
) (cb
, buf
, bytes_read
);
323 result
= (int) (*cb
->write
) (cb
, fd
, buf
, bytes_read
);
326 bytes_written
+= result
;
330 result
= bytes_written
;
337 unsigned long offset
= sc
->arg2
;
338 int whence
= sc
->arg3
;
340 result
= (*cb
->lseek
) (cb
, fd
, offset
, whence
);
350 errcode
= get_path (cb
, sc
, sc
->arg1
, &path
);
356 result
= (*cb
->unlink
) (cb
, path
);
368 TADDR addr
= sc
->arg2
;
370 errcode
= get_path (cb
, sc
, sc
->arg1
, &path
);
376 result
= (*cb
->stat
) (cb
, path
, &statbuf
);
380 buflen
= cb_host_to_target_stat (cb
, NULL
, NULL
);
381 buf
= xmalloc (buflen
);
382 if (cb_host_to_target_stat (cb
, &statbuf
, buf
) != buflen
)
384 /* The translation failed. This is due to an internal
385 host program error, not the target's fault. */
391 if ((*sc
->write_mem
) (cb
, sc
, addr
, buf
, buflen
) != buflen
)
407 TADDR addr
= sc
->arg2
;
409 result
= (*cb
->fstat
) (cb
, sc
->arg1
, &statbuf
);
412 buflen
= cb_host_to_target_stat (cb
, NULL
, NULL
);
413 buf
= xmalloc (buflen
);
414 if (cb_host_to_target_stat (cb
, &statbuf
, buf
) != buflen
)
416 /* The translation failed. This is due to an internal
417 host program error, not the target's fault. */
423 if ((*sc
->write_mem
) (cb
, sc
, addr
, buf
, buflen
) != buflen
)
436 /* FIXME: May wish to change CB_SYS_time to something else.
437 We might also want gettimeofday or times, but if system calls
438 can be built on others, we can keep the number we have to support
440 time_t t
= (*cb
->time
) (cb
, (time_t *) 0);
442 /* It is up to target code to process the argument to time(). */
449 /* fall through for now */
462 sc
->errcode
= cb_host_to_target_errno (cb
, errcode
);
467 sc
->errcode
= (*cb
->get_errno
) (cb
);
This page took 0.049016 seconds and 5 git commands to generate.