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

// This file contains the details of what models and their events are
// registered. For host builds we want everything. For target builds we
// only want that target.

#include "garnet/lib/perfmon/event-registry.h"

#include <lib/syslog/cpp/macros.h>

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

namespace perfmon {
namespace internal {

void EventRegistry::RegisterEvents(const char* model_name, const char* group_name,
                                   const EventDetails* events, size_t count) {
  FX_VLOGS(1) << "Registering " << model_name << " " << group_name << " events";

  ModelEvents& model_events = (*this)[model_name];
  ModelEventManager::EventTable* table = nullptr;

  if (strcmp(group_name, kArchGroupName) == 0) {
    table = &model_events.arch_events;
  } else if (strcmp(group_name, kFixedGroupName) == 0) {
    table = &model_events.fixed_events;
  } else if (strcmp(group_name, kModelGroupName) == 0) {
    table = &model_events.model_events;
  } else if (strcmp(group_name, kMiscGroupName) == 0) {
    table = &model_events.misc_events;
  }
  FX_CHECK(table != nullptr);

  table->reserve(table->size() + count);

  for (size_t i = 0; i < count; ++i) {
    table->push_back(&events[i]);
  }
}

void RegisterCurrentArchEvents(EventRegistry* registry) {
#ifdef __x86_64__
  RegisterAllIntelModelEvents(registry);
#elif defined(__aarch64__)
  RegisterAllArm64ModelEvents(registry);
#endif
}

}  // namespace internal
}  // namespace perfmon
