linux-user: fix TARGET_NR_select
TARGET_NR_select can have three different implementations: 1- to always return -ENOSYS microblaze, ppc, ppc64 -> TARGET_WANT_NI_OLD_SELECT 2- to take parameters from a structure pointed by arg1 (kernel sys_old_select) i386, arm, m68k -> TARGET_WANT_OLD_SYS_SELECT 3- to take parameters from arg[1-5] (kernel sys_select) x86_64, alpha, s390x, cris, sparc, sparc64 Some (new) architectures don't define NR_select, 4- but only NR__newselect with sys_select: mips, mips64, sh 5- don't define NR__newselect, and use pselect6 syscall: aarch64, openrisc, tilegx, unicore32 Reported-by: Timothy Pearson <tpearson@raptorengineering.com> Reported-by: Allan Wirth <awirth@akamai.com> Suggested-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
45eafb4d32
commit
5457dc9e37
@ -32,6 +32,7 @@ struct target_pt_regs {
|
||||
#define TARGET_MINSIGSTKSZ 2048
|
||||
#define TARGET_MLOCKALL_MCL_CURRENT 1
|
||||
#define TARGET_MLOCKALL_MCL_FUTURE 2
|
||||
#define TARGET_WANT_OLD_SYS_SELECT
|
||||
|
||||
#define TARGET_FORCE_SHMLBA
|
||||
|
||||
|
@ -153,5 +153,6 @@ struct target_vm86plus_struct {
|
||||
#define TARGET_MINSIGSTKSZ 2048
|
||||
#define TARGET_MLOCKALL_MCL_CURRENT 1
|
||||
#define TARGET_MLOCKALL_MCL_FUTURE 2
|
||||
#define TARGET_WANT_OLD_SYS_SELECT
|
||||
|
||||
#endif /* I386_TARGET_SYSCALL_H */
|
||||
|
@ -24,6 +24,8 @@ struct target_pt_regs {
|
||||
#define TARGET_MLOCKALL_MCL_CURRENT 1
|
||||
#define TARGET_MLOCKALL_MCL_FUTURE 2
|
||||
|
||||
#define TARGET_WANT_OLD_SYS_SELECT
|
||||
|
||||
void do_m68k_simcall(CPUM68KState *, int);
|
||||
|
||||
#endif /* M68K_TARGET_SYSCALL_H */
|
||||
|
@ -53,4 +53,6 @@ struct target_pt_regs {
|
||||
#define TARGET_MLOCKALL_MCL_CURRENT 1
|
||||
#define TARGET_MLOCKALL_MCL_FUTURE 2
|
||||
|
||||
#define TARGET_WANT_NI_OLD_SELECT
|
||||
|
||||
#endif
|
||||
|
@ -459,8 +459,6 @@
|
||||
#define TARGET_NR_getdents 1065
|
||||
#define __ARCH_WANT_SYS_GETDENTS
|
||||
#define TARGET_NR_futimesat 1066
|
||||
#define TARGET_NR_select 1067
|
||||
#define __ARCH_WANT_SYS_SELECT
|
||||
#define TARGET_NR_poll 1068
|
||||
#define TARGET_NR_epoll_wait 1069
|
||||
#define TARGET_NR_ustat 1070
|
||||
|
@ -74,5 +74,6 @@ struct target_revectored_struct {
|
||||
#define TARGET_MINSIGSTKSZ 2048
|
||||
#define TARGET_MLOCKALL_MCL_CURRENT 0x2000
|
||||
#define TARGET_MLOCKALL_MCL_FUTURE 0x4000
|
||||
#define TARGET_WANT_NI_OLD_SELECT
|
||||
|
||||
#endif /* PPC_TARGET_SYSCALL_H */
|
||||
|
@ -84,7 +84,7 @@
|
||||
#define TARGET_NR_settimeofday 79
|
||||
#define TARGET_NR_getgroups 80
|
||||
#define TARGET_NR_setgroups 81
|
||||
#define TARGET_NR_select 82
|
||||
/* 82 was sys_oldselect */
|
||||
#define TARGET_NR_symlink 83
|
||||
#define TARGET_NR_oldlstat 84
|
||||
#define TARGET_NR_readlink 85
|
||||
|
@ -1444,6 +1444,29 @@ static abi_long do_select(int n,
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(TARGET_WANT_OLD_SYS_SELECT)
|
||||
static abi_long do_old_select(abi_ulong arg1)
|
||||
{
|
||||
struct target_sel_arg_struct *sel;
|
||||
abi_ulong inp, outp, exp, tvp;
|
||||
long nsel;
|
||||
|
||||
if (!lock_user_struct(VERIFY_READ, sel, arg1, 1)) {
|
||||
return -TARGET_EFAULT;
|
||||
}
|
||||
|
||||
nsel = tswapal(sel->n);
|
||||
inp = tswapal(sel->inp);
|
||||
outp = tswapal(sel->outp);
|
||||
exp = tswapal(sel->exp);
|
||||
tvp = tswapal(sel->tvp);
|
||||
|
||||
unlock_user_struct(sel, arg1, 0);
|
||||
|
||||
return do_select(nsel, inp, outp, exp, tvp);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static abi_long do_pipe2(int host_pipe[], int flags)
|
||||
@ -8668,24 +8691,15 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
break;
|
||||
#if defined(TARGET_NR_select)
|
||||
case TARGET_NR_select:
|
||||
#if defined(TARGET_S390X) || defined(TARGET_ALPHA)
|
||||
ret = do_select(arg1, arg2, arg3, arg4, arg5);
|
||||
#if defined(TARGET_WANT_NI_OLD_SELECT)
|
||||
/* some architectures used to have old_select here
|
||||
* but now ENOSYS it.
|
||||
*/
|
||||
ret = -TARGET_ENOSYS;
|
||||
#elif defined(TARGET_WANT_OLD_SYS_SELECT)
|
||||
ret = do_old_select(arg1);
|
||||
#else
|
||||
{
|
||||
struct target_sel_arg_struct *sel;
|
||||
abi_ulong inp, outp, exp, tvp;
|
||||
long nsel;
|
||||
|
||||
if (!lock_user_struct(VERIFY_READ, sel, arg1, 1))
|
||||
goto efault;
|
||||
nsel = tswapal(sel->n);
|
||||
inp = tswapal(sel->inp);
|
||||
outp = tswapal(sel->outp);
|
||||
exp = tswapal(sel->exp);
|
||||
tvp = tswapal(sel->tvp);
|
||||
unlock_user_struct(sel, arg1, 0);
|
||||
ret = do_select(nsel, inp, outp, exp, tvp);
|
||||
}
|
||||
ret = do_select(arg1, arg2, arg3, arg4, arg5);
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
|
@ -311,7 +311,6 @@
|
||||
#define TARGET_NR_creat 1064
|
||||
#define TARGET_NR_getdents 1065
|
||||
#define TARGET_NR_futimesat 1066
|
||||
#define TARGET_NR_select 1067
|
||||
#define TARGET_NR_poll 1068
|
||||
#define TARGET_NR_epoll_wait 1069
|
||||
#define TARGET_NR_ustat 1070
|
||||
|
Loading…
Reference in New Issue
Block a user