1 |
27 |
unneback |
/*==========================================================================
|
2 |
|
|
//
|
3 |
|
|
// gdb-fileio.c
|
4 |
|
|
//
|
5 |
|
|
// Implementation of File I/O using the GDB remote protocol
|
6 |
|
|
//
|
7 |
|
|
//==========================================================================
|
8 |
|
|
//####ECOSGPLCOPYRIGHTBEGIN####
|
9 |
|
|
// -------------------------------------------
|
10 |
|
|
// This file is part of eCos, the Embedded Configurable Operating System.
|
11 |
|
|
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
|
12 |
|
|
//
|
13 |
|
|
// eCos is free software; you can redistribute it and/or modify it under
|
14 |
|
|
// the terms of the GNU General Public License as published by the Free
|
15 |
|
|
// Software Foundation; either version 2 or (at your option) any later version.
|
16 |
|
|
//
|
17 |
|
|
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
|
18 |
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
19 |
|
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
20 |
|
|
// for more details.
|
21 |
|
|
//
|
22 |
|
|
// You should have received a copy of the GNU General Public License along
|
23 |
|
|
// with eCos; if not, write to the Free Software Foundation, Inc.,
|
24 |
|
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
25 |
|
|
//
|
26 |
|
|
// As a special exception, if other files instantiate templates or use macros
|
27 |
|
|
// or inline functions from this file, or you compile this file and link it
|
28 |
|
|
// with other works to produce a work based on this file, this file does not
|
29 |
|
|
// by itself cause the resulting work to be covered by the GNU General Public
|
30 |
|
|
// License. However the source code for this file must still be made available
|
31 |
|
|
// in accordance with section (3) of the GNU General Public License.
|
32 |
|
|
//
|
33 |
|
|
// This exception does not invalidate any other reasons why a work based on
|
34 |
|
|
// this file might be covered by the GNU General Public License.
|
35 |
|
|
//
|
36 |
|
|
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
|
37 |
|
|
// at http://sources.redhat.com/ecos/ecos-license/
|
38 |
|
|
// -------------------------------------------
|
39 |
|
|
//####ECOSGPLCOPYRIGHTEND####
|
40 |
|
|
//==========================================================================
|
41 |
|
|
//#####DESCRIPTIONBEGIN####
|
42 |
|
|
//
|
43 |
|
|
// Author(s): jlarmour
|
44 |
|
|
// Contributors:
|
45 |
|
|
// Date: 2002-04-09
|
46 |
|
|
// Purpose: Implementation of File I/O using the GDB remote
|
47 |
|
|
// protocol
|
48 |
|
|
// Description: 'F' packet requests are of the form:
|
49 |
|
|
// F<name>[,<parameter>]...
|
50 |
|
|
// where name is the ASCII syscall name, and the
|
51 |
|
|
// parameters are generally included as hex ints,
|
52 |
|
|
// in ASCII.
|
53 |
|
|
//
|
54 |
|
|
//####DESCRIPTIONEND####
|
55 |
|
|
//========================================================================*/
|
56 |
|
|
|
57 |
|
|
/* CONFIGURATION */
|
58 |
|
|
|
59 |
|
|
#include <pkgconf/hal.h>
|
60 |
|
|
|
61 |
|
|
/* HEADERS */
|
62 |
|
|
|
63 |
|
|
#include <stddef.h> // size_t
|
64 |
|
|
#include <cyg/infra/cyg_type.h>
|
65 |
|
|
#ifdef CYGPKG_ISOINFRA
|
66 |
|
|
# include <pkgconf/isoinfra.h>
|
67 |
|
|
# include <string.h>
|
68 |
|
|
#endif
|
69 |
|
|
#include "board.h" // sets correct definitions for generic stub header
|
70 |
|
|
#include <cyg/hal/generic-stub.h>
|
71 |
|
|
#include "gdb-fileio.h"
|
72 |
|
|
|
73 |
|
|
/* TYPES */
|
74 |
|
|
|
75 |
|
|
// this is used by newlib's mode_t so we should match it
|
76 |
|
|
#ifdef __GNUC__
|
77 |
|
|
#define _ST_INT32 __attribute__ ((__mode__ (__SI__)))
|
78 |
|
|
#else
|
79 |
|
|
#define _ST_INT32
|
80 |
|
|
#endif
|
81 |
|
|
|
82 |
|
|
typedef int newlib_int_t;
|
83 |
|
|
typedef unsigned int newlib_uint_t;
|
84 |
|
|
typedef long newlib_long_t;
|
85 |
|
|
typedef long newlib_time_t;
|
86 |
|
|
typedef unsigned int newlib_mode_t _ST_INT32;
|
87 |
|
|
typedef short newlib_dev_t;
|
88 |
|
|
typedef unsigned short newlib_uid_t;
|
89 |
|
|
typedef unsigned short newlib_gid_t;
|
90 |
|
|
typedef unsigned short newlib_ino_t;
|
91 |
|
|
typedef unsigned short newlib_nlink_t;
|
92 |
|
|
typedef long newlib_off_t;
|
93 |
|
|
|
94 |
|
|
struct newlib_timeval {
|
95 |
|
|
newlib_time_t tv_sec;
|
96 |
|
|
newlib_long_t tv_usec;
|
97 |
|
|
};
|
98 |
|
|
|
99 |
|
|
struct newlib_stat
|
100 |
|
|
{
|
101 |
|
|
newlib_dev_t st_dev;
|
102 |
|
|
newlib_ino_t st_ino;
|
103 |
|
|
newlib_mode_t st_mode;
|
104 |
|
|
newlib_nlink_t st_nlink;
|
105 |
|
|
newlib_uid_t st_uid;
|
106 |
|
|
newlib_gid_t st_gid;
|
107 |
|
|
newlib_dev_t st_rdev;
|
108 |
|
|
newlib_off_t st_size;
|
109 |
|
|
// We assume we've been compiled with the same flags as newlib here
|
110 |
|
|
#if defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)
|
111 |
|
|
newlib_time_t st_atime;
|
112 |
|
|
newlib_time_t st_mtime;
|
113 |
|
|
newlib_time_t st_ctime;
|
114 |
|
|
#else
|
115 |
|
|
newlib_time_t st_atime;
|
116 |
|
|
newlib_long_t st_spare1;
|
117 |
|
|
newlib_time_t st_mtime;
|
118 |
|
|
newlib_long_t st_spare2;
|
119 |
|
|
newlib_time_t st_ctime;
|
120 |
|
|
newlib_long_t st_spare3;
|
121 |
|
|
newlib_long_t st_blksize;
|
122 |
|
|
newlib_long_t st_blocks;
|
123 |
|
|
newlib_long_t st_spare4[2];
|
124 |
|
|
#endif
|
125 |
|
|
};
|
126 |
|
|
|
127 |
|
|
/* EXTERNS */
|
128 |
|
|
|
129 |
|
|
__externC char __remcomInBuffer[]; // from generic-stub.c, for packet data
|
130 |
|
|
__externC char __remcomOutBuffer[]; // ditto
|
131 |
|
|
|
132 |
|
|
/* STATICS/GLOBALS */
|
133 |
|
|
|
134 |
|
|
static int __fileio_retcode, __fileio_errno;
|
135 |
|
|
static cyg_bool __fileio_retcode_set, __fileio_errno_set, __fileio_ctrlc_set;
|
136 |
|
|
|
137 |
|
|
/* MACROS */
|
138 |
|
|
|
139 |
|
|
// endian independent conversion functions from big endian protocol types
|
140 |
|
|
// to newlib types
|
141 |
|
|
|
142 |
|
|
#define GDBFILEIO_FIO_TO_NEWLIB( _f, _n, _ftype ) \
|
143 |
|
|
CYG_MACRO_START \
|
144 |
|
|
char *_cf = (char *)(_f); \
|
145 |
|
|
int _i; \
|
146 |
|
|
char _sign = 0; \
|
147 |
|
|
if (*_cf == '-') { \
|
148 |
|
|
_sign = 1; \
|
149 |
|
|
_cf++; \
|
150 |
|
|
} \
|
151 |
|
|
(_n) = 0; \
|
152 |
|
|
for (_i=0; _i<sizeof(_ftype); _i++) { \
|
153 |
|
|
(_n) = ((_n) << 8) | _cf[_i]; \
|
154 |
|
|
} \
|
155 |
|
|
if (_sign) \
|
156 |
|
|
(_n) = -(_n); \
|
157 |
|
|
CYG_MACRO_END
|
158 |
|
|
|
159 |
|
|
#define GDBABS(_x_) (((_x_) < 0) ? (-(_x_)) : (_x_))
|
160 |
|
|
|
161 |
|
|
#define GDBFILEIO_NEWLIB_TO_FIO( _f, _n, _ftype ) \
|
162 |
|
|
CYG_MACRO_START \
|
163 |
|
|
char *_cf = (char *)(_f); \
|
164 |
|
|
int _i = 0; \
|
165 |
|
|
if ((_n) < 0) \
|
166 |
|
|
_cf[_i++] = '-'; \
|
167 |
|
|
for (; _i<sizeof(_ftype); _i++) { \
|
168 |
|
|
_cf[_i] = ((GDBABS(_n)) >> 8*(sizeof(_ftype)-_i-1)) & 0xff; \
|
169 |
|
|
} \
|
170 |
|
|
CYG_MACRO_END
|
171 |
|
|
|
172 |
|
|
|
173 |
|
|
/* FUNCTIONS */
|
174 |
|
|
|
175 |
|
|
#ifndef CYGINT_ISO_STRING_STRFUNCS
|
176 |
|
|
static size_t strlen( const char *s )
|
177 |
|
|
{
|
178 |
|
|
size_t retval;
|
179 |
|
|
const char *start = s;
|
180 |
|
|
while (*s)
|
181 |
|
|
s++;
|
182 |
|
|
retval = s - start;
|
183 |
|
|
return retval;
|
184 |
|
|
}
|
185 |
|
|
#endif
|
186 |
|
|
|
187 |
|
|
static int
|
188 |
|
|
chars_to_hex( char *charsin, char *hexout, int bytes )
|
189 |
|
|
{
|
190 |
|
|
int numChars = 0;
|
191 |
|
|
int allzero = true;
|
192 |
|
|
|
193 |
|
|
while (bytes--) {
|
194 |
|
|
if (0 != *charsin)
|
195 |
|
|
allzero = false;
|
196 |
|
|
*hexout++ = __tohex( (*charsin / 16) & 15 );
|
197 |
|
|
*hexout++ = __tohex( (*charsin++) & 15 );
|
198 |
|
|
numChars += 2;
|
199 |
|
|
}
|
200 |
|
|
if (allzero) // doesn't matter if we actually set more than needed above
|
201 |
|
|
return (numChars > 2 ? 2 : numChars);
|
202 |
|
|
return numChars;
|
203 |
|
|
}
|
204 |
|
|
|
205 |
|
|
static void
|
206 |
|
|
gdbfileio_fio_to_newlib_time_t( fio_time_t *f, newlib_time_t *n )
|
207 |
|
|
{
|
208 |
|
|
GDBFILEIO_FIO_TO_NEWLIB( f, *n, fio_time_t );
|
209 |
|
|
} // gdbfileio_fio_to_newlib_time_t()
|
210 |
|
|
|
211 |
|
|
static void
|
212 |
|
|
gdbfileio_newlib_to_fio_int_t( newlib_int_t *n, fio_int_t *f )
|
213 |
|
|
{
|
214 |
|
|
GDBFILEIO_NEWLIB_TO_FIO( f, *n, fio_int_t );
|
215 |
|
|
} // gdbfileio_newlib_to_fio_int_t()
|
216 |
|
|
|
217 |
|
|
static void
|
218 |
|
|
gdbfileio_newlib_to_fio_uint_t( newlib_uint_t *n, fio_uint_t *f )
|
219 |
|
|
{
|
220 |
|
|
GDBFILEIO_NEWLIB_TO_FIO( f, *n, fio_uint_t );
|
221 |
|
|
} // gdbfileio_newlib_to_fio_uint_t()
|
222 |
|
|
|
223 |
|
|
static void
|
224 |
|
|
gdbfileio_fio_to_newlib_long_t( fio_long_t *f, newlib_long_t *n )
|
225 |
|
|
{
|
226 |
|
|
GDBFILEIO_FIO_TO_NEWLIB( f, *n, fio_long_t );
|
227 |
|
|
} // gdbfileio_fio_to_newlib_long_t()
|
228 |
|
|
|
229 |
|
|
static void
|
230 |
|
|
gdbfileio_newlib_to_fio_long_t( newlib_long_t *n, fio_long_t *f )
|
231 |
|
|
{
|
232 |
|
|
GDBFILEIO_NEWLIB_TO_FIO( f, *n, fio_long_t );
|
233 |
|
|
} // gdbfileio_newlib_to_fio_long_t()
|
234 |
|
|
|
235 |
|
|
static void
|
236 |
|
|
gdbfileio_fio_to_newlib_mode_t( fio_mode_t *f, newlib_mode_t *n )
|
237 |
|
|
{
|
238 |
|
|
GDBFILEIO_FIO_TO_NEWLIB( f, *n, fio_mode_t );
|
239 |
|
|
} // gdbfileio_fio_to_newlib_mode_t()
|
240 |
|
|
|
241 |
|
|
static void
|
242 |
|
|
gdbfileio_newlib_to_fio_mode_t( newlib_mode_t *n, fio_mode_t *f )
|
243 |
|
|
{
|
244 |
|
|
GDBFILEIO_NEWLIB_TO_FIO( f, *n, fio_mode_t );
|
245 |
|
|
} // gdbfileio_newlib_to_fio_mode_t()
|
246 |
|
|
|
247 |
|
|
static void
|
248 |
|
|
gdbfileio_fio_to_newlib_dev_t( fio_uint_t *f, newlib_dev_t *n )
|
249 |
|
|
{
|
250 |
|
|
GDBFILEIO_FIO_TO_NEWLIB( f, *n, fio_uint_t );
|
251 |
|
|
} // gdbfileio_fio_to_newlib_dev_t()
|
252 |
|
|
|
253 |
|
|
static void
|
254 |
|
|
gdbfileio_fio_to_newlib_ino_t( fio_uint_t *f, newlib_ino_t *n )
|
255 |
|
|
{
|
256 |
|
|
GDBFILEIO_FIO_TO_NEWLIB( f, *n, fio_uint_t );
|
257 |
|
|
} // gdbfileio_fio_to_newlib_ino_t()
|
258 |
|
|
|
259 |
|
|
// these defines are good enough for now (to save code size) as they
|
260 |
|
|
// are the same functions in practice
|
261 |
|
|
#define gdbfileio_fio_to_newlib_nlink_t gdbfileio_fio_to_newlib_ino_t
|
262 |
|
|
#define gdbfileio_fio_to_newlib_uid_t gdbfileio_fio_to_newlib_ino_t
|
263 |
|
|
#define gdbfileio_fio_to_newlib_gid_t gdbfileio_fio_to_newlib_ino_t
|
264 |
|
|
#define gdbfileio_fio_to_newlib_off_t gdbfileio_fio_to_newlib_long_t
|
265 |
|
|
|
266 |
|
|
|
267 |
|
|
// this function is commonly used by most functions to handle everything
|
268 |
|
|
// once the packet has been constructed. It doesn't have to be used - it's
|
269 |
|
|
// just nice to keep this in one place for maintenance reasons.
|
270 |
|
|
static int
|
271 |
|
|
gdbfileio_common_sendpkt( char *buf, int *sig )
|
272 |
|
|
{
|
273 |
|
|
int status;
|
274 |
|
|
|
275 |
|
|
__putpacket( buf );
|
276 |
|
|
|
277 |
|
|
do {
|
278 |
|
|
__getpacket( __remcomInBuffer );
|
279 |
|
|
status = __process_packet( __remcomInBuffer );
|
280 |
|
|
} while ( status == 0 );
|
281 |
|
|
|
282 |
|
|
if ( __fileio_ctrlc_set )
|
283 |
|
|
*sig = SIGINT;
|
284 |
|
|
if ( !__fileio_retcode_set ) // deal with protocol failure
|
285 |
|
|
return -FILEIO_EINVAL;
|
286 |
|
|
if ( __fileio_retcode < 0 && __fileio_errno_set )
|
287 |
|
|
return -__fileio_errno;
|
288 |
|
|
else
|
289 |
|
|
return __fileio_retcode;
|
290 |
|
|
} // gdbfileio_common_sendpkt()
|
291 |
|
|
|
292 |
|
|
// deal with a received F packet. This is called from __process_packet in
|
293 |
|
|
// generic-stub.c
|
294 |
|
|
__externC void
|
295 |
|
|
cyg_hal_gdbfileio_process_F_packet( char *packet,
|
296 |
|
|
char *__remcomOutBuffer )
|
297 |
|
|
{
|
298 |
|
|
// Reply packet structure:
|
299 |
|
|
// F<retcode>[,<errno>[,<Ctrl-C flag>]][;<call specific attachment>]
|
300 |
|
|
|
301 |
|
|
char *p = &packet[1];
|
302 |
|
|
cyg_bool minus = false;
|
303 |
|
|
target_register_t temptrt;
|
304 |
|
|
|
305 |
|
|
__fileio_retcode_set = __fileio_errno_set = __fileio_ctrlc_set = false;
|
306 |
|
|
|
307 |
|
|
if (*p == '-') {
|
308 |
|
|
minus = true;
|
309 |
|
|
p++;
|
310 |
|
|
}
|
311 |
|
|
|
312 |
|
|
__hexToInt( &p, &temptrt );
|
313 |
|
|
__fileio_retcode = minus ? -(int)temptrt : (int)temptrt;
|
314 |
|
|
__fileio_retcode_set = true;
|
315 |
|
|
|
316 |
|
|
if ( *p++ == ',' ) {
|
317 |
|
|
// get errno
|
318 |
|
|
__hexToInt( &p, &temptrt );
|
319 |
|
|
__fileio_errno = (int)temptrt;
|
320 |
|
|
__fileio_errno_set = true;
|
321 |
|
|
if ( *p++ == ',' ) {
|
322 |
|
|
if ( *p == 'C' ) {
|
323 |
|
|
__fileio_ctrlc_set = true;
|
324 |
|
|
}
|
325 |
|
|
}
|
326 |
|
|
}
|
327 |
|
|
// ignore anything afterwards (e.g. call specific attachment) for now
|
328 |
|
|
|
329 |
|
|
} // cyg_hal_gdbfileio_process_F_packet()
|
330 |
|
|
|
331 |
|
|
__externC int
|
332 |
|
|
cyg_hal_gdbfileio_open( const char *name, int flags, int mode, int *sig )
|
333 |
|
|
{
|
334 |
|
|
size_t namelen;
|
335 |
|
|
unsigned int i=0;
|
336 |
|
|
fio_mode_t fmode;
|
337 |
|
|
fio_int_t fflags;
|
338 |
|
|
|
339 |
|
|
// clear out unsupported flags/modes, as per the spec
|
340 |
|
|
flags &= FILEIO_O_SUPPORTED;
|
341 |
|
|
mode &= FILEIO_S_SUPPORTED;
|
342 |
|
|
|
343 |
|
|
gdbfileio_newlib_to_fio_int_t( &flags, &fflags );
|
344 |
|
|
gdbfileio_newlib_to_fio_mode_t( &mode, &fmode );
|
345 |
|
|
|
346 |
|
|
__remcomOutBuffer[i++] = 'F';
|
347 |
|
|
__remcomOutBuffer[i++] = 'o';
|
348 |
|
|
__remcomOutBuffer[i++] = 'p';
|
349 |
|
|
__remcomOutBuffer[i++] = 'e';
|
350 |
|
|
__remcomOutBuffer[i++] = 'n';
|
351 |
|
|
__remcomOutBuffer[i++] = ',';
|
352 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)name,
|
353 |
|
|
sizeof(name)*8 );
|
354 |
|
|
// i now points after the parameter
|
355 |
|
|
__remcomOutBuffer[i++] = '/';
|
356 |
|
|
namelen = strlen( name )+1; // includes '\0'
|
357 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)namelen,
|
358 |
|
|
sizeof(namelen)*8 );
|
359 |
|
|
__remcomOutBuffer[i++] = ',';
|
360 |
|
|
i += chars_to_hex( (char *)&fflags, &__remcomOutBuffer[i], sizeof(fflags) );
|
361 |
|
|
__remcomOutBuffer[i++] = ',';
|
362 |
|
|
i += chars_to_hex( (char *)&fmode, &__remcomOutBuffer[i], sizeof(fmode) );
|
363 |
|
|
__remcomOutBuffer[i] = 0;
|
364 |
|
|
|
365 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
366 |
|
|
} // cyg_hal_gdbfileio_open()
|
367 |
|
|
|
368 |
|
|
__externC int
|
369 |
|
|
cyg_hal_gdbfileio_close( int fd, int *sig )
|
370 |
|
|
{
|
371 |
|
|
unsigned int i=0;
|
372 |
|
|
fio_int_t ffd;
|
373 |
|
|
|
374 |
|
|
gdbfileio_newlib_to_fio_int_t( &fd, &ffd );
|
375 |
|
|
__remcomOutBuffer[i++] = 'F';
|
376 |
|
|
__remcomOutBuffer[i++] = 'c';
|
377 |
|
|
__remcomOutBuffer[i++] = 'l';
|
378 |
|
|
__remcomOutBuffer[i++] = 'o';
|
379 |
|
|
__remcomOutBuffer[i++] = 's';
|
380 |
|
|
__remcomOutBuffer[i++] = 'e';
|
381 |
|
|
__remcomOutBuffer[i++] = ',';
|
382 |
|
|
i += chars_to_hex( (char *)&ffd, &__remcomOutBuffer[i], sizeof(ffd) );
|
383 |
|
|
// i now points after the parameter
|
384 |
|
|
__remcomOutBuffer[i] = 0;
|
385 |
|
|
|
386 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
387 |
|
|
} // cyg_hal_gdbfileio_close()
|
388 |
|
|
|
389 |
|
|
__externC int
|
390 |
|
|
cyg_hal_gdbfileio_read( int fd, void *buf, size_t count, int *sig )
|
391 |
|
|
{
|
392 |
|
|
unsigned int i=0;
|
393 |
|
|
fio_int_t ffd;
|
394 |
|
|
fio_uint_t fcount;
|
395 |
|
|
unsigned int uicount = (unsigned int)count;
|
396 |
|
|
|
397 |
|
|
gdbfileio_newlib_to_fio_int_t( &fd, &ffd );
|
398 |
|
|
gdbfileio_newlib_to_fio_uint_t( &uicount, &fcount );
|
399 |
|
|
|
400 |
|
|
__remcomOutBuffer[i++] = 'F';
|
401 |
|
|
__remcomOutBuffer[i++] = 'r';
|
402 |
|
|
__remcomOutBuffer[i++] = 'e';
|
403 |
|
|
__remcomOutBuffer[i++] = 'a';
|
404 |
|
|
__remcomOutBuffer[i++] = 'd';
|
405 |
|
|
__remcomOutBuffer[i++] = ',';
|
406 |
|
|
i += chars_to_hex( (char *)&ffd, &__remcomOutBuffer[i], sizeof(ffd) );
|
407 |
|
|
// i now points after the parameter
|
408 |
|
|
__remcomOutBuffer[i++] = ',';
|
409 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)buf,
|
410 |
|
|
sizeof(buf)*8 );
|
411 |
|
|
__remcomOutBuffer[i++] = ',';
|
412 |
|
|
i += chars_to_hex( (char *)&fcount, &__remcomOutBuffer[i], sizeof(fcount) );
|
413 |
|
|
__remcomOutBuffer[i] = 0;
|
414 |
|
|
|
415 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
416 |
|
|
} // cyg_hal_gdbfileio_read()
|
417 |
|
|
|
418 |
|
|
__externC int
|
419 |
|
|
cyg_hal_gdbfileio_write( int fd, const void *buf, size_t count, int *sig )
|
420 |
|
|
{
|
421 |
|
|
unsigned int i=0;
|
422 |
|
|
fio_int_t ffd;
|
423 |
|
|
fio_uint_t fcount;
|
424 |
|
|
unsigned int uicount = (unsigned int)count;
|
425 |
|
|
|
426 |
|
|
gdbfileio_newlib_to_fio_int_t( &fd, &ffd );
|
427 |
|
|
gdbfileio_newlib_to_fio_uint_t( &uicount, &fcount );
|
428 |
|
|
|
429 |
|
|
__remcomOutBuffer[i++] = 'F';
|
430 |
|
|
__remcomOutBuffer[i++] = 'w';
|
431 |
|
|
__remcomOutBuffer[i++] = 'r';
|
432 |
|
|
__remcomOutBuffer[i++] = 'i';
|
433 |
|
|
__remcomOutBuffer[i++] = 't';
|
434 |
|
|
__remcomOutBuffer[i++] = 'e';
|
435 |
|
|
__remcomOutBuffer[i++] = ',';
|
436 |
|
|
i += chars_to_hex( (char *)&ffd, &__remcomOutBuffer[i], sizeof(ffd) );
|
437 |
|
|
// i now points after the parameter
|
438 |
|
|
__remcomOutBuffer[i++] = ',';
|
439 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)buf,
|
440 |
|
|
sizeof(buf)*8 );
|
441 |
|
|
__remcomOutBuffer[i++] = ',';
|
442 |
|
|
i += chars_to_hex( (char *)&fcount, &__remcomOutBuffer[i], sizeof(fcount) );
|
443 |
|
|
__remcomOutBuffer[i] = 0;
|
444 |
|
|
|
445 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
446 |
|
|
} // cyg_hal_gdbfileio_write()
|
447 |
|
|
|
448 |
|
|
__externC int
|
449 |
|
|
cyg_hal_gdbfileio_lseek( int fd, /* off_t */ long offset, int whence, int *sig )
|
450 |
|
|
{
|
451 |
|
|
unsigned int i=0;
|
452 |
|
|
fio_int_t ffd;
|
453 |
|
|
fio_long_t foffset;
|
454 |
|
|
fio_int_t fwhence;
|
455 |
|
|
|
456 |
|
|
gdbfileio_newlib_to_fio_int_t( &fd, &ffd );
|
457 |
|
|
gdbfileio_newlib_to_fio_long_t( &offset, &foffset );
|
458 |
|
|
gdbfileio_newlib_to_fio_int_t( &whence, &fwhence );
|
459 |
|
|
|
460 |
|
|
__remcomOutBuffer[i++] = 'F';
|
461 |
|
|
__remcomOutBuffer[i++] = 'l';
|
462 |
|
|
__remcomOutBuffer[i++] = 's';
|
463 |
|
|
__remcomOutBuffer[i++] = 'e';
|
464 |
|
|
__remcomOutBuffer[i++] = 'e';
|
465 |
|
|
__remcomOutBuffer[i++] = 'k';
|
466 |
|
|
__remcomOutBuffer[i++] = ',';
|
467 |
|
|
i += chars_to_hex( (char *)&ffd, &__remcomOutBuffer[i], sizeof(ffd) );
|
468 |
|
|
// i now points after the parameter
|
469 |
|
|
__remcomOutBuffer[i++] = ',';
|
470 |
|
|
i += chars_to_hex( (char *)&foffset, &__remcomOutBuffer[i],
|
471 |
|
|
sizeof(foffset) );
|
472 |
|
|
__remcomOutBuffer[i++] = ',';
|
473 |
|
|
i += chars_to_hex( (char *)&fwhence, &__remcomOutBuffer[i],
|
474 |
|
|
sizeof(fwhence) );
|
475 |
|
|
__remcomOutBuffer[i] = 0;
|
476 |
|
|
|
477 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
478 |
|
|
} // cyg_hal_gdbfileio_lseek()
|
479 |
|
|
|
480 |
|
|
__externC int
|
481 |
|
|
cyg_hal_gdbfileio_rename( const char *oldpath, const char *newpath, int *sig )
|
482 |
|
|
{
|
483 |
|
|
unsigned int i=0;
|
484 |
|
|
size_t namelen;
|
485 |
|
|
|
486 |
|
|
__remcomOutBuffer[i++] = 'F';
|
487 |
|
|
__remcomOutBuffer[i++] = 'r';
|
488 |
|
|
__remcomOutBuffer[i++] = 'e';
|
489 |
|
|
__remcomOutBuffer[i++] = 'n';
|
490 |
|
|
__remcomOutBuffer[i++] = 'a';
|
491 |
|
|
__remcomOutBuffer[i++] = 'm';
|
492 |
|
|
__remcomOutBuffer[i++] = 'e';
|
493 |
|
|
__remcomOutBuffer[i++] = ',';
|
494 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)oldpath,
|
495 |
|
|
sizeof(oldpath)*8 );
|
496 |
|
|
// i now points after the parameter
|
497 |
|
|
__remcomOutBuffer[i++] = '/';
|
498 |
|
|
namelen = strlen( oldpath )+1; // includes '\0'
|
499 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)namelen,
|
500 |
|
|
sizeof(namelen)*8 );
|
501 |
|
|
__remcomOutBuffer[i++] = ',';
|
502 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)newpath,
|
503 |
|
|
sizeof(newpath)*8 );
|
504 |
|
|
// i now points after the parameter
|
505 |
|
|
__remcomOutBuffer[i++] = '/';
|
506 |
|
|
namelen = strlen( newpath )+1; // includes '\0'
|
507 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)namelen,
|
508 |
|
|
sizeof(namelen)*8 );
|
509 |
|
|
__remcomOutBuffer[i] = 0;
|
510 |
|
|
|
511 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
512 |
|
|
} // cyg_hal_gdbfileio_rename()
|
513 |
|
|
|
514 |
|
|
__externC int
|
515 |
|
|
cyg_hal_gdbfileio_unlink( const char *pathname, int *sig )
|
516 |
|
|
{
|
517 |
|
|
unsigned int i=0;
|
518 |
|
|
size_t namelen;
|
519 |
|
|
|
520 |
|
|
__remcomOutBuffer[i++] = 'F';
|
521 |
|
|
__remcomOutBuffer[i++] = 'u';
|
522 |
|
|
__remcomOutBuffer[i++] = 'n';
|
523 |
|
|
__remcomOutBuffer[i++] = 'l';
|
524 |
|
|
__remcomOutBuffer[i++] = 'i';
|
525 |
|
|
__remcomOutBuffer[i++] = 'n';
|
526 |
|
|
__remcomOutBuffer[i++] = 'k';
|
527 |
|
|
__remcomOutBuffer[i++] = ',';
|
528 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)pathname,
|
529 |
|
|
sizeof(pathname)*8 );
|
530 |
|
|
// i now points after the parameter
|
531 |
|
|
__remcomOutBuffer[i++] = '/';
|
532 |
|
|
namelen = strlen( pathname )+1; // includes '\0'
|
533 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)namelen,
|
534 |
|
|
sizeof(namelen)*8 );
|
535 |
|
|
__remcomOutBuffer[i] = 0;
|
536 |
|
|
|
537 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
538 |
|
|
} // cyg_hal_gdbfileio_unlink()
|
539 |
|
|
|
540 |
|
|
__externC int
|
541 |
|
|
cyg_hal_gdbfileio_isatty( int fd, int *sig )
|
542 |
|
|
{
|
543 |
|
|
unsigned int i=0;
|
544 |
|
|
fio_int_t ffd;
|
545 |
|
|
|
546 |
|
|
gdbfileio_newlib_to_fio_int_t( &fd, &ffd );
|
547 |
|
|
|
548 |
|
|
__remcomOutBuffer[i++] = 'F';
|
549 |
|
|
__remcomOutBuffer[i++] = 'i';
|
550 |
|
|
__remcomOutBuffer[i++] = 's';
|
551 |
|
|
__remcomOutBuffer[i++] = 'a';
|
552 |
|
|
__remcomOutBuffer[i++] = 't';
|
553 |
|
|
__remcomOutBuffer[i++] = 't';
|
554 |
|
|
__remcomOutBuffer[i++] = 'y';
|
555 |
|
|
__remcomOutBuffer[i++] = ',';
|
556 |
|
|
i += chars_to_hex( (char *)&ffd, &__remcomOutBuffer[i], sizeof(ffd) );
|
557 |
|
|
// i now points after the parameter
|
558 |
|
|
__remcomOutBuffer[i] = 0;
|
559 |
|
|
|
560 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
561 |
|
|
} // cyg_hal_gdbfileio_isatty()
|
562 |
|
|
|
563 |
|
|
__externC int
|
564 |
|
|
cyg_hal_gdbfileio_system( const char *command, int *sig )
|
565 |
|
|
{
|
566 |
|
|
unsigned int i=0;
|
567 |
|
|
size_t namelen;
|
568 |
|
|
|
569 |
|
|
__remcomOutBuffer[i++] = 'F';
|
570 |
|
|
__remcomOutBuffer[i++] = 's';
|
571 |
|
|
__remcomOutBuffer[i++] = 'y';
|
572 |
|
|
__remcomOutBuffer[i++] = 's';
|
573 |
|
|
__remcomOutBuffer[i++] = 't';
|
574 |
|
|
__remcomOutBuffer[i++] = 'e';
|
575 |
|
|
__remcomOutBuffer[i++] = 'm';
|
576 |
|
|
__remcomOutBuffer[i++] = ',';
|
577 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)command,
|
578 |
|
|
sizeof(command)*8 );
|
579 |
|
|
// i now points after the parameter
|
580 |
|
|
__remcomOutBuffer[i++] = '/';
|
581 |
|
|
namelen = strlen( command )+1; // includes '\0'
|
582 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)namelen,
|
583 |
|
|
sizeof(namelen)*8 );
|
584 |
|
|
__remcomOutBuffer[i] = 0;
|
585 |
|
|
|
586 |
|
|
return gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
587 |
|
|
} // cyg_hal_gdbfileio_system()
|
588 |
|
|
|
589 |
|
|
__externC int
|
590 |
|
|
cyg_hal_gdbfileio_gettimeofday( void *tv, void *tz, int *sig )
|
591 |
|
|
{
|
592 |
|
|
unsigned int i=0;
|
593 |
|
|
struct newlib_timeval *ntv = (struct newlib_timeval *)tv;
|
594 |
|
|
struct fio_timeval ftv;
|
595 |
|
|
int rc;
|
596 |
|
|
|
597 |
|
|
// protocol doesn't support non-null timezone. Just enforce it here.
|
598 |
|
|
if (NULL != tz)
|
599 |
|
|
return -FILEIO_EINVAL;
|
600 |
|
|
|
601 |
|
|
__remcomOutBuffer[i++] = 'F';
|
602 |
|
|
__remcomOutBuffer[i++] = 'g';
|
603 |
|
|
__remcomOutBuffer[i++] = 'e';
|
604 |
|
|
__remcomOutBuffer[i++] = 't';
|
605 |
|
|
__remcomOutBuffer[i++] = 't';
|
606 |
|
|
__remcomOutBuffer[i++] = 'i';
|
607 |
|
|
__remcomOutBuffer[i++] = 'm';
|
608 |
|
|
__remcomOutBuffer[i++] = 'e';
|
609 |
|
|
__remcomOutBuffer[i++] = 'o';
|
610 |
|
|
__remcomOutBuffer[i++] = 'f';
|
611 |
|
|
__remcomOutBuffer[i++] = 'd';
|
612 |
|
|
__remcomOutBuffer[i++] = 'a';
|
613 |
|
|
__remcomOutBuffer[i++] = 'y';
|
614 |
|
|
__remcomOutBuffer[i++] = ',';
|
615 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)&ftv,
|
616 |
|
|
sizeof(&ftv)*8 );
|
617 |
|
|
__remcomOutBuffer[i++] = ',';
|
618 |
|
|
__remcomOutBuffer[i++] = '0'; // tzptr
|
619 |
|
|
__remcomOutBuffer[i] = 0;
|
620 |
|
|
|
621 |
|
|
rc = gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
622 |
|
|
|
623 |
|
|
// now ftv should have its contents filled
|
624 |
|
|
gdbfileio_fio_to_newlib_time_t( &ftv.tv_sec, &ntv->tv_sec );
|
625 |
|
|
gdbfileio_fio_to_newlib_long_t( &ftv.tv_usec, &ntv->tv_usec );
|
626 |
|
|
|
627 |
|
|
return rc;
|
628 |
|
|
} // cyg_hal_gdbfileio_gettimeofday()
|
629 |
|
|
|
630 |
|
|
__externC int
|
631 |
|
|
cyg_hal_gdbfileio_stat( const char *pathname, struct newlib_stat *buf,
|
632 |
|
|
int *sig )
|
633 |
|
|
{
|
634 |
|
|
unsigned int i=0;
|
635 |
|
|
int rc;
|
636 |
|
|
size_t namelen;
|
637 |
|
|
struct fio_stat fbuf;
|
638 |
|
|
|
639 |
|
|
__remcomOutBuffer[i++] = 'F';
|
640 |
|
|
__remcomOutBuffer[i++] = 's';
|
641 |
|
|
__remcomOutBuffer[i++] = 't';
|
642 |
|
|
__remcomOutBuffer[i++] = 'a';
|
643 |
|
|
__remcomOutBuffer[i++] = 't';
|
644 |
|
|
__remcomOutBuffer[i++] = ',';
|
645 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)pathname,
|
646 |
|
|
sizeof(pathname)*8 );
|
647 |
|
|
// i now points after the parameter
|
648 |
|
|
__remcomOutBuffer[i++] = '/';
|
649 |
|
|
namelen = strlen( pathname )+1; // includes '\0'
|
650 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)namelen,
|
651 |
|
|
sizeof(namelen)*8 );
|
652 |
|
|
__remcomOutBuffer[i++] = ',';
|
653 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)&fbuf,
|
654 |
|
|
sizeof(&fbuf)*8 );
|
655 |
|
|
__remcomOutBuffer[i] = 0;
|
656 |
|
|
|
657 |
|
|
rc = gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
658 |
|
|
|
659 |
|
|
// now fbuf should have its contents filled
|
660 |
|
|
gdbfileio_fio_to_newlib_dev_t( &fbuf.st_dev, &buf->st_dev );
|
661 |
|
|
gdbfileio_fio_to_newlib_ino_t( &fbuf.st_ino, &buf->st_ino );
|
662 |
|
|
gdbfileio_fio_to_newlib_mode_t( &fbuf.st_mode, &buf->st_mode );
|
663 |
|
|
gdbfileio_fio_to_newlib_nlink_t( &fbuf.st_nlink, &buf->st_nlink );
|
664 |
|
|
gdbfileio_fio_to_newlib_uid_t( &fbuf.st_uid, &buf->st_uid );
|
665 |
|
|
gdbfileio_fio_to_newlib_gid_t( &fbuf.st_gid, &buf->st_gid );
|
666 |
|
|
gdbfileio_fio_to_newlib_dev_t( &fbuf.st_rdev, &buf->st_rdev );
|
667 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
668 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
669 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
670 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
671 |
|
|
#if !defined(__svr4__) || defined(__PPC__) || defined(__sun__)
|
672 |
|
|
gdbfileio_fio_to_newlib_long_t( &fbuf.st_blksize, &buf->st_blksize );
|
673 |
|
|
gdbfileio_fio_to_newlib_long_t( &fbuf.st_blocks, &buf->st_blocks );
|
674 |
|
|
#endif
|
675 |
|
|
gdbfileio_fio_to_newlib_time_t( &fbuf.st_atime, &buf->st_atime );
|
676 |
|
|
gdbfileio_fio_to_newlib_time_t( &fbuf.st_mtime, &buf->st_mtime );
|
677 |
|
|
gdbfileio_fio_to_newlib_time_t( &fbuf.st_ctime, &buf->st_ctime );
|
678 |
|
|
|
679 |
|
|
return rc;
|
680 |
|
|
} // cyg_hal_gdbfileio_stat()
|
681 |
|
|
|
682 |
|
|
__externC int
|
683 |
|
|
cyg_hal_gdbfileio_fstat( int fd, struct newlib_stat *buf, int *sig )
|
684 |
|
|
{
|
685 |
|
|
unsigned int i=0;
|
686 |
|
|
int rc;
|
687 |
|
|
struct fio_stat fbuf;
|
688 |
|
|
|
689 |
|
|
__remcomOutBuffer[i++] = 'F';
|
690 |
|
|
__remcomOutBuffer[i++] = 'f';
|
691 |
|
|
__remcomOutBuffer[i++] = 's';
|
692 |
|
|
__remcomOutBuffer[i++] = 't';
|
693 |
|
|
__remcomOutBuffer[i++] = 'a';
|
694 |
|
|
__remcomOutBuffer[i++] = 't';
|
695 |
|
|
__remcomOutBuffer[i++] = ',';
|
696 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)fd,
|
697 |
|
|
sizeof(fd)*8 );
|
698 |
|
|
// i now points after the parameter
|
699 |
|
|
__remcomOutBuffer[i++] = ',';
|
700 |
|
|
i += __intToHex( &__remcomOutBuffer[i], (target_register_t)&fbuf,
|
701 |
|
|
sizeof(&fbuf)*8 );
|
702 |
|
|
__remcomOutBuffer[i] = 0;
|
703 |
|
|
|
704 |
|
|
rc = gdbfileio_common_sendpkt( __remcomOutBuffer, sig );
|
705 |
|
|
|
706 |
|
|
// now fbuf should have its contents filled
|
707 |
|
|
gdbfileio_fio_to_newlib_dev_t( &fbuf.st_dev, &buf->st_dev );
|
708 |
|
|
gdbfileio_fio_to_newlib_ino_t( &fbuf.st_ino, &buf->st_ino );
|
709 |
|
|
gdbfileio_fio_to_newlib_mode_t( &fbuf.st_mode, &buf->st_mode );
|
710 |
|
|
gdbfileio_fio_to_newlib_nlink_t( &fbuf.st_nlink, &buf->st_nlink );
|
711 |
|
|
gdbfileio_fio_to_newlib_uid_t( &fbuf.st_uid, &buf->st_uid );
|
712 |
|
|
gdbfileio_fio_to_newlib_gid_t( &fbuf.st_gid, &buf->st_gid );
|
713 |
|
|
gdbfileio_fio_to_newlib_dev_t( &fbuf.st_rdev, &buf->st_rdev );
|
714 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
715 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
716 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
717 |
|
|
gdbfileio_fio_to_newlib_off_t( &fbuf.st_size, &buf->st_size );
|
718 |
|
|
#if !defined(__svr4__) || defined(__PPC__) || defined(__sun__)
|
719 |
|
|
gdbfileio_fio_to_newlib_long_t( &fbuf.st_blksize, &buf->st_blksize );
|
720 |
|
|
gdbfileio_fio_to_newlib_long_t( &fbuf.st_blocks, &buf->st_blocks );
|
721 |
|
|
#endif
|
722 |
|
|
gdbfileio_fio_to_newlib_time_t( &fbuf.st_atime, &buf->st_atime );
|
723 |
|
|
gdbfileio_fio_to_newlib_time_t( &fbuf.st_mtime, &buf->st_mtime );
|
724 |
|
|
gdbfileio_fio_to_newlib_time_t( &fbuf.st_ctime, &buf->st_ctime );
|
725 |
|
|
|
726 |
|
|
return rc;
|
727 |
|
|
} // cyg_hal_gdbfileio_fstat()
|
728 |
|
|
|
729 |
|
|
/* EOF gdb-fileio.c */
|