Message ID | 20211227150127.2659293-3-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | linux-user: prctl improvements | expand |
Le 27/12/2021 à 16:01, Richard Henderson a écrit : > Create a list of subcodes that we want to pass on, a list of > subcodes that should not be passed on because they would affect > the running qemu itself, and a list that probably could be > implemented but require extra work. Do not pass on unknown subcodes. > > Reviewed-by: Laurent Vivier <laurent@vivier.eu> > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > v2: Log unknown prctl options. > --- > linux-user/syscall.c | 58 +++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 55 insertions(+), 3 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 0f0f67d567..d868ef2910 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -6337,6 +6337,13 @@ abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr) > # define PR_MTE_TAG_SHIFT 3 > # define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT) > #endif > +#ifndef PR_SET_IO_FLUSHER > +# define PR_SET_IO_FLUSHER 57 > +# define PR_GET_IO_FLUSHER 58 > +#endif > +#ifndef PR_SET_SYSCALL_USER_DISPATCH > +# define PR_SET_SYSCALL_USER_DISPATCH 59 > +#endif > > #include "target_prctl.h" > > @@ -6433,13 +6440,58 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2, > return -TARGET_EINVAL; > } > return do_prctl_get_tagged_addr_ctrl(env); > + > + case PR_GET_DUMPABLE: > + case PR_SET_DUMPABLE: > + case PR_GET_KEEPCAPS: > + case PR_SET_KEEPCAPS: > + case PR_GET_TIMING: > + case PR_SET_TIMING: > + case PR_GET_TIMERSLACK: > + case PR_SET_TIMERSLACK: > + case PR_MCE_KILL: > + case PR_MCE_KILL_GET: > + case PR_GET_NO_NEW_PRIVS: > + case PR_SET_NO_NEW_PRIVS: > + case PR_GET_IO_FLUSHER: > + case PR_SET_IO_FLUSHER: > + /* Some prctl options have no pointer arguments and we can pass on. */ > + return get_errno(prctl(option, arg2, arg3, arg4, arg5)); > + > + case PR_GET_CHILD_SUBREAPER: > + case PR_SET_CHILD_SUBREAPER: > + case PR_GET_SPECULATION_CTRL: > + case PR_SET_SPECULATION_CTRL: > + case PR_GET_TID_ADDRESS: > + /* TODO */ > + return -TARGET_EINVAL; > + > + case PR_GET_FPEXC: > + case PR_SET_FPEXC: > + /* Was used for SPE on PowerPC. */ > + return -TARGET_EINVAL; > + > + case PR_GET_ENDIAN: > + case PR_SET_ENDIAN: > + case PR_GET_FPEMU: > + case PR_SET_FPEMU: > + case PR_SET_MM: > case PR_GET_SECCOMP: > case PR_SET_SECCOMP: > - /* Disable seccomp to prevent the target disabling syscalls we need. */ > + case PR_SET_SYSCALL_USER_DISPATCH: > + case PR_GET_THP_DISABLE: > + case PR_SET_THP_DISABLE: > + case PR_GET_TSC: > + case PR_SET_TSC: > + case PR_GET_UNALIGN: > + case PR_SET_UNALIGN: > + /* Disable to prevent the target disabling stuff we need. */ > return -TARGET_EINVAL; > + > default: > - /* Most prctl options have no pointer arguments */ > - return get_errno(prctl(option, arg2, arg3, arg4, arg5)); > + qemu_log_mask(LOG_UNIMP, "Unsupported prctl: " TARGET_ABI_FMT_ld "\n", > + option); > + return -TARGET_EINVAL; > } > } > Applied to my linux-user-for-7.0 branch. Thanks, Laurent
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 0f0f67d567..d868ef2910 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6337,6 +6337,13 @@ abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr) # define PR_MTE_TAG_SHIFT 3 # define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT) #endif +#ifndef PR_SET_IO_FLUSHER +# define PR_SET_IO_FLUSHER 57 +# define PR_GET_IO_FLUSHER 58 +#endif +#ifndef PR_SET_SYSCALL_USER_DISPATCH +# define PR_SET_SYSCALL_USER_DISPATCH 59 +#endif #include "target_prctl.h" @@ -6433,13 +6440,58 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2, return -TARGET_EINVAL; } return do_prctl_get_tagged_addr_ctrl(env); + + case PR_GET_DUMPABLE: + case PR_SET_DUMPABLE: + case PR_GET_KEEPCAPS: + case PR_SET_KEEPCAPS: + case PR_GET_TIMING: + case PR_SET_TIMING: + case PR_GET_TIMERSLACK: + case PR_SET_TIMERSLACK: + case PR_MCE_KILL: + case PR_MCE_KILL_GET: + case PR_GET_NO_NEW_PRIVS: + case PR_SET_NO_NEW_PRIVS: + case PR_GET_IO_FLUSHER: + case PR_SET_IO_FLUSHER: + /* Some prctl options have no pointer arguments and we can pass on. */ + return get_errno(prctl(option, arg2, arg3, arg4, arg5)); + + case PR_GET_CHILD_SUBREAPER: + case PR_SET_CHILD_SUBREAPER: + case PR_GET_SPECULATION_CTRL: + case PR_SET_SPECULATION_CTRL: + case PR_GET_TID_ADDRESS: + /* TODO */ + return -TARGET_EINVAL; + + case PR_GET_FPEXC: + case PR_SET_FPEXC: + /* Was used for SPE on PowerPC. */ + return -TARGET_EINVAL; + + case PR_GET_ENDIAN: + case PR_SET_ENDIAN: + case PR_GET_FPEMU: + case PR_SET_FPEMU: + case PR_SET_MM: case PR_GET_SECCOMP: case PR_SET_SECCOMP: - /* Disable seccomp to prevent the target disabling syscalls we need. */ + case PR_SET_SYSCALL_USER_DISPATCH: + case PR_GET_THP_DISABLE: + case PR_SET_THP_DISABLE: + case PR_GET_TSC: + case PR_SET_TSC: + case PR_GET_UNALIGN: + case PR_SET_UNALIGN: + /* Disable to prevent the target disabling stuff we need. */ return -TARGET_EINVAL; + default: - /* Most prctl options have no pointer arguments */ - return get_errno(prctl(option, arg2, arg3, arg4, arg5)); + qemu_log_mask(LOG_UNIMP, "Unsupported prctl: " TARGET_ABI_FMT_ld "\n", + option); + return -TARGET_EINVAL; } }