// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library zx;

// TODO(scottmg): These syscalls don't match the general naming convention of
// zx_something_name(), they're just zx_name(), so NoProtocolPrefix tells the
// generator to exclude putting "Misc" in the name.
[Transport = "Syscall",
NoProtocolPrefix]
protocol misc {
    /// High resolution sleep.
    /// Rights: None.
    [blocking]
    nanosleep(time deadline) -> (status status);

    /// Read the number of high-precision timer ticks since boot.
    [vdsocall]
    ticks_get() -> (ticks ticks);

    /// Read the number of high-precision timer ticks in a second.
    [const,
    vdsocall]
    ticks_per_second() -> (ticks ticks);

    /// Convert a time relative to now to an absolute deadline.
    [vdsocall]
    deadline_after(duration nanoseconds) -> (time time);

    /// Unmap memory, close handle, exit.
    [vdsocall]
    vmar_unmap_handle_close_thread_exit(handle:VMAR vmar_handle,
                                        vaddr addr, usize size,
                                        [Release] handle close_handle)
        -> (status status);

    /// Write to futex, wake futex, close handle, exit.
    [noreturn,
    vdsocall]
    futex_wake_handle_close_thread_exit(const_futexptr value_ptr,
                                        uint32 wake_count,
                                        int32 new_value,
                                        [Release] handle close_handle);

    // Read the number of high-precision timer ticks since boot, but demand
    // that the read be performed using a syscall, instead of a vdso call.
    //
    // Note that this is an internal syscall, not meant to be used by
    // application code.  By default, the vdso version of this syscall will do
    // the proper thing, either directly reading from the hardware register
    // backing the tick counter, or by making a syscall if the register is not
    // accessible from user mode code (for whatever reason).
    [internal]
    ticks_get_via_kernel() -> (ticks ticks);
};
