1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 01:47:36 +00:00

Kernel: Remove SmapDisabler in clock_nanosleep()

This commit is contained in:
Andreas Kling 2020-01-11 11:51:03 +01:00
parent 0ca6d6c8d2
commit 2d7ae42f75

View file

@ -3814,45 +3814,45 @@ int Process::sys$clock_gettime(clockid_t clock_id, timespec* ts)
return 0; return 0;
} }
int Process::sys$clock_nanosleep(const Syscall::SC_clock_nanosleep_params* params) int Process::sys$clock_nanosleep(const Syscall::SC_clock_nanosleep_params* user_params)
{ {
if (!validate_read_typed(params)) if (!validate_read_typed(user_params))
return -EFAULT;
Syscall::SC_clock_nanosleep_params params;
copy_from_user(&params, user_params);
if (params.requested_sleep && !validate_read_typed(params.requested_sleep))
return -EFAULT; return -EFAULT;
stac(); timespec requested_sleep;
int clock_id = params->clock_id; copy_from_user(&requested_sleep, params.requested_sleep);
int flags = params->flags;
const timespec* requested_sleep = params->requested_sleep;
timespec* remaining_sleep = params->remaining_sleep;
clac();
if (requested_sleep && !validate_read_typed(requested_sleep)) if (params.remaining_sleep && !validate_write_typed(params.remaining_sleep))
return -EFAULT; return -EFAULT;
if (remaining_sleep && !validate_write_typed(remaining_sleep)) bool is_absolute = params.flags & TIMER_ABSTIME;
return -EFAULT;
bool is_absolute = flags & TIMER_ABSTIME; switch (params.clock_id) {
SmapDisabler disabler;
switch (clock_id) {
case CLOCK_MONOTONIC: { case CLOCK_MONOTONIC: {
u64 wakeup_time; u64 wakeup_time;
if (is_absolute) { if (is_absolute) {
u64 time_to_wake = (requested_sleep->tv_sec * 1000 + requested_sleep->tv_nsec / 1000000); u64 time_to_wake = (requested_sleep.tv_sec * 1000 + requested_sleep.tv_nsec / 1000000);
wakeup_time = current->sleep_until(time_to_wake); wakeup_time = current->sleep_until(time_to_wake);
} else { } else {
u32 ticks_to_sleep = (requested_sleep->tv_sec * 1000 + requested_sleep->tv_nsec / 1000000); u32 ticks_to_sleep = (requested_sleep.tv_sec * 1000 + requested_sleep.tv_nsec / 1000000);
if (!ticks_to_sleep) if (!ticks_to_sleep)
return 0; return 0;
wakeup_time = current->sleep(ticks_to_sleep); wakeup_time = current->sleep(ticks_to_sleep);
} }
if (wakeup_time > g_uptime) { if (wakeup_time > g_uptime) {
u32 ticks_left = wakeup_time - g_uptime; u32 ticks_left = wakeup_time - g_uptime;
if (!is_absolute && remaining_sleep) { if (!is_absolute && params.remaining_sleep) {
remaining_sleep->tv_sec = ticks_left / TICKS_PER_SECOND; timespec remaining_sleep;
ticks_left -= remaining_sleep->tv_sec * TICKS_PER_SECOND; memset(&remaining_sleep, 0, sizeof(timespec));
remaining_sleep->tv_nsec = ticks_left * 1000000; remaining_sleep.tv_sec = ticks_left / TICKS_PER_SECOND;
ticks_left -= remaining_sleep.tv_sec * TICKS_PER_SECOND;
remaining_sleep.tv_nsec = ticks_left * 1000000;
copy_to_user(params.remaining_sleep, &remaining_sleep);
} }
return -EINTR; return -EINTR;
} }