// 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 SRC_PERFORMANCE_INSNTRACE_CONFIG_H_
#define SRC_PERFORMANCE_INSNTRACE_CONFIG_H_

#include <fuchsia/hardware/cpu/insntrace/cpp/fidl.h>
#include <zircon/syscalls.h>

#include <cstdint>
#include <string>

#include "src/lib/fxl/macros.h"

namespace insntrace {

using Mode = ::fuchsia::hardware::cpu::insntrace::Mode;

// The parameters controlling data collection.

struct IptConfig {
  enum class AddrFilter { kOff = 0, kEnable = 1, kStop = 2 };
  struct AddrRange {
    // "" if no ELF
    std::string elf;
    uint64_t begin, end;
  };

  static constexpr Mode kDefaultMode = Mode::CPU;
  static constexpr uint32_t kDefaultMaxThreads = 16;
  static constexpr size_t kDefaultNumChunks = 16;
  static constexpr size_t kDefaultChunkOrder = 2;  // 16kb
  static constexpr bool kDefaultIsCircular = false;
  static constexpr char kDefaultOutputPathPrefix[] = "/tmp/ptout";

  IptConfig();

  // Return the value to write to the CTL MSR.
  uint64_t CtlMsr() const;

  // Return values for the addr range MSRs.
  uint64_t AddrBegin(unsigned index) const;
  uint64_t AddrEnd(unsigned index) const;

  Mode mode;

  // The number of cpus on this system, as reported by
  // zx_system_get_num_cpus().
  uint32_t num_cpus;

  // When tracing threads, the max number of threads we can trace.
  uint32_t max_threads;

  // Details of the tracing buffer.
  size_t num_chunks;
  // The size of each chunk, in pages as a power of 2.
  size_t chunk_order;
  bool is_circular;

  // The various fields of IA32_RTIT_CTL MSR, and support MSRs.
  AddrFilter addr[2];
  AddrRange addr_range[2];
  bool branch;
  // zero if disabled
  uint64_t cr3_match;
  // True if cr3_match was specified on the command line.
  bool cr3_match_set;
  bool cyc;
  uint32_t cyc_thresh;
  bool mtc;
  uint32_t mtc_freq;
  uint32_t psb_freq;
  bool os, user;
  bool retc;
  bool tsc;

  // The path prefix of all of the output files.
  std::string output_path_prefix;
};

}  // namespace insntrace

#endif  // SRC_PERFORMANCE_INSNTRACE_CONFIG_H_
