// Copyright 2019 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

// A note on the distribution of code between us and the userspace driver:
// The default location for code is the userspace driver. Reasons for
// putting code here are: implementation requirement (need ring zero to write
// MSRs), stability, and performance. The device driver should do as much
// error checking as possible before calling us.
// Note that we do a lot of verification of the input configuration:
// We don't want to be compromised if the userspace driver gets compromised.

// A note on terminology: "events" vs "counters": A "counter" is an
// "event", but some events are not counters. Internally, we use the
// term "counter" when we know the event is a counter.

#include <lib/perfmon.h>

bool perfmon_supported = false;

int perfmon_active = false;

PerfmonStateBase::PerfmonStateBase(unsigned n_cpus)
        : num_cpus(n_cpus) {}

PerfmonStateBase::~PerfmonStateBase() {
    DEBUG_ASSERT(!atomic_load(&perfmon_active));

    if (cpu_data) {
        for (unsigned cpu = 0; cpu < num_cpus; ++cpu) {
            auto data = &cpu_data[cpu];
            data->~PerfmonCpuData();
        }
        // This frees the memory allocated by |memalign()|.
        free(cpu_data);
    }
}

bool PerfmonStateBase::AllocatePerCpuData() {
    DEBUG_ASSERT(cpu_data == nullptr);

    size_t space_needed = sizeof(PerfmonCpuData) * num_cpus;
    auto cdata = reinterpret_cast<PerfmonCpuData*>(
        memalign(alignof(PerfmonCpuData), space_needed));
    if (!cdata) {
        return false;
    }

    for (unsigned cpu = 0; cpu < num_cpus; ++cpu) {
        new (&cdata[cpu]) PerfmonCpuData();
    }

    cpu_data = cdata;
    return true;
}
