[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 01/11] bsd-user: Implement open, openat and close
From: |
Warner Losh |
Subject: |
[PATCH 01/11] bsd-user: Implement open, openat and close |
Date: |
Sun, 12 Jun 2022 14:48:41 -0600 |
Add the open, openat and close system calls. We need to lock paths, so
implmenent that as well.
Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Jung-uk Kim <jkim@FreeBSD.org>
Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
bsd-user/bsd-file.h | 50 +++++++++++++++++++++++++++++++++++
bsd-user/freebsd/os-syscall.c | 16 +++++++++++
bsd-user/syscall_defs.h | 4 +++
3 files changed, 70 insertions(+)
diff --git a/bsd-user/bsd-file.h b/bsd-user/bsd-file.h
index e9e2c85eb67..fb54905b46f 100644
--- a/bsd-user/bsd-file.h
+++ b/bsd-user/bsd-file.h
@@ -22,11 +22,25 @@
#include "qemu/path.h"
+#define LOCK_PATH(p, arg) \
+do { \
+ (p) = lock_user_string(arg); \
+ if ((p) == NULL) { \
+ return -TARGET_EFAULT; \
+ } \
+} while (0)
+
+#define UNLOCK_PATH(p, arg) unlock_user(p, arg, 0)
+
+
extern struct iovec *lock_iovec(int type, abi_ulong target_addr, int count,
int copy);
extern void unlock_iovec(struct iovec *vec, abi_ulong target_addr, int count,
int copy);
+int safe_open(const char *path, int flags, mode_t mode);
+int safe_openat(int fd, const char *path, int flags, mode_t mode);
+
ssize_t safe_read(int fd, void *buf, size_t nbytes);
ssize_t safe_pread(int fd, void *buf, size_t nbytes, off_t offset);
ssize_t safe_readv(int fd, const struct iovec *iov, int iovcnt);
@@ -190,4 +204,40 @@ static abi_long do_bsd_pwritev(void *cpu_env, abi_long
arg1,
return ret;
}
+/* open(2) */
+static abi_long do_bsd_open(abi_long arg1, abi_long arg2, abi_long arg3)
+{
+ abi_long ret;
+ void *p;
+
+ LOCK_PATH(p, arg1);
+ ret = get_errno(safe_open(path(p), target_to_host_bitmask(arg2,
+ fcntl_flags_tbl), arg3));
+ UNLOCK_PATH(p, arg1);
+
+ return ret;
+}
+
+/* openat(2) */
+static abi_long do_bsd_openat(abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4)
+{
+ abi_long ret;
+ void *p;
+
+ LOCK_PATH(p, arg2);
+ ret = get_errno(safe_openat(arg1, path(p),
+ target_to_host_bitmask(arg3, fcntl_flags_tbl), arg4));
+ UNLOCK_PATH(p, arg2);
+
+ return ret;
+}
+
+/* close(2) */
+static inline abi_long do_bsd_close(abi_long arg1)
+{
+
+ return get_errno(close(arg1));
+}
+
#endif /* BSD_FILE_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 71aa0d38e03..a824785fee8 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -44,6 +44,10 @@
#include "bsd-proc.h"
/* I/O */
+safe_syscall3(int, open, const char *, path, int, flags, mode_t, mode);
+safe_syscall4(int, openat, int, fd, const char *, path, int, flags, mode_t,
+ mode);
+
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);
@@ -257,6 +261,18 @@ static abi_long freebsd_syscall(void *cpu_env, int num,
abi_long arg1,
ret = do_bsd_pwritev(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
break;
+ case TARGET_FREEBSD_NR_open: /* open(2) */
+ ret = do_bsd_open(arg1, arg2, arg3);
+ break;
+
+ case TARGET_FREEBSD_NR_openat: /* openat(2) */
+ ret = do_bsd_openat(arg1, arg2, arg3, arg4);
+ break;
+
+ case TARGET_FREEBSD_NR_close: /* close(2) */
+ ret = do_bsd_close(arg1);
+ break;
+
default:
qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num);
ret = -TARGET_ENOSYS;
diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h
index f5797b28e39..b6d113d24a7 100644
--- a/bsd-user/syscall_defs.h
+++ b/bsd-user/syscall_defs.h
@@ -226,4 +226,8 @@ type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4
arg4, \
return safe_syscall(SYS_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
}
+/* So far all target and host bitmasks are the same */
+#define target_to_host_bitmask(x, tbl) (x)
+#define host_to_target_bitmask(x, tbl) (x)
+
#endif /* SYSCALL_DEFS_H */
--
2.33.1
- [PATCH 00/11] bsd-user: Next round of syscalls, Warner Losh, 2022/06/12
- [PATCH 02/11] bsd-user: Implement fdatasync, fsync and close_from, Warner Losh, 2022/06/12
- [PATCH 01/11] bsd-user: Implement open, openat and close,
Warner Losh <=
- [PATCH 03/11] bsd-user: Implement revoke, access, eaccess and faccessat, Warner Losh, 2022/06/12
- [PATCH 04/11] bsd-user: Implement chdir and fchdir, Warner Losh, 2022/06/12
- [PATCH 05/11] bsd-user: Implement rename and renameat, Warner Losh, 2022/06/12
- [PATCH 06/11] bsd-user: Implement link, linkat, unlink and unlinkat, Warner Losh, 2022/06/12