1 /* syscalls.c --- implement system calls for the RX simulator.
3 Copyright (C) 2005, 2007-2012 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
6 This file is part of the GNU simulators.
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.
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.
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/>. */
29 #include "gdb/callback.h"
37 /* The current syscall callbacks we're using. */
38 static struct host_callback_struct
*callbacks
;
41 set_callbacks (struct host_callback_struct
*cb
)
47 /* Arguments 1..4 are in R1..R4, remainder on stack.
49 Return value in R1..R4 as needed.
50 structs bigger than 16 bytes: pointer pushed on stack last
52 We only support arguments that fit in general registers.
54 The system call number is in R5. We expect ssycalls to look like
72 return get_reg (argp
);
74 rv
= mem_get_si (get_reg (sp
) + stackp
);
80 read_target (char *buffer
, int address
, int count
, int asciiz
)
85 byte
= mem_get_qi (address
++);
87 if (asciiz
&& (byte
== 0))
94 write_target (char *buffer
, int address
, int count
, int asciiz
)
100 mem_put_qi (address
++, byte
);
101 if (asciiz
&& (byte
== 0))
107 #define PTRSZ (A16 ? 2 : 3)
109 static char *callnames
[] = {
137 static char buf
[256];
143 printf ("\033[31m/* SYSCALL(%d) = %s */\033[0m\n", id
, id
<= SYS_link
? callnames
[id
] : "unknown");
150 printf ("[exit %d]\n", ec
);
151 return RX_MAKE_EXITED (ec
);
158 /* The open function is defined as taking a variable number of arguments
159 because the third parameter to it is optional:
160 open (const char * filename, int flags, ...);
161 Hence the oflags and cflags arguments will be on the stack and we need
162 to skip the (empty) argument registers r3 and r4. */
167 read_target (buf
, path
, 256, 1);
169 printf ("open(\"%s\",0x%x,%#o) = ", buf
, oflags
, cflags
);
172 /* The callback vector ignores CFLAGS. */
173 rv
= callbacks
->open (callbacks
, buf
, oflags
);
179 h_oflags
|= O_WRONLY
;
185 h_oflags
|= O_APPEND
;
188 rv
= open (buf
, h_oflags
, cflags
);
201 rv
= callbacks
->close (callbacks
, fd
);
207 printf ("close(%d) = %d\n", fd
, rv
);
218 if (count
> sizeof (buf
))
219 count
= sizeof (buf
);
221 rv
= callbacks
->read (callbacks
, fd
, buf
, count
);
223 rv
= read (fd
, buf
, count
);
225 printf ("read(%d,%d) = %d\n", fd
, count
, rv
);
227 write_target (buf
, addr
, rv
, 0);
238 if (count
> sizeof (buf
))
239 count
= sizeof (buf
);
241 printf ("write(%d,0x%x,%d)\n", fd
, addr
, count
);
242 read_target (buf
, addr
, count
, 0);
246 rv
= callbacks
->write (callbacks
, fd
, buf
, count
);
248 rv
= write (fd
, buf
, count
);
250 printf ("write(%d,%d) = %d\n", fd
, count
, rv
);
259 case SYS_gettimeofday
:
264 rv
= gettimeofday (&tv
, 0);
266 printf ("gettimeofday: %ld sec %ld usec to 0x%x\n", tv
.tv_sec
,
268 mem_put_si (tvaddr
, tv
.tv_sec
);
269 mem_put_si (tvaddr
+ 4, tv
.tv_usec
);
281 printf ("[signal %d]\n", sig
);
282 return RX_MAKE_STOPPED (sig
);
289 int heaptop_arg
= arg ();
291 printf ("sbrk: heap top set to %x\n", heaptop_arg
);
292 heaptop
= heaptop_arg
;
294 heapbottom
= heaptop_arg
;
301 mem_put_si (addr
, rx_cycles
+ mem_usage_cycles());
306 return RX_MAKE_STEPPED ();
This page took 0.048799 seconds and 5 git commands to generate.