// 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 fuchsia.tracing.kernel;

using zx;
using fuchsia.tracing;

// TODO(https://fxbug.dev/42105268): Allow providing a vmo of the buffer to use.
@discoverable
closed protocol Controller {
    /// Start tracing.
    strict Start(struct {
        group_mask uint32;
        buffering_mode fuchsia.tracing.BufferingMode;
    }) -> (struct {
        status zx.Status;
    });

    /// Stop tracing.
    strict Stop() -> (struct {
        status zx.Status;
    });

    /// Rewind the trace buffer.
    strict Rewind() -> (struct {
        status zx.Status;
    });
};

const MAX_BUF uint32 = 8192;

@discoverable
closed protocol Reader {
    /// Get the number of bytes written to the trace buffer.
    /// `size` is valid if, and only if, `status` is `ZX_OK`.
    strict GetBytesWritten() -> (struct {
        status zx.Status;
        size uint64;
    });

    /// Read `count` bytes from ktrace buffer at `offset`
    /// and return `data` read upon success
    strict ReadAt(struct {
        count uint64;
        offset uint64;
    }) -> (struct {
        status zx.Status;
        data vector<uint8>:MAX_BUF;
    });
};
