// 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")
@no_protocol_prefix
protocol misc {
    /// High resolution sleep.
    /// Rights: None.
    @blocking
    nanosleep(struct {
        deadline time;
    }) -> (struct {
        status status;
    });

    /// Read the number of high-precision timer ticks since boot.
    @vdsocall
    ticks_get() -> (struct {
        ticks ticks;
    });

    /// Read the number of high-precision timer ticks in a second.
    @const
    @vdsocall
    ticks_per_second() -> (struct {
        ticks ticks;
    });

    /// Convert a time relative to now to an absolute deadline.
    @vdsocall
    deadline_after(struct {
        nanoseconds duration;
    }) -> (struct {
        time time;
    });

    /// Unmap memory, close handle, exit.
    @vdsocall
    vmar_unmap_handle_close_thread_exit(resource struct {
        vmar_handle handle:VMAR;
        addr vaddr;
        size usize;
        @release
        close_handle handle;
    }) -> (struct {
        status status;
    });

    /// Write to futex, wake futex, close handle, exit.
    @noreturn
    @vdsocall
    futex_wake_handle_close_thread_exit(resource struct {
        value_ptr const_futexptr;
        wake_count uint32;
        new_value int32;
        @release
        close_handle 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() -> (struct {
        ticks ticks;
    });
};
