2 * Syscall implementations for semihosting.
4 * Copyright (c) 2022 Linaro
6 * SPDX-License-Identifier: GPL-2.0-or-later
9 #include "qemu/osdep.h"
10 #include "exec/gdbstub.h"
11 #include "semihosting/guestfd.h"
12 #include "semihosting/syscalls.h"
13 #include "semihosting/console.h"
14 #ifdef CONFIG_USER_ONLY
17 #include "semihosting/softmmu-uaccess.h"
22 * Validate or compute the length of the string (including terminator).
24 static int validate_strlen(CPUState
*cs
, target_ulong str
, target_ulong tlen
)
26 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
30 ssize_t slen
= target_strlen(str
);
35 if (slen
>= INT32_MAX
) {
40 if (tlen
> INT32_MAX
) {
43 if (get_user_u8(c
, str
+ tlen
- 1)) {
52 static int validate_lock_user_string(char **pstr
, CPUState
*cs
,
53 target_ulong tstr
, target_ulong tlen
)
55 int ret
= validate_strlen(cs
, tstr
, tlen
);
56 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
60 str
= lock_user(VERIFY_READ
, tstr
, ret
, true);
61 ret
= str
? 0 : -EFAULT
;
68 * TODO: Note that gdb always stores the stat structure big-endian.
69 * So far, that's ok, as the only two targets using this are also
70 * big-endian. Until we do something with gdb, also produce the
71 * same big-endian result from the host.
73 static int copy_stat_to_user(CPUState
*cs
, target_ulong addr
,
76 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
79 if (s
->st_dev
!= (uint32_t)s
->st_dev
||
80 s
->st_ino
!= (uint32_t)s
->st_ino
) {
84 p
= lock_user(VERIFY_WRITE
, addr
, sizeof(struct gdb_stat
), 0);
89 p
->gdb_st_dev
= cpu_to_be32(s
->st_dev
);
90 p
->gdb_st_ino
= cpu_to_be32(s
->st_ino
);
91 p
->gdb_st_mode
= cpu_to_be32(s
->st_mode
);
92 p
->gdb_st_nlink
= cpu_to_be32(s
->st_nlink
);
93 p
->gdb_st_uid
= cpu_to_be32(s
->st_uid
);
94 p
->gdb_st_gid
= cpu_to_be32(s
->st_gid
);
95 p
->gdb_st_rdev
= cpu_to_be32(s
->st_rdev
);
96 p
->gdb_st_size
= cpu_to_be64(s
->st_size
);
98 /* Windows stat is missing some fields. */
99 p
->gdb_st_blksize
= 0;
100 p
->gdb_st_blocks
= 0;
102 p
->gdb_st_blksize
= cpu_to_be64(s
->st_blksize
);
103 p
->gdb_st_blocks
= cpu_to_be64(s
->st_blocks
);
105 p
->gdb_st_atime
= cpu_to_be32(s
->st_atime
);
106 p
->gdb_st_mtime
= cpu_to_be32(s
->st_mtime
);
107 p
->gdb_st_ctime
= cpu_to_be32(s
->st_ctime
);
109 unlock_user(p
, addr
, sizeof(struct gdb_stat
));
114 * GDB semihosting syscall implementations.
117 static gdb_syscall_complete_cb gdb_open_complete
;
119 static void gdb_open_cb(CPUState
*cs
, uint64_t ret
, int err
)
122 int guestfd
= alloc_guestfd();
123 associate_guestfd(guestfd
, ret
);
126 gdb_open_complete(cs
, ret
, err
);
129 static void gdb_open(CPUState
*cs
, gdb_syscall_complete_cb complete
,
130 target_ulong fname
, target_ulong fname_len
,
131 int gdb_flags
, int mode
)
133 int len
= validate_strlen(cs
, fname
, fname_len
);
135 complete(cs
, -1, -len
);
139 gdb_open_complete
= complete
;
140 gdb_do_syscall(gdb_open_cb
, "open,%s,%x,%x",
141 fname
, len
, (target_ulong
)gdb_flags
, (target_ulong
)mode
);
144 static void gdb_close(CPUState
*cs
, gdb_syscall_complete_cb complete
,
147 gdb_do_syscall(complete
, "close,%x", (target_ulong
)gf
->hostfd
);
150 static void gdb_read(CPUState
*cs
, gdb_syscall_complete_cb complete
,
151 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
153 gdb_do_syscall(complete
, "read,%x,%x,%x",
154 (target_ulong
)gf
->hostfd
, buf
, len
);
157 static void gdb_write(CPUState
*cs
, gdb_syscall_complete_cb complete
,
158 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
160 gdb_do_syscall(complete
, "write,%x,%x,%x",
161 (target_ulong
)gf
->hostfd
, buf
, len
);
164 static void gdb_lseek(CPUState
*cs
, gdb_syscall_complete_cb complete
,
165 GuestFD
*gf
, int64_t off
, int gdb_whence
)
167 gdb_do_syscall(complete
, "lseek,%x,%lx,%x",
168 (target_ulong
)gf
->hostfd
, off
, (target_ulong
)gdb_whence
);
171 static void gdb_isatty(CPUState
*cs
, gdb_syscall_complete_cb complete
,
174 gdb_do_syscall(complete
, "isatty,%x", (target_ulong
)gf
->hostfd
);
177 static void gdb_fstat(CPUState
*cs
, gdb_syscall_complete_cb complete
,
178 GuestFD
*gf
, target_ulong addr
)
180 gdb_do_syscall(complete
, "fstat,%x,%x", (target_ulong
)gf
->hostfd
, addr
);
183 static void gdb_stat(CPUState
*cs
, gdb_syscall_complete_cb complete
,
184 target_ulong fname
, target_ulong fname_len
,
187 int len
= validate_strlen(cs
, fname
, fname_len
);
189 complete(cs
, -1, -len
);
193 gdb_do_syscall(complete
, "stat,%s,%x", fname
, len
, addr
);
196 static void gdb_remove(CPUState
*cs
, gdb_syscall_complete_cb complete
,
197 target_ulong fname
, target_ulong fname_len
)
199 int len
= validate_strlen(cs
, fname
, fname_len
);
201 complete(cs
, -1, -len
);
205 gdb_do_syscall(complete
, "unlink,%s", fname
, len
);
208 static void gdb_rename(CPUState
*cs
, gdb_syscall_complete_cb complete
,
209 target_ulong oname
, target_ulong oname_len
,
210 target_ulong nname
, target_ulong nname_len
)
214 olen
= validate_strlen(cs
, oname
, oname_len
);
216 complete(cs
, -1, -olen
);
219 nlen
= validate_strlen(cs
, nname
, nname_len
);
221 complete(cs
, -1, -nlen
);
225 gdb_do_syscall(complete
, "rename,%s,%s", oname
, olen
, nname
, nlen
);
228 static void gdb_system(CPUState
*cs
, gdb_syscall_complete_cb complete
,
229 target_ulong cmd
, target_ulong cmd_len
)
231 int len
= validate_strlen(cs
, cmd
, cmd_len
);
233 complete(cs
, -1, -len
);
237 gdb_do_syscall(complete
, "system,%s", cmd
, len
);
240 static void gdb_gettimeofday(CPUState
*cs
, gdb_syscall_complete_cb complete
,
241 target_ulong tv_addr
, target_ulong tz_addr
)
243 gdb_do_syscall(complete
, "gettimeofday,%x,%x", tv_addr
, tz_addr
);
247 * Host semihosting syscall implementations.
250 static void host_open(CPUState
*cs
, gdb_syscall_complete_cb complete
,
251 target_ulong fname
, target_ulong fname_len
,
252 int gdb_flags
, int mode
)
254 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
256 int ret
, host_flags
= O_BINARY
;
258 ret
= validate_lock_user_string(&p
, cs
, fname
, fname_len
);
260 complete(cs
, -1, -ret
);
264 if (gdb_flags
& GDB_O_WRONLY
) {
265 host_flags
|= O_WRONLY
;
266 } else if (gdb_flags
& GDB_O_RDWR
) {
267 host_flags
|= O_RDWR
;
269 host_flags
|= O_RDONLY
;
271 if (gdb_flags
& GDB_O_CREAT
) {
272 host_flags
|= O_CREAT
;
274 if (gdb_flags
& GDB_O_TRUNC
) {
275 host_flags
|= O_TRUNC
;
277 if (gdb_flags
& GDB_O_EXCL
) {
278 host_flags
|= O_EXCL
;
281 ret
= open(p
, host_flags
, mode
);
283 complete(cs
, -1, errno
);
285 int guestfd
= alloc_guestfd();
286 associate_guestfd(guestfd
, ret
);
287 complete(cs
, guestfd
, 0);
289 unlock_user(p
, fname
, 0);
292 static void host_close(CPUState
*cs
, gdb_syscall_complete_cb complete
,
296 * Only close the underlying host fd if it's one we opened on behalf
297 * of the guest in SYS_OPEN.
299 if (gf
->hostfd
!= STDIN_FILENO
&&
300 gf
->hostfd
!= STDOUT_FILENO
&&
301 gf
->hostfd
!= STDERR_FILENO
&&
302 close(gf
->hostfd
) < 0) {
303 complete(cs
, -1, errno
);
309 static void host_read(CPUState
*cs
, gdb_syscall_complete_cb complete
,
310 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
312 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
313 void *ptr
= lock_user(VERIFY_WRITE
, buf
, len
, 0);
317 complete(cs
, -1, EFAULT
);
320 ret
= RETRY_ON_EINTR(read(gf
->hostfd
, ptr
, len
));
322 unlock_user(ptr
, buf
, 0);
323 complete(cs
, -1, errno
);
325 unlock_user(ptr
, buf
, ret
);
326 complete(cs
, ret
, 0);
330 static void host_write(CPUState
*cs
, gdb_syscall_complete_cb complete
,
331 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
333 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
334 void *ptr
= lock_user(VERIFY_READ
, buf
, len
, 1);
338 complete(cs
, -1, EFAULT
);
341 ret
= write(gf
->hostfd
, ptr
, len
);
342 unlock_user(ptr
, buf
, 0);
343 complete(cs
, ret
, ret
== -1 ? errno
: 0);
346 static void host_lseek(CPUState
*cs
, gdb_syscall_complete_cb complete
,
347 GuestFD
*gf
, int64_t off
, int whence
)
349 /* So far, all hosts use the same values. */
350 QEMU_BUILD_BUG_ON(GDB_SEEK_SET
!= SEEK_SET
);
351 QEMU_BUILD_BUG_ON(GDB_SEEK_CUR
!= SEEK_CUR
);
352 QEMU_BUILD_BUG_ON(GDB_SEEK_END
!= SEEK_END
);
358 ret
= lseek(gf
->hostfd
, ret
, whence
);
366 complete(cs
, ret
, err
);
369 static void host_isatty(CPUState
*cs
, gdb_syscall_complete_cb complete
,
372 int ret
= isatty(gf
->hostfd
);
373 complete(cs
, ret
, ret
? 0 : errno
);
376 static void host_flen(CPUState
*cs
, gdb_syscall_complete_cb complete
,
381 if (fstat(gf
->hostfd
, &buf
) < 0) {
382 complete(cs
, -1, errno
);
384 complete(cs
, buf
.st_size
, 0);
388 static void host_fstat(CPUState
*cs
, gdb_syscall_complete_cb complete
,
389 GuestFD
*gf
, target_ulong addr
)
394 ret
= fstat(gf
->hostfd
, &buf
);
396 complete(cs
, -1, errno
);
399 ret
= copy_stat_to_user(cs
, addr
, &buf
);
400 complete(cs
, ret
? -1 : 0, ret
? -ret
: 0);
403 static void host_stat(CPUState
*cs
, gdb_syscall_complete_cb complete
,
404 target_ulong fname
, target_ulong fname_len
,
407 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
412 ret
= validate_lock_user_string(&name
, cs
, fname
, fname_len
);
414 complete(cs
, -1, -ret
);
418 ret
= stat(name
, &buf
);
422 ret
= copy_stat_to_user(cs
, addr
, &buf
);
429 unlock_user(name
, fname
, 0);
430 complete(cs
, ret
, err
);
433 static void host_remove(CPUState
*cs
, gdb_syscall_complete_cb complete
,
434 target_ulong fname
, target_ulong fname_len
)
436 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
440 ret
= validate_lock_user_string(&p
, cs
, fname
, fname_len
);
442 complete(cs
, -1, -ret
);
447 unlock_user(p
, fname
, 0);
448 complete(cs
, ret
, ret
? errno
: 0);
451 static void host_rename(CPUState
*cs
, gdb_syscall_complete_cb complete
,
452 target_ulong oname
, target_ulong oname_len
,
453 target_ulong nname
, target_ulong nname_len
)
455 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
459 ret
= validate_lock_user_string(&ostr
, cs
, oname
, oname_len
);
461 complete(cs
, -1, -ret
);
464 ret
= validate_lock_user_string(&nstr
, cs
, nname
, nname_len
);
466 unlock_user(ostr
, oname
, 0);
467 complete(cs
, -1, -ret
);
471 ret
= rename(ostr
, nstr
);
472 unlock_user(ostr
, oname
, 0);
473 unlock_user(nstr
, nname
, 0);
474 complete(cs
, ret
, ret
? errno
: 0);
477 static void host_system(CPUState
*cs
, gdb_syscall_complete_cb complete
,
478 target_ulong cmd
, target_ulong cmd_len
)
480 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
484 ret
= validate_lock_user_string(&p
, cs
, cmd
, cmd_len
);
486 complete(cs
, -1, -ret
);
491 unlock_user(p
, cmd
, 0);
492 complete(cs
, ret
, ret
== -1 ? errno
: 0);
495 static void host_gettimeofday(CPUState
*cs
, gdb_syscall_complete_cb complete
,
496 target_ulong tv_addr
, target_ulong tz_addr
)
498 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
499 struct gdb_timeval
*p
;
502 /* GDB fails on non-null TZ, so be consistent. */
504 complete(cs
, -1, EINVAL
);
508 p
= lock_user(VERIFY_WRITE
, tv_addr
, sizeof(struct gdb_timeval
), 0);
510 complete(cs
, -1, EFAULT
);
514 /* TODO: Like stat, gdb always produces big-endian results; match it. */
515 rt
= g_get_real_time();
516 p
->tv_sec
= cpu_to_be32(rt
/ G_USEC_PER_SEC
);
517 p
->tv_usec
= cpu_to_be64(rt
% G_USEC_PER_SEC
);
518 unlock_user(p
, tv_addr
, sizeof(struct gdb_timeval
));
521 #ifndef CONFIG_USER_ONLY
522 static void host_poll_one(CPUState
*cs
, gdb_syscall_complete_cb complete
,
523 GuestFD
*gf
, GIOCondition cond
, int timeout
)
526 * Since this is only used by xtensa in system mode, and stdio is
527 * handled through GuestFDConsole, and there are no semihosting
528 * system calls for sockets and the like, that means this descriptor
529 * must be a normal file. Normal files never block and are thus
532 complete(cs
, cond
& (G_IO_IN
| G_IO_OUT
), 0);
537 * Static file semihosting syscall implementations.
540 static void staticfile_read(CPUState
*cs
, gdb_syscall_complete_cb complete
,
541 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
543 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
544 target_ulong rest
= gf
->staticfile
.len
- gf
->staticfile
.off
;
550 ptr
= lock_user(VERIFY_WRITE
, buf
, len
, 0);
552 complete(cs
, -1, EFAULT
);
555 memcpy(ptr
, gf
->staticfile
.data
+ gf
->staticfile
.off
, len
);
556 gf
->staticfile
.off
+= len
;
557 unlock_user(ptr
, buf
, len
);
558 complete(cs
, len
, 0);
561 static void staticfile_lseek(CPUState
*cs
, gdb_syscall_complete_cb complete
,
562 GuestFD
*gf
, int64_t off
, int gdb_whence
)
566 switch (gdb_whence
) {
571 ret
= gf
->staticfile
.off
+ off
;
574 ret
= gf
->staticfile
.len
+ off
;
580 if (ret
>= 0 && ret
<= gf
->staticfile
.len
) {
581 gf
->staticfile
.off
= ret
;
582 complete(cs
, ret
, 0);
584 complete(cs
, -1, EINVAL
);
588 static void staticfile_flen(CPUState
*cs
, gdb_syscall_complete_cb complete
,
591 complete(cs
, gf
->staticfile
.len
, 0);
595 * Console semihosting syscall implementations.
598 static void console_read(CPUState
*cs
, gdb_syscall_complete_cb complete
,
599 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
601 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
605 ptr
= lock_user(VERIFY_WRITE
, buf
, len
, 0);
607 complete(cs
, -1, EFAULT
);
610 ret
= qemu_semihosting_console_read(cs
, ptr
, len
);
611 unlock_user(ptr
, buf
, ret
);
612 complete(cs
, ret
, 0);
615 static void console_write(CPUState
*cs
, gdb_syscall_complete_cb complete
,
616 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
618 CPUArchState
*env G_GNUC_UNUSED
= cs
->env_ptr
;
619 char *ptr
= lock_user(VERIFY_READ
, buf
, len
, 1);
623 complete(cs
, -1, EFAULT
);
626 ret
= qemu_semihosting_console_write(ptr
, len
);
627 unlock_user(ptr
, buf
, 0);
628 complete(cs
, ret
? ret
: -1, ret
? 0 : EIO
);
631 static void console_fstat(CPUState
*cs
, gdb_syscall_complete_cb complete
,
632 GuestFD
*gf
, target_ulong addr
)
634 static const struct stat tty_buf
= {
635 .st_mode
= 020666, /* S_IFCHR, ugo+rw */
636 .st_rdev
= 5, /* makedev(5, 0) -- linux /dev/tty */
640 ret
= copy_stat_to_user(cs
, addr
, &tty_buf
);
641 complete(cs
, ret
? -1 : 0, ret
? -ret
: 0);
644 #ifndef CONFIG_USER_ONLY
645 static void console_poll_one(CPUState
*cs
, gdb_syscall_complete_cb complete
,
646 GuestFD
*gf
, GIOCondition cond
, int timeout
)
648 /* The semihosting console does not support urgent data or errors. */
649 cond
&= G_IO_IN
| G_IO_OUT
;
652 * Since qemu_semihosting_console_write never blocks, we can
653 * consider output always ready -- leave G_IO_OUT alone.
654 * All that remains is to conditionally signal input ready.
655 * Since output ready causes an immediate return, only block
658 * TODO: Implement proper timeout. For now, only support
659 * indefinite wait or immediate poll.
661 if (cond
== G_IO_IN
&& timeout
< 0) {
662 qemu_semihosting_console_block_until_ready(cs
);
663 /* We returned -- input must be ready. */
664 } else if ((cond
& G_IO_IN
) && !qemu_semihosting_console_ready()) {
668 complete(cs
, cond
, 0);
673 * Syscall entry points.
676 void semihost_sys_open(CPUState
*cs
, gdb_syscall_complete_cb complete
,
677 target_ulong fname
, target_ulong fname_len
,
678 int gdb_flags
, int mode
)
680 if (use_gdb_syscalls()) {
681 gdb_open(cs
, complete
, fname
, fname_len
, gdb_flags
, mode
);
683 host_open(cs
, complete
, fname
, fname_len
, gdb_flags
, mode
);
687 void semihost_sys_close(CPUState
*cs
, gdb_syscall_complete_cb complete
, int fd
)
689 GuestFD
*gf
= get_guestfd(fd
);
692 complete(cs
, -1, EBADF
);
697 gdb_close(cs
, complete
, gf
);
700 host_close(cs
, complete
, gf
);
707 g_assert_not_reached();
712 void semihost_sys_read_gf(CPUState
*cs
, gdb_syscall_complete_cb complete
,
713 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
716 * Bound length for 64-bit guests on 32-bit hosts, not overlowing ssize_t.
717 * Note the Linux kernel does this with MAX_RW_COUNT, so it's not a bad
718 * idea to do this unconditionally.
720 if (len
> INT32_MAX
) {
725 gdb_read(cs
, complete
, gf
, buf
, len
);
728 host_read(cs
, complete
, gf
, buf
, len
);
731 staticfile_read(cs
, complete
, gf
, buf
, len
);
734 console_read(cs
, complete
, gf
, buf
, len
);
737 g_assert_not_reached();
741 void semihost_sys_read(CPUState
*cs
, gdb_syscall_complete_cb complete
,
742 int fd
, target_ulong buf
, target_ulong len
)
744 GuestFD
*gf
= get_guestfd(fd
);
747 semihost_sys_read_gf(cs
, complete
, gf
, buf
, len
);
749 complete(cs
, -1, EBADF
);
753 void semihost_sys_write_gf(CPUState
*cs
, gdb_syscall_complete_cb complete
,
754 GuestFD
*gf
, target_ulong buf
, target_ulong len
)
757 * Bound length for 64-bit guests on 32-bit hosts, not overlowing ssize_t.
758 * Note the Linux kernel does this with MAX_RW_COUNT, so it's not a bad
759 * idea to do this unconditionally.
761 if (len
> INT32_MAX
) {
766 gdb_write(cs
, complete
, gf
, buf
, len
);
769 host_write(cs
, complete
, gf
, buf
, len
);
772 console_write(cs
, complete
, gf
, buf
, len
);
775 /* Static files are never open for writing: EBADF. */
776 complete(cs
, -1, EBADF
);
779 g_assert_not_reached();
783 void semihost_sys_write(CPUState
*cs
, gdb_syscall_complete_cb complete
,
784 int fd
, target_ulong buf
, target_ulong len
)
786 GuestFD
*gf
= get_guestfd(fd
);
789 semihost_sys_write_gf(cs
, complete
, gf
, buf
, len
);
791 complete(cs
, -1, EBADF
);
795 void semihost_sys_lseek(CPUState
*cs
, gdb_syscall_complete_cb complete
,
796 int fd
, int64_t off
, int gdb_whence
)
798 GuestFD
*gf
= get_guestfd(fd
);
801 complete(cs
, -1, EBADF
);
806 gdb_lseek(cs
, complete
, gf
, off
, gdb_whence
);
809 host_lseek(cs
, complete
, gf
, off
, gdb_whence
);
812 staticfile_lseek(cs
, complete
, gf
, off
, gdb_whence
);
815 complete(cs
, -1, ESPIPE
);
818 g_assert_not_reached();
822 void semihost_sys_isatty(CPUState
*cs
, gdb_syscall_complete_cb complete
, int fd
)
824 GuestFD
*gf
= get_guestfd(fd
);
827 complete(cs
, 0, EBADF
);
832 gdb_isatty(cs
, complete
, gf
);
835 host_isatty(cs
, complete
, gf
);
838 complete(cs
, 0, ENOTTY
);
844 g_assert_not_reached();
848 void semihost_sys_flen(CPUState
*cs
, gdb_syscall_complete_cb fstat_cb
,
849 gdb_syscall_complete_cb flen_cb
, int fd
,
850 target_ulong fstat_addr
)
852 GuestFD
*gf
= get_guestfd(fd
);
855 flen_cb(cs
, -1, EBADF
);
860 gdb_fstat(cs
, fstat_cb
, gf
, fstat_addr
);
863 host_flen(cs
, flen_cb
, gf
);
866 staticfile_flen(cs
, flen_cb
, gf
);
870 g_assert_not_reached();
874 void semihost_sys_fstat(CPUState
*cs
, gdb_syscall_complete_cb complete
,
875 int fd
, target_ulong addr
)
877 GuestFD
*gf
= get_guestfd(fd
);
880 complete(cs
, -1, EBADF
);
885 gdb_fstat(cs
, complete
, gf
, addr
);
888 host_fstat(cs
, complete
, gf
, addr
);
891 console_fstat(cs
, complete
, gf
, addr
);
895 g_assert_not_reached();
899 void semihost_sys_stat(CPUState
*cs
, gdb_syscall_complete_cb complete
,
900 target_ulong fname
, target_ulong fname_len
,
903 if (use_gdb_syscalls()) {
904 gdb_stat(cs
, complete
, fname
, fname_len
, addr
);
906 host_stat(cs
, complete
, fname
, fname_len
, addr
);
910 void semihost_sys_remove(CPUState
*cs
, gdb_syscall_complete_cb complete
,
911 target_ulong fname
, target_ulong fname_len
)
913 if (use_gdb_syscalls()) {
914 gdb_remove(cs
, complete
, fname
, fname_len
);
916 host_remove(cs
, complete
, fname
, fname_len
);
920 void semihost_sys_rename(CPUState
*cs
, gdb_syscall_complete_cb complete
,
921 target_ulong oname
, target_ulong oname_len
,
922 target_ulong nname
, target_ulong nname_len
)
924 if (use_gdb_syscalls()) {
925 gdb_rename(cs
, complete
, oname
, oname_len
, nname
, nname_len
);
927 host_rename(cs
, complete
, oname
, oname_len
, nname
, nname_len
);
931 void semihost_sys_system(CPUState
*cs
, gdb_syscall_complete_cb complete
,
932 target_ulong cmd
, target_ulong cmd_len
)
934 if (use_gdb_syscalls()) {
935 gdb_system(cs
, complete
, cmd
, cmd_len
);
937 host_system(cs
, complete
, cmd
, cmd_len
);
941 void semihost_sys_gettimeofday(CPUState
*cs
, gdb_syscall_complete_cb complete
,
942 target_ulong tv_addr
, target_ulong tz_addr
)
944 if (use_gdb_syscalls()) {
945 gdb_gettimeofday(cs
, complete
, tv_addr
, tz_addr
);
947 host_gettimeofday(cs
, complete
, tv_addr
, tz_addr
);
951 #ifndef CONFIG_USER_ONLY
952 void semihost_sys_poll_one(CPUState
*cs
, gdb_syscall_complete_cb complete
,
953 int fd
, GIOCondition cond
, int timeout
)
955 GuestFD
*gf
= get_guestfd(fd
);
958 complete(cs
, G_IO_NVAL
, 1);
963 complete(cs
, G_IO_NVAL
, 1);
966 host_poll_one(cs
, complete
, gf
, cond
, timeout
);
969 console_poll_one(cs
, complete
, gf
, cond
, timeout
);
973 g_assert_not_reached();