Message ID | 20211220214135.189157-3-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux-user: prctl improvements | expand |
On 12/20/21 22:41, Richard Henderson wrote: > 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. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/syscall.c | 56 ++++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 52 insertions(+), 4 deletions(-) > + 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: > default: Unfortunately prctl values are not enumerated, so we can't remove the default case to catch new values at build time. Maybe a qemu_log_mask(LOG_UNIMP) call would help here? (only for default?) Regardless: Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > - /* Most prctl options have no pointer arguments */ > - return get_errno(prctl(option, arg2, arg3, arg4, arg5)); > + /* Disable to prevent the target disabling stuff we need. */ > + return -TARGET_EINVAL; > } > } >
Le 20/12/2021 à 23:41, Philippe Mathieu-Daudé a écrit : > On 12/20/21 22:41, Richard Henderson wrote: >> 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. >> >> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> >> --- >> linux-user/syscall.c | 56 ++++++++++++++++++++++++++++++++++++++++---- >> 1 file changed, 52 insertions(+), 4 deletions(-) > >> + 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: >> default: > > Unfortunately prctl values are not enumerated, so we can't remove > the default case to catch new values at build time. > > Maybe a qemu_log_mask(LOG_UNIMP) call would help here? (only Yes, I think a qemu_log_mask(LOG_UNIMP) for the default case would help. > for default?) > > Regardless: > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Laurent Vivier <laurent@vivier.eu> > >> - /* Most prctl options have no pointer arguments */ >> - return get_errno(prctl(option, arg2, arg3, arg4, arg5)); >> + /* Disable to prevent the target disabling stuff we need. */ >> + return -TARGET_EINVAL; >> } >> } >> >
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b93b8a4f5e..ef7a955dbb 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6336,6 +6336,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" @@ -6432,13 +6439,54 @@ 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. */ - return -TARGET_EINVAL; + 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: default: - /* Most prctl options have no pointer arguments */ - return get_errno(prctl(option, arg2, arg3, arg4, arg5)); + /* Disable to prevent the target disabling stuff we need. */ + return -TARGET_EINVAL; } }
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. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/syscall.c | 56 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-)