Message ID | 1564597178-24649-13-git-send-email-aleksandar.markovic@rt-rk.com |
---|---|
State | New |
Headers | show |
Series | linux-user: Misc patches for 4.2 | expand |
> From: Aleksandar Rikalo <arikalo@wavecomp.com> > > Add support for semtimedop() emulation. It is based on invocation > of safe_semtimedop(). Hi, Laurent, Aleksandar R. is considering submitting this part too: diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b5bc6e4..0e56b8d 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4194,6 +4194,17 @@ static abi_long do_ipc(CPUArchState *cpu_env, case IPCOP_shmctl: ret = do_shmctl(first, second, ptr); break; +#ifdef __NR_ipc + case IPCOP_semtimedop: { + struct sembuf sops[nsops]; + if (target_to_host_sembuf(first, ptr, second)) { + ret = -TARGET_EFAULT; + } else { + ret = get_errno(safe_ipc(IPCOP_semtimedop, first, second, 0, sops, 0)); + } + break; + } +#endif default: gemu_log("Unsupported ipc call: %d (version %d)\n", call, version); ret = -TARGET_ENOSYS; Does this look fine to you? Sincerely, Aleksandar
Le 31/07/2019 à 20:22, Aleksandar Markovic a écrit : >> From: Aleksandar Rikalo <arikalo@wavecomp.com> >> >> Add support for semtimedop() emulation. It is based on invocation >> of safe_semtimedop(). > > Hi, Laurent, > > Aleksandar R. is considering submitting this part too: > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index b5bc6e4..0e56b8d 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -4194,6 +4194,17 @@ static abi_long do_ipc(CPUArchState *cpu_env, > case IPCOP_shmctl: > ret = do_shmctl(first, second, ptr); > break; > +#ifdef __NR_ipc > + case IPCOP_semtimedop: { > + struct sembuf sops[nsops]; > + if (target_to_host_sembuf(first, ptr, second)) { > + ret = -TARGET_EFAULT; > + } else { > + ret = get_errno(safe_ipc(IPCOP_semtimedop, first, second, 0, sops, 0)); > + } > + break; > + } > +#endif You should do something like that: case IPCOP_semtimedop ret = do_semtimedop( ... ); break; Thanks, Laurent
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index ee80175..6825458 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -6650,7 +6650,43 @@ static inline abi_long host_to_target_statx(struct target_statx *host_stx, return 0; } #endif +#ifdef TARGET_NR_semtimedop +static inline abi_long do_semtimedop(int semid, abi_long ptr, unsigned nsops, + abi_long timeout) +{ + struct sembuf *sops; + struct timespec ts, *pts; + abi_long ret; + + if (timeout) { + pts = &ts; + if (target_to_host_timespec(pts, timeout)) { + return -TARGET_EFAULT; + } + } else { + pts = NULL; + } + sops = g_malloc(sizeof(struct sembuf) * nsops); + if (sops == NULL) { + return -TARGET_EFAULT; + } + + if (target_to_host_sembuf(sops, ptr, nsops)) { + g_free(sops); + return -TARGET_EFAULT; + } + +#ifdef __NR_semtimedop + ret = get_errno(safe_semtimedop(semid, sops, nsops, pts)); +#else + ret = -TARGET_ENOSYS; +#endif + g_free(sops); + + return ret; +} +#endif /* ??? Using host futex calls even when target atomic operations are not really atomic probably breaks things. However implementing @@ -9194,6 +9230,10 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, case TARGET_NR_semop: return do_semop(arg1, arg2, arg3); #endif +#ifdef TARGET_NR_semtimedop + case TARGET_NR_semtimedop: + return do_semtimedop(arg1, arg2, arg3, arg4); +#endif #ifdef TARGET_NR_semctl case TARGET_NR_semctl: return do_semctl(arg1, arg2, arg3, arg4);