/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include namespace Kernel { KResultOr Process::sys$map_time_page() { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); REQUIRE_PROMISE(stdio); auto& vmobject = TimeManagement::the().time_page_vmobject(); auto range = address_space().page_directory().range_allocator().allocate_randomized(PAGE_SIZE, PAGE_SIZE); if (!range.has_value()) return ENOMEM; auto region_or_error = address_space().allocate_region_with_vmobject(range.value(), vmobject, 0, "Kernel time page"sv, PROT_READ, true); if (region_or_error.is_error()) return region_or_error.error(); return region_or_error.value()->vaddr().get(); } KResultOr Process::sys$clock_gettime(clockid_t clock_id, Userspace user_ts) { VERIFY_NO_PROCESS_BIG_LOCK(this); REQUIRE_PROMISE(stdio); if (!TimeManagement::is_valid_clock_id(clock_id)) return EINVAL; auto ts = TimeManagement::the().current_time(clock_id).to_timespec(); if (!copy_to_user(user_ts, &ts)) return EFAULT; return 0; } KResultOr Process::sys$clock_settime(clockid_t clock_id, Userspace user_ts) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); REQUIRE_PROMISE(settime); if (!is_superuser()) return EPERM; auto ts = copy_time_from_user(user_ts); if (!ts.has_value()) return EFAULT; switch (clock_id) { case CLOCK_REALTIME: TimeManagement::the().set_epoch_time(ts.value()); break; default: return EINVAL; } return 0; } KResultOr Process::sys$clock_nanosleep(Userspace user_params) { VERIFY_NO_PROCESS_BIG_LOCK(this); REQUIRE_PROMISE(stdio); Syscall::SC_clock_nanosleep_params params; if (!copy_from_user(¶ms, user_params)) return EFAULT; Optional