From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: "Thomas Huth" <thuth@redhat.com>,
"Laurent Vivier" <laurent@vivier.eu>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
"Beraldo Leal" <bleal@redhat.com>, "Warner Losh" <imp@bsdimp.com>,
"Kyle Evans" <kevans@freebsd.org>,
"Stacey Son" <sson@FreeBSD.org>,
"Karim Taha" <kariem.taha2.7@gmail.com>
Subject: [PULL 50/51] bsd-user: Implement shmat(2) and shmdt(2)
Date: Tue, 3 Oct 2023 17:32:14 -0600 [thread overview]
Message-ID: <20231003233215.95557-51-imp@bsdimp.com> (raw)
In-Reply-To: <20231003233215.95557-1-imp@bsdimp.com>
From: Stacey Son <sson@FreeBSD.org>
Use `WITH_MMAP_LOCK_GUARD` instead of mmap_lock() and mmap_unlock(),
to match linux-user implementation, according to the following commits:
69fa2708a216df715ba5102a0f98468b540a464e linux-user: Use WITH_MMAP_LOCK_GUARD in target_{shmat,shmdt}
ceda5688b650646248f269a992c06b11148c5759 linux-user: Fix shmdt
Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
Message-Id: <20230925182709.4834-23-kariem.taha2.7@gmail.com>
---
bsd-user/bsd-mem.h | 87 +++++++++++++++++++++++++++++++++++
bsd-user/freebsd/os-syscall.c | 8 ++++
bsd-user/mmap.c | 2 +-
bsd-user/qemu.h | 1 +
4 files changed, 97 insertions(+), 1 deletion(-)
diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index b82f3eaa253..c512a4e3756 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -344,4 +344,91 @@ static inline abi_long do_bsd_shmctl(abi_long shmid, abi_long cmd,
return ret;
}
+/* shmat(2) */
+static inline abi_long do_bsd_shmat(int shmid, abi_ulong shmaddr, int shmflg)
+{
+ abi_ulong raddr;
+ abi_long ret;
+ struct shmid_ds shm_info;
+
+ /* Find out the length of the shared memory segment. */
+ ret = get_errno(shmctl(shmid, IPC_STAT, &shm_info));
+ if (is_error(ret)) {
+ /* Can't get the length */
+ return ret;
+ }
+
+ if (!guest_range_valid_untagged(shmaddr, shm_info.shm_segsz)) {
+ return -TARGET_EINVAL;
+ }
+
+ WITH_MMAP_LOCK_GUARD() {
+ void *host_raddr;
+
+ if (shmaddr) {
+ host_raddr = shmat(shmid, (void *)g2h_untagged(shmaddr), shmflg);
+ } else {
+ abi_ulong mmap_start;
+
+ mmap_start = mmap_find_vma(0, shm_info.shm_segsz);
+
+ if (mmap_start == -1) {
+ return -TARGET_ENOMEM;
+ }
+ host_raddr = shmat(shmid, g2h_untagged(mmap_start),
+ shmflg | SHM_REMAP);
+ }
+
+ if (host_raddr == (void *)-1) {
+ return get_errno(-1);
+ }
+ raddr = h2g(host_raddr);
+
+ page_set_flags(raddr, raddr + shm_info.shm_segsz - 1,
+ PAGE_VALID | PAGE_RESET | PAGE_READ |
+ (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE));
+
+ for (int i = 0; i < N_BSD_SHM_REGIONS; i++) {
+ if (bsd_shm_regions[i].start == 0) {
+ bsd_shm_regions[i].start = raddr;
+ bsd_shm_regions[i].size = shm_info.shm_segsz;
+ break;
+ }
+ }
+ }
+
+ return raddr;
+}
+
+/* shmdt(2) */
+static inline abi_long do_bsd_shmdt(abi_ulong shmaddr)
+{
+ abi_long ret;
+
+ WITH_MMAP_LOCK_GUARD() {
+ int i;
+
+ for (i = 0; i < N_BSD_SHM_REGIONS; ++i) {
+ if (bsd_shm_regions[i].start == shmaddr) {
+ break;
+ }
+ }
+
+ if (i == N_BSD_SHM_REGIONS) {
+ return -TARGET_EINVAL;
+ }
+
+ ret = get_errno(shmdt(g2h_untagged(shmaddr)));
+ if (ret == 0) {
+ abi_ulong size = bsd_shm_regions[i].size;
+
+ bsd_shm_regions[i].start = 0;
+ page_set_flags(shmaddr, shmaddr + size - 1, 0);
+ mmap_reserve(shmaddr, size);
+ }
+ }
+
+ return ret;
+}
+
#endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 0512d41db7c..39e66312da1 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -871,6 +871,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
ret = do_bsd_shmctl(arg1, arg2, arg3);
break;
+ case TARGET_FREEBSD_NR_shmat: /* shmat(2) */
+ ret = do_bsd_shmat(arg1, arg2, arg3);
+ break;
+
+ case TARGET_FREEBSD_NR_shmdt: /* shmdt(2) */
+ ret = do_bsd_shmdt(arg1);
+ break;
+
/*
* Misc
*/
diff --git a/bsd-user/mmap.c b/bsd-user/mmap.c
index 8e148a2ea3e..3ef11b28079 100644
--- a/bsd-user/mmap.c
+++ b/bsd-user/mmap.c
@@ -636,7 +636,7 @@ fail:
return -1;
}
-static void mmap_reserve(abi_ulong start, abi_ulong size)
+void mmap_reserve(abi_ulong start, abi_ulong size)
{
abi_ulong real_start;
abi_ulong real_end;
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index 6047805ae38..dc842fffa7d 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -233,6 +233,7 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
int target_msync(abi_ulong start, abi_ulong len, int flags);
extern abi_ulong mmap_next_start;
abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size);
+void mmap_reserve(abi_ulong start, abi_ulong size);
void TSA_NO_TSA mmap_fork_start(void);
void TSA_NO_TSA mmap_fork_end(int child);
--
2.41.0
next prev parent reply other threads:[~2023-10-03 23:43 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-03 23:31 [PULL 00/51] Bsd user mmap patches Warner Losh
2023-10-03 23:31 ` [PULL 01/51] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY Warner Losh
2023-10-03 23:31 ` [PULL 02/51] bsd-user: Define procctl(2) related structs Warner Losh
2023-10-03 23:31 ` [PULL 03/51] bsd-user: Implement host_to_target_siginfo Warner Losh
2023-10-03 23:31 ` [PULL 04/51] bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h Warner Losh
2023-10-03 23:31 ` [PULL 05/51] bsd-user: add extern declarations for bsd-proc.c conversion functions Warner Losh
2023-10-03 23:31 ` [PULL 06/51] bsd-user: Implement target_to_host_resource conversion function Warner Losh
2023-10-03 23:31 ` [PULL 07/51] bsd-user: Implement target_to_host_rlim and host_to_target_rlim conversion Warner Losh
2023-10-03 23:31 ` [PULL 08/51] bsd-user: Implement host_to_target_rusage and host_to_target_wrusage Warner Losh
2023-10-03 23:31 ` [PULL 09/51] bsd-user: Implement host_to_target_waitstatus conversion Warner Losh
2023-10-03 23:31 ` [PULL 10/51] bsd-user: Get number of cpus Warner Losh
2023-10-03 23:31 ` [PULL 11/51] bsd-user: Implement getgroups(2) and setgroups(2) system calls Warner Losh
2023-10-03 23:31 ` [PULL 12/51] bsd-user: Implement umask(2), setlogin(2) and getlogin(2) Warner Losh
2023-10-03 23:31 ` [PULL 13/51] bsd-user: Implement getrusage(2) Warner Losh
2023-10-03 23:31 ` [PULL 14/51] bsd-user: Implement getrlimit(2) and setrlimit(2) Warner Losh
2023-10-03 23:31 ` [PULL 15/51] bsd-user: Implement several get/set system calls: Warner Losh
2023-10-03 23:31 ` [PULL 16/51] bsd-user: Implement get/set[resuid/resgid/sid] and issetugid Warner Losh
2023-10-03 23:31 ` [PULL 17/51] bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2) Warner Losh
2023-10-03 23:31 ` [PULL 18/51] bsd-user: Implement getpriority(2) and setpriority(2) Warner Losh
2023-10-03 23:31 ` [PULL 19/51] bsd-user: Implement get_filename_from_fd Warner Losh
2023-10-03 23:31 ` [PULL 20/51] bsd-user: Implement freebsd_exec_common, used in implementing execve/fexecve Warner Losh
2023-10-03 23:31 ` [PULL 21/51] bsd-user: Implement procctl(2) along with necessary conversion functions Warner Losh
2023-10-03 23:31 ` [PULL 22/51] bsd-user: Implement execve(2) and fexecve(2) system calls Warner Losh
2023-10-03 23:31 ` [PULL 23/51] bsd-user: Implement wait4(2) and wait6(2) " Warner Losh
2023-10-03 23:31 ` [PULL 24/51] bsd-user: Implement setloginclass(2) and getloginclass(2) " Warner Losh
2023-10-03 23:31 ` [PULL 25/51] bsd-user: Implement pdgetpid(2) and the undocumented setugid Warner Losh
2023-10-03 23:31 ` [PULL 26/51] bsd-user: Implement fork(2) and vfork(2) system calls Warner Losh
2023-10-03 23:31 ` [PULL 27/51] bsd-user: Implement rfork(2) system call Warner Losh
2023-10-03 23:31 ` [PULL 28/51] bsd-user: Implement pdfork(2) " Warner Losh
2023-10-03 23:31 ` [PULL 29/51] bsd-user: Implement struct target_ipc_perm Warner Losh
2023-10-03 23:31 ` [PULL 30/51] bsd-user: Implement struct target_shmid_ds Warner Losh
2023-10-03 23:31 ` [PULL 31/51] bsd-user: Declarations for ipc_perm and shmid_ds conversion functions Warner Losh
2023-10-03 23:31 ` [PULL 32/51] bsd-user: Introduce freebsd/os-misc.h to the source tree Warner Losh
2023-10-03 23:31 ` [PULL 33/51] bsd-user: Implement shm_open2(2) system call Warner Losh
2023-10-03 23:31 ` [PULL 34/51] bsd-user: Implement shm_rename(2) " Warner Losh
2023-10-03 23:31 ` [PULL 35/51] bsd-user: Add bsd-mem.c to meson.build Warner Losh
2023-10-03 23:32 ` [PULL 36/51] bsd-user: Implement target_set_brk function in bsd-mem.c instead of os-syscall.c Warner Losh
2023-10-03 23:32 ` [PULL 37/51] bsd-user: Implement ipc_perm conversion between host and target Warner Losh
2023-10-03 23:32 ` [PULL 38/51] bsd-user: Implement shmid_ds " Warner Losh
2023-10-03 23:32 ` [PULL 39/51] bsd-user: Introduce bsd-mem.h to the source tree Warner Losh
2023-10-03 23:32 ` [PULL 40/51] bsd-user: Implement mmap(2) and munmap(2) Warner Losh
2023-10-03 23:32 ` [PULL 41/51] bsd-user: Implement mprotect(2) Warner Losh
2023-10-03 23:32 ` [PULL 42/51] bsd-user: Implement msync(2) Warner Losh
2023-10-03 23:32 ` [PULL 43/51] bsd-user: Implement mlock(2), munlock(2), mlockall(2), munlockall(2), minherit(2) Warner Losh
2023-10-03 23:32 ` [PULL 44/51] bsd-user: Implment madvise(2) to match the linux-user implementation Warner Losh
2023-10-03 23:32 ` [PULL 45/51] bsd-user: Implement mincore(2) Warner Losh
2023-10-03 23:32 ` [PULL 46/51] bsd-user: Implement do_obreak function Warner Losh
2023-10-03 23:32 ` [PULL 47/51] bsd-user: Implement shm_open(2) Warner Losh
2023-10-03 23:32 ` [PULL 48/51] bsd-user: Implement shm_unlink(2) and shmget(2) Warner Losh
2023-10-03 23:32 ` [PULL 49/51] bsd-user: Implement shmctl(2) Warner Losh
2023-10-03 23:32 ` Warner Losh [this message]
2023-10-03 23:32 ` [PULL 51/51] bsd-user: Add stubs for vadvise(), sbrk() and sstk() Warner Losh
2023-10-04 18:33 ` [PULL 00/51] Bsd user mmap patches Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231003233215.95557-51-imp@bsdimp.com \
--to=imp@bsdimp.com \
--cc=alex.bennee@linaro.org \
--cc=bleal@redhat.com \
--cc=kariem.taha2.7@gmail.com \
--cc=kevans@freebsd.org \
--cc=laurent@vivier.eu \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=sson@FreeBSD.org \
--cc=thuth@redhat.com \
--cc=wainersm@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.