// Copyright 2016 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.

#ifndef SYSROOT_ZIRCON_DEVICE_KTRACE_H_
#define SYSROOT_ZIRCON_DEVICE_KTRACE_H_

#include <string.h>

#include <zircon/syscalls.h>
#include <zircon/types.h>

#include <zircon/device/ioctl-wrapper.h>
#include <zircon/device/ioctl.h>

// return a handle usable with zx_ktrace_write()
#define IOCTL_KTRACE_GET_HANDLE \
    IOCTL(IOCTL_KIND_GET_HANDLE, IOCTL_FAMILY_KTRACE, 1)

// define a new ktrace probe name
// input: ascii probe name, < ZX_MAX_NAME_LEN
// reply: uint32_t probe id usable with zx_ktrace_write()
#define IOCTL_KTRACE_ADD_PROBE \
    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_KTRACE, 2)

IOCTL_WRAPPER_OUT(ioctl_ktrace_get_handle, IOCTL_KTRACE_GET_HANDLE, zx_handle_t)
// Start tracing.
// input: The group_mask
#define IOCTL_KTRACE_START \
    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_KTRACE, 3)

// Stop
#define IOCTL_KTRACE_STOP \
    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_KTRACE, 4)

// Rewind
#define IOCTL_KTRACE_REWIND \
    IOCTL(IOCTL_KIND_DEFAULT, IOCTL_FAMILY_KTRACE, 5)

static inline ssize_t ioctl_ktrace_add_probe(int fd, const char* name, uint32_t* probe_id) {
    return fdio_ioctl(fd, IOCTL_KTRACE_ADD_PROBE,
                      name, strlen(name), probe_id, sizeof(uint32_t));
}

IOCTL_WRAPPER_IN(ioctl_ktrace_start, IOCTL_KTRACE_START, uint32_t)
IOCTL_WRAPPER(ioctl_ktrace_stop, IOCTL_KTRACE_STOP)
IOCTL_WRAPPER(ioctl_ktrace_rewind, IOCTL_KTRACE_REWIND)

#endif  // SYSROOT_ZIRCON_DEVICE_KTRACE_H_
