user: Extract common MMAP API to 'user/mmap.h'

Keep common MMAP-related declarations in a single place.

Note, this disable ThreadSafetyAnalysis on Linux for:
- mmap_fork_start()
- mmap_fork_end().

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20250308122842.76377-4-philmd@linaro.org>
This commit is contained in:
Philippe Mathieu-Daudé 2025-01-16 17:33:13 +01:00
parent 84d66261be
commit 1405d7e60d
3 changed files with 35 additions and 28 deletions

View file

@ -32,6 +32,7 @@
extern char **environ; extern char **environ;
#include "user/thunk.h" #include "user/thunk.h"
#include "user/mmap.h"
#include "target_arch.h" #include "target_arch.h"
#include "syscall_defs.h" #include "syscall_defs.h"
#include "target_syscall.h" #include "target_syscall.h"
@ -233,19 +234,8 @@ void print_taken_signal(int target_signum, const target_siginfo_t *tinfo);
extern int do_strace; extern int do_strace;
/* mmap.c */ /* mmap.c */
int target_mprotect(abi_ulong start, abi_ulong len, int prot);
abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
int flags, int fd, off_t offset);
int target_munmap(abi_ulong start, abi_ulong len);
abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
abi_ulong new_size, unsigned long flags,
abi_ulong new_addr);
int target_msync(abi_ulong start, abi_ulong len, int flags); 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, abi_ulong alignment);
void mmap_reserve(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);
/* main.c */ /* main.c */
extern char qemu_proc_pathname[]; extern char qemu_proc_pathname[];

32
include/user/mmap.h Normal file
View file

@ -0,0 +1,32 @@
/*
* MMAP declarations for QEMU user emulation
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef USER_MMAP_H
#define USER_MMAP_H
#include "user/abitypes.h"
/*
* mmap_next_start: The base address for the next mmap without hint,
* increased after each successful map, starting at task_unmapped_base.
* This is an optimization within QEMU and not part of ADDR_COMPAT_LAYOUT.
*/
extern abi_ulong mmap_next_start;
int target_mprotect(abi_ulong start, abi_ulong len, int prot);
abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
int flags, int fd, off_t offset);
int target_munmap(abi_ulong start, abi_ulong len);
abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
abi_ulong new_size, unsigned long flags,
abi_ulong new_addr);
abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size, abi_ulong alignment);
void TSA_NO_TSA mmap_fork_start(void);
void TSA_NO_TSA mmap_fork_end(int child);
#endif

View file

@ -18,6 +18,8 @@
#ifndef LINUX_USER_USER_MMAP_H #ifndef LINUX_USER_USER_MMAP_H
#define LINUX_USER_USER_MMAP_H #define LINUX_USER_USER_MMAP_H
#include "user/mmap.h"
/* /*
* Guest parameters for the ADDR_COMPAT_LAYOUT personality * Guest parameters for the ADDR_COMPAT_LAYOUT personality
* (at present this is the only layout supported by QEMU). * (at present this is the only layout supported by QEMU).
@ -39,24 +41,7 @@
extern abi_ulong task_unmapped_base; extern abi_ulong task_unmapped_base;
extern abi_ulong elf_et_dyn_base; extern abi_ulong elf_et_dyn_base;
/*
* mmap_next_start: The base address for the next mmap without hint,
* increased after each successful map, starting at task_unmapped_base.
* This is an optimization within QEMU and not part of ADDR_COMPAT_LAYOUT.
*/
extern abi_ulong mmap_next_start;
int target_mprotect(abi_ulong start, abi_ulong len, int prot);
abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
int flags, int fd, off_t offset);
int target_munmap(abi_ulong start, abi_ulong len);
abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
abi_ulong new_size, unsigned long flags,
abi_ulong new_addr);
abi_long target_madvise(abi_ulong start, abi_ulong len_in, int advice); abi_long target_madvise(abi_ulong start, abi_ulong len_in, int advice);
abi_ulong mmap_find_vma(abi_ulong, abi_ulong, abi_ulong);
void mmap_fork_start(void);
void mmap_fork_end(int child);
abi_ulong target_shmat(CPUArchState *cpu_env, int shmid, abi_ulong target_shmat(CPUArchState *cpu_env, int shmid,
abi_ulong shmaddr, int shmflg); abi_ulong shmaddr, int shmflg);