|
|
@@ -909,63 +909,23 @@ int sys_unlink(const char *pathname)
|
|
|
/* syscall: "nanosleep" ret: "int" args: "const struct timespec *" "struct timespec *" */
|
|
|
int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
|
|
|
{
|
|
|
- rt_tick_t tick;
|
|
|
-#ifdef RT_USING_USERSPACE
|
|
|
- struct timespec rqtp_k;
|
|
|
- struct timespec rmtp_k;
|
|
|
-
|
|
|
+ int ret = 0;
|
|
|
dbg_log(DBG_LOG, "sys_nanosleep\n");
|
|
|
-
|
|
|
if (!lwp_user_accessable((void *)rqtp, sizeof *rqtp))
|
|
|
- {
|
|
|
return -EFAULT;
|
|
|
- }
|
|
|
|
|
|
+#ifdef RT_USING_USERSPACE
|
|
|
+ struct timespec rqtp_k;
|
|
|
+ struct timespec rmtp_k;
|
|
|
+
|
|
|
lwp_get_from_user(&rqtp_k, (void *)rqtp, sizeof rqtp_k);
|
|
|
-
|
|
|
- tick = rqtp_k.tv_sec * RT_TICK_PER_SECOND + ((uint64_t)rqtp_k.tv_nsec * RT_TICK_PER_SECOND) / 1000000000;
|
|
|
- rt_thread_delay(tick);
|
|
|
-
|
|
|
- if (rmtp)
|
|
|
- {
|
|
|
- if (!lwp_user_accessable((void *)rmtp, sizeof *rmtp))
|
|
|
- {
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
-
|
|
|
- tick = rt_tick_get() - tick;
|
|
|
- /* get the passed time */
|
|
|
- rmtp_k.tv_sec = tick / RT_TICK_PER_SECOND;
|
|
|
- rmtp_k.tv_nsec = (tick % RT_TICK_PER_SECOND) * (1000000000 / RT_TICK_PER_SECOND);
|
|
|
-
|
|
|
+ ret = nanosleep(&rqtp_k, &rmtp_k);
|
|
|
+ if (ret != -1 && rmtp && lwp_user_accessable((void *)rmtp, sizeof *rmtp))
|
|
|
lwp_put_to_user(rmtp, (void *)&rmtp_k, sizeof rmtp_k);
|
|
|
- }
|
|
|
#else
|
|
|
- dbg_log(DBG_LOG, "sys_nanosleep\n");
|
|
|
-
|
|
|
- if (!lwp_user_accessable((void *)rqtp, sizeof *rqtp))
|
|
|
- {
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
-
|
|
|
- tick = rqtp->tv_sec * RT_TICK_PER_SECOND + ((uint64_t)rqtp->tv_nsec * RT_TICK_PER_SECOND) / 1000000000;
|
|
|
- rt_thread_delay(tick);
|
|
|
-
|
|
|
- if (rmtp)
|
|
|
- {
|
|
|
- if (!lwp_user_accessable((void *)rmtp, sizeof *rmtp))
|
|
|
- {
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
-
|
|
|
- tick = rt_tick_get() - tick;
|
|
|
- /* get the passed time */
|
|
|
- rmtp->tv_sec = tick / RT_TICK_PER_SECOND;
|
|
|
- rmtp->tv_nsec = (tick % RT_TICK_PER_SECOND) * (1000000000 / RT_TICK_PER_SECOND);
|
|
|
- }
|
|
|
+ ret = nanosleep(rqtp, rmtp);
|
|
|
#endif
|
|
|
-
|
|
|
- return 0;
|
|
|
+ return (ret < 0 ? GET_ERRNO() : ret);
|
|
|
}
|
|
|
|
|
|
/* syscall: "gettimeofday" ret: "int" args: "struct timeval *" "struct timezone *" */
|