// 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;

@transport("Syscall")
closed protocol Mtrace {
    /// ## Summary
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Declaration
    ///
    /// ```c
    /// #include <zircon/syscalls.h>
    ///
    /// zx_status_t zx_mtrace_control(zx_handle_t handle,
    ///                               uint32_t kind,
    ///                               uint32_t action,
    ///                               uint32_t options,
    ///                               void* ptr,
    ///                               size_t ptr_size);
    /// ```
    ///
    /// ## Description
    ///
    /// To use the `zx_mtrace_control()` function, you must specify
    /// `kernel.enable-debugging-syscalls=true` on the kernel command line. Otherwise,
    /// the function returns `ZX_ERR_NOT_SUPPORTED`.
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Rights
    ///
    /// *handle* must have resource kind `ZX_RSRC_KIND_SYSTEM` with base
    /// `ZX_RSRC_SYSTEM_DEBUG_BASE`.
    ///
    /// ## Return value
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## Errors
    ///
    /// TODO(https://fxbug.dev/42108078)
    ///
    /// ## See also
    ///
    /// TODO(https://fxbug.dev/42108078)
    strict Control(resource struct {
        handle Handle:RESOURCE;
        kind uint32;
        action uint32;
        options uint32;
        @inout
        @voidptr
        ptr vector<byte>:MAX;
    }) -> () error Status;
};
