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

#include "garnet/lib/perfmon/properties_impl.h"

namespace perfmon {
namespace internal {

using ::fuchsia::perfmon::cpu::PropertyFlags;

void FidlToPerfmonProperties(const FidlPerfmonProperties& props, Properties* out_props) {
  *out_props = {};

  out_props->api_version = props.api_version;
  out_props->pm_version = props.pm_version;

  out_props->max_num_events = props.max_num_events;

  out_props->max_num_fixed_events = props.max_num_fixed_events;
  out_props->max_fixed_counter_width = props.max_fixed_counter_width;

  out_props->max_num_programmable_events = props.max_num_programmable_events;
  out_props->max_programmable_counter_width = props.max_programmable_counter_width;

  out_props->max_num_misc_events = props.max_num_misc_events;
  out_props->max_misc_counter_width = props.max_misc_counter_width;

  out_props->flags = 0;
  if ((props.flags & PropertyFlags::HAS_LAST_BRANCH) == PropertyFlags::HAS_LAST_BRANCH) {
    out_props->flags |= Properties::kFlagHasLastBranch;
  }
}

}  // namespace internal
}  // namespace perfmon
