/* * 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 = TRY(address_space().page_directory().range_allocator().try_allocate_randomized(PAGE_SIZE, PAGE_SIZE)); auto* region = TRY(address_space().allocate_region_with_vmobject(range, vmobject, 0, "Kernel time page"sv, PROT_READ, true)); return region->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(); return copy_to_user(user_ts, &ts); } 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); auto params = TRY(copy_typed_from_user(user_params)); Optional