summaryrefslogtreecommitdiffstats
path: root/bsd-user/freebsd/os-syscall.c
diff options
context:
space:
mode:
authorWarner Losh2022-02-01 00:10:10 +0100
committerWarner Losh2022-06-11 06:00:48 +0200
commit80da1b00886782520286e26f39ce8e21c1855072 (patch)
tree73ba828c84f904425a166ae7c1c243914b7e8fc6 /bsd-user/freebsd/os-syscall.c
parentbsd-user/freebsd/os-syscall.c: Tracing and error boilerplate (diff)
downloadqemu-80da1b00886782520286e26f39ce8e21c1855072.tar.gz
qemu-80da1b00886782520286e26f39ce8e21c1855072.tar.xz
qemu-80da1b00886782520286e26f39ce8e21c1855072.zip
bsd-user/bsd-file.h: Add implementations for read, pread, readv and preadv
Implement do_bsd_{read,pread,readv,preadv}. Connect them to the system call table. Signed-off-by: Stacey Son <sson@FreeBSD.org> Signed-off-by: Kyle Evans <kevans@FreeBSD.org> Signed-off-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'bsd-user/freebsd/os-syscall.c')
-rw-r--r--bsd-user/freebsd/os-syscall.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 1c4c9983f1..8ca92f2985 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -42,6 +42,14 @@
#include "bsd-file.h"
+/* I/O */
+safe_syscall3(ssize_t, read, int, fd, void *, buf, size_t, nbytes);
+safe_syscall4(ssize_t, pread, int, fd, void *, buf, size_t, nbytes, off_t,
+ offset);
+safe_syscall3(ssize_t, readv, int, fd, const struct iovec *, iov, int, iovcnt);
+safe_syscall4(ssize_t, preadv, int, fd, const struct iovec *, iov, int, iovcnt,
+ off_t, offset);
+
void target_set_brk(abi_ulong new_brk)
{
}
@@ -200,6 +208,26 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
abi_long ret;
switch (num) {
+
+ /*
+ * File system calls.
+ */
+ case TARGET_FREEBSD_NR_read: /* read(2) */
+ ret = do_bsd_read(arg1, arg2, arg3);
+ break;
+
+ case TARGET_FREEBSD_NR_pread: /* pread(2) */
+ ret = do_bsd_pread(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
+ break;
+
+ case TARGET_FREEBSD_NR_readv: /* readv(2) */
+ ret = do_bsd_readv(arg1, arg2, arg3);
+ break;
+
+ case TARGET_FREEBSD_NR_preadv: /* preadv(2) */
+ ret = do_bsd_preadv(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
+ break;
+
default:
qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num);
ret = -TARGET_ENOSYS;