// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#include "x86_pt.h"

#include <cpuid.h>

#include <atomic>
#include <mutex>

#include "x86_cpuid.h"

namespace debugger_utils {

/* Trick to get a 1 of the right size */
#define ONE(x) (1 + ((x) - (x)))
#define BIT(x, bit) ((x) & (ONE(x) << (bit)))
#define BITS_SHIFT(x, high, low) (((x) >> (low)) & ((ONE(x) << ((high) - (low) + 1)) - 1))

static X86ProcessorTraceFeatures pt_features;  // TODO(dje): guard annotation
static bool initialized = false;               // TODO(dje): guard annotation
static std::mutex cpuid_mutex;

bool X86HaveProcessorTrace() {
  const X86ProcessorTraceFeatures* ptf = X86GetProcessorTraceFeatures();
  return ptf->have_pt;
}

const X86ProcessorTraceFeatures* X86GetProcessorTraceFeatures() {
  std::lock_guard<std::mutex> lock(cpuid_mutex);

  X86ProcessorTraceFeatures* pt = &pt_features;

  if (initialized)
    return pt;

  memset(pt, 0, sizeof(*pt));
  initialized = true;

  if (!x86_feature_test(X86_FEATURE_PT))
    return pt;

  unsigned a, b, c, d;
  unsigned max_leaf = __get_cpuid_max(0, nullptr);

  pt->have_pt = true;

  __cpuid_count(0x14, 0, a, b, c, d);
  if (BIT(b, 2))
    pt->addr_cfg_max = 2;
  if (BIT(b, 1) && a >= 1) {
    unsigned a1, b1, c1, d1;
    __cpuid_count(0x14, 1, a1, b1, c1, d1);
    pt->mtc_freq_mask = (a1 >> 16) & 0xffff;
    pt->cycle_thresh_mask = b1 & 0xffff;
    pt->psb_freq_mask = (b1 >> 16) & 0xffff;
    pt->num_addr_ranges = a1 & 0x3;
  }

  pt->cr3_filtering = !!BIT(b, 0);
  pt->cycle_accurate_mode = !!BIT(b, 1);
  pt->ip_filtering = !!BIT(b, 2);
  pt->mtc = !!BIT(b, 3);
  pt->ptwrite = !!BIT(b, 4);
  pt->power_events = !!BIT(b, 5);

  pt->supports_filter_ranges = pt->addr_cfg_max >= 1;
  pt->supports_stop_ranges = pt->addr_cfg_max >= 2;

  pt->to_pa = !!BIT(c, 0);
  pt->multiple_to_pa_entries = !!BIT(c, 1);
  pt->single_range = !!BIT(c, 2);
  pt->trace_transport_output = !!BIT(c, 3);
  pt->payloads_are_lip = !!BIT(c, 31);

  if (max_leaf >= 0x15) {
    unsigned a1 = 0, b1 = 0, c1 = 0, d1 = 0;
    __cpuid(0x15, a1, b1, c1, d1);
    pt->tsc_ratio_den = a1;
    pt->tsc_ratio_num = b1;
  }

  return pt;
}

}  // namespace debugger_utils
