/*!
##############################################################################
# Copyright (c) 2020-2022, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
##############################################################################
*/
// Implements the trace plugin interface for the MTI interface to trace
// source data from Arm FVP.

#include "MTI/PluginInterface.h"
#include "MTI/PluginFactory.h"
#include "MTI/PluginInstance.h"
#include "MTI/ModelTraceInterface.h"
#include "MTI/ParameterInterface.h"

#include "plugin_utils.h"
#include "trace_sources.h"

#include <errno.h>
#include <string>
#include <algorithm>
#include <cstdio>
#include <sstream>
#include <vector>
#include <map>
#include <typeinfo>
#include <typeindex>
#include <utility>
#include "SimpleCADI.h"

#ifdef SG_MODEL_BUILD
    #include "builddata.h"
    #define PLUGIN_VERSION FULL_VERSION_STRING
#else
    #define PLUGIN_VERSION "unreleased"
#endif

enum plugin_param_t
{
TRACE_FILE_PREFIX,
TRACE_MODE,
TOTAL_PARAMETERS
};
using namespace eslapi;
using namespace MTI;
using namespace std;

// Implements the plugin interface for trace coverage

// Class used to return a static object CAInterface. CAInterface provides a
// basis for a software model built around ’components’ and ’interfaces’.
// A component provides concrete implementations of one or more interfaces.
// Interfaces are identified by a string name (of type if_name_t), and an
// integer revision (type if_rev_t). A higher revision number indicates a newer
// revision of the same interface.
class ThePluginFactory :public PluginFactory
{
public:
    virtual CAInterface *ObtainInterface(if_name_t    ifName,
                                          if_rev_t     minRev,
                                          if_rev_t *   actualRev);

    virtual uint32_t GetNumberOfParameters();

    virtual eslapi::CADIReturn_t
    GetParameterInfos(eslapi::CADIParameterInfo_t *parameter_info_list);

    virtual CAInterface *Instantiate(const char *instance_name,
                                     uint32_t number_of_parameters,
                                     eslapi::CADIParameterValue_t *parameter_values);

    virtual void Release();

    virtual const char *GetType() const { return "CoverageTrace"; }
    virtual const char *GetVersion() const { return PLUGIN_VERSION; }
};

static ThePluginFactory *GetThePluginFactory();
class CoverageTrace :
        public ParameterInterface,
        public PluginInstance
{
public:
    virtual CAInterface * ObtainInterface(if_name_t    ifName,
                                          if_rev_t     minRev,
                                          if_rev_t *   actualRev);

    CoverageTrace(const char *instance_name, const char *trace_file_prefix,
                  int _mode);
    ~CoverageTrace();

    /** This is to associate a plugin with a simulation instance. Exactly one
     * simulation must be registered.
     * */
    virtual eslapi::CADIReturn_t RegisterSimulation(eslapi::CAInterface
                                                    *simulation);

    // This is called before the plugin .dll/.so is unloaded and should allow
    // the plugin to do it's cleanup.
    virtual void Release();
    void Save(void);

    virtual const char *GetName() const;
    virtual eslapi::CADIReturn_t GetParameterInfos(uint32_t start_index,
                                               uint32_t desired_num_of_params,
                                               uint32_t* actual_num_of_params,
                                               eslapi::CADIParameterInfo_t* params);

    virtual eslapi::CADIReturn_t GetParameterInfo(const char* parameterName,
                                              eslapi::CADIParameterInfo_t* param);

    virtual eslapi::CADIReturn_t GetParameterValues(uint32_t parameter_count,
                                                uint32_t* actual_num_of_params_read,
                                                eslapi::CADIParameterValue_t* param_values_out);
    virtual eslapi::CADIReturn_t SetParameterValues(uint32_t parameter_count,
                                                eslapi::CADIParameterValue_t* parameters,
                                                eslapi::CADIFactoryErrorMessage_t* error);
    ModeChangeTraceContext *mode_change;
private:
    std::string instance_name;

    bool Error(const char *);

    vector<TraceComponentContext*> trace_components;
    std::string trace_file_prefix;
    int trace_mode;
};

CAInterface *CoverageTrace::ObtainInterface(if_name_t ifName,
                            if_rev_t     minRev,
                            if_rev_t *   actualRev)
{
  printf("CoverageTrace::ObtainInterface\n");
    // If someone is asking for the matching interface
    if((strcmp(ifName,PluginInstance::IFNAME()) == 0) &&
    // and the revision of this interface implementation is
       (minRev <= PluginInstance::IFREVISION()))
        // at least what is being asked for
    {
        if (actualRev) // Make sure this is not a NULL pointer
            *actualRev = PluginInstance::IFREVISION();
        return dynamic_cast<PluginInstance *>(this);
    }

    if((strcmp(ifName, CAInterface::IFNAME()) == 0) &&
       minRev <= CAInterface::IFREVISION())
    {
        if (actualRev != NULL)
            *actualRev = CAInterface::IFREVISION();
        return dynamic_cast<CAInterface *>(dynamic_cast<PluginInstance *>(this));
    }
    if((strcmp(ifName, ParameterInterface::IFNAME()) == 0) &&
       minRev <= ParameterInterface::IFREVISION())
    {
        if (actualRev != NULL)
            *actualRev = ParameterInterface::IFREVISION();
        return dynamic_cast<ParameterInterface *>(this);
    }
     printf("CoverageTrace::ObtainInterface Failed!\n");
    return NULL;
}


CoverageTrace::CoverageTrace(const char *instance_name_,
                             const char *trace_file_prefix_, int _mode) :
    instance_name(instance_name_),
    trace_file_prefix(trace_file_prefix_),
    trace_mode(_mode)
{
  printf("CoverageTrace::CoverageTrace\n");
}

CoverageTrace::~CoverageTrace()
{
  printf("CoverageTrace::~CoverageTrace\n");
}

bool
CoverageTrace::Error(const char *msg)
{
    fprintf(stderr, "%s\n", msg);
    return false;
}

// Method that registers the simulation traces events. In this case registers
// for trace sources with the 'INST' name.
CADIReturn_t
CoverageTrace::RegisterSimulation(CAInterface *ca_interface)
{
  printf("CoverageTrace::RegisterSimulation\n");
    if (!ca_interface) {
        Error("Received CAInterface NULL pointer.");
        return CADI_STATUS_IllegalArgument;
    }
    std::stringstream ss;

    SystemTraceInterface *sys_if =
                          ca_interface->ObtainPointer<SystemTraceInterface>();
    if (sys_if == 0) {
        Error("Got a NULL SystemTraceInterface.");
        return CADI_STATUS_GeneralError;
    }

    for(SystemTraceInterface::TraceComponentIndex tci=0;
        tci < sys_if->GetNumOfTraceComponents(); ++tci) {
        const char* tpath = sys_if->GetComponentTracePath(tci);
        CAInterface *caif = sys_if->GetComponentTrace(tci);
        ComponentTraceInterface *cti =
                                 caif->ObtainPointer<ComponentTraceInterface>();
        InstructionTraceContext *inst_cont = NULL;
        MTI::EventClass * event = NULL;

        if (cti == 0) {
            Error("Could not get TraceInterface for component.");
            continue;
        }

        if (cti->GetTraceSource("INST") != 0) {
            TraceComponentContext *trace_component = new
                                                TraceComponentContext(tpath);

            // To register a new trace source the arguments are the
            // name of the trace source followed by a vector of
            // pairs of (field name,field type).
            inst_cont = new InstructionTraceContext(
                    "INST",
                    { {"PC", u32},
                    {"SIZE", u32}}
                    );
            inst_cont->nb_insts = 0;
            event = inst_cont->CreateEvent(&cti, inst_cont->Callback);
            event->UnregisterCallback(inst_cont->Callback, inst_cont);
            trace_component->AddTraceSource(inst_cont);
            trace_components.push_back(trace_component);
        }
        if (cti->GetTraceSource("MODE_CHANGE") != 0) {
            MTI::EventClass * mode_event = NULL;
            if(!event) {
                Error("Could not set mode_change event");
                continue;
            }
            // To register a new trace source the arguments are the
            // name of the trace source followed by a vector of
            // pairs of (field name,field type).
           this->mode_change = new ModeChangeTraceContext(
                    "MODE_CHANGE",
                    { {"MODE", u8},
                    {"NON_SECURE", u8}
                    }
                    );
           mode_event = this->mode_change->CreateEvent(&cti, this->mode_change->Callback);
           this->mode_change->event = event;
           this->mode_change->itc = inst_cont;
           this->mode_change->mode_mask = trace_mode;
           mode_event->RegisterCallback(this->mode_change->Callback, mode_change);
        }

    }

    return CADI_STATUS_OK;
}

// This is called before the plugin .dll/.so is unloaded and should allow the
// plugin to do it's cleanup.
void
CoverageTrace::Release()
{
    printf("CoverageTrace::Release\n");
    // We can dump our data now
    this->Save();
}

void
CoverageTrace::Save(void)
{
    int error = 0;
    char* fname;
    int ret;
    std::vector<TraceComponentContext*>::iterator tcc;
    for (tcc = trace_components.begin(); tcc < trace_components.end(); ++tcc) {
        TraceComponentContext *tcont = *tcc;
        // Print some overall stats
        InstructionTraceContext* rtc = (InstructionTraceContext*)
                                    tcont->trace_sources["INST"];
        printf("Trace path: %s\n", tcont->trace_path.c_str());

        // Construct a trace file name
        int status = asprintf(&fname, "%s-%s.log",
                              this->trace_file_prefix.c_str(),
                              tcont->trace_path.c_str());
        if ( status == -1)
        {
            printf("Error in asprintf: %d\n", status);
            printf("Error description is : %s\n", strerror(errno));
          }

        // Open it
        FILE* fp = fopen(fname, "w");
        if (fp == NULL) {
            fprintf(stderr, "Can't open file %s for writing.\n", fname);
            error = 1;
            break;
        }

        InstStatMap::iterator map_it;
        // Dump the detailed stats
        for (map_it = rtc->stats.begin(); map_it != rtc->stats.end();
            ++map_it) {
            fprintf(fp, "%08x %lu %lu\n", map_it->first, map_it->second.cnt,
                    map_it->second.size);
        }

        // Close the file
        ret = fclose(fp);
        if (ret != 0) {
            fprintf(stderr, "Failed to close %s: %s.", fname, strerror(errno));
            error = 1;
            break;
        }

        free(fname);
    }
    printf("Everything saved\n");
    if (error != 0)
        delete this;
}

const char *
CoverageTrace::GetName() const
{
  printf("CoverageTrace::GetName\n");
    return instance_name.c_str();
}

CADIReturn_t CoverageTrace::GetParameterInfos(uint32_t start_index,
                uint32_t desired_num_of_params,
                uint32_t* actual_num_of_params,
                CADIParameterInfo_t* params)
{

        *actual_num_of_params = GetThePluginFactory()->GetNumberOfParameters();
        return GetThePluginFactory()->GetParameterInfos(params);

}

CADIReturn_t CoverageTrace::GetParameterInfo(const char* parameterName,
                CADIParameterInfo_t* param)
{
        uint32_t num_of_params = GetThePluginFactory()->GetNumberOfParameters();
        CADIParameterInfo_t* plugin_parameters = NULL;

        GetThePluginFactory()->GetParameterInfos(plugin_parameters);

        if (param == nullptr)
        {
                return CADI_STATUS_IllegalArgument;
        }

        printf("Reading parameter info %s \n", parameterName);
        for (uint32_t i = 0; i <  num_of_params; ++i)
        {
                if (strcmp(plugin_parameters[i].name, parameterName) == 0)
                {
                        *param = plugin_parameters[i];
                        return CADI_STATUS_OK;
                }
        }
        *param = plugin_parameters[0];
        return CADI_STATUS_OK;

}

CADIReturn_t CoverageTrace::GetParameterValues(uint32_t parameter_count,
                uint32_t* actual_num_of_params_read,
                CADIParameterValue_t *param_values_out)
{
        if (param_values_out == nullptr || actual_num_of_params_read == nullptr)
        {
                return CADI_STATUS_IllegalArgument;
        }

        *actual_num_of_params_read = 0;
        for (uint32_t i = 0; i < parameter_count; ++i)
        {
                CADIParameterValue_t &param_value = param_values_out[i];

                switch (param_value.parameterID)
                {
                        case TRACE_FILE_PREFIX:
                                strncpy(param_value.stringValue,
                                        this->trace_file_prefix.c_str(),
                                        sizeof(param_value.stringValue));
                                break;

                        case TRACE_MODE:
                                param_value.intValue = this->mode_change->mode_mask;
                                break;
                        default: // unknown ID

                                *actual_num_of_params_read = i;
                                return CADI_STATUS_IllegalArgument;
                }
        }

        *actual_num_of_params_read = parameter_count;
        return CADI_STATUS_OK;
}

CADIReturn_t CoverageTrace::SetParameterValues(uint32_t parameter_count,
                                            CADIParameterValue_t* parameters,
                                            CADIFactoryErrorMessage_t* error)
{
        for (uint32_t i = 0; i < parameter_count; ++i)
        {
            CADIParameterValue_t &parameter = parameters[i];
            switch(parameter.parameterID)
            {
                case TRACE_FILE_PREFIX:
                        this->trace_file_prefix =  parameter.stringValue;
                        this->Save();
                        break;
                case TRACE_MODE:
                        this->mode_change->mode_mask =  parameter.intValue;
                        break;
            default:
                ;
                break;
            }
        }
    return CADI_STATUS_OK;
}

// Allows a client to obtain a reference to any of the interfaces that the
// component implements. The client specifies the id and revision of the
// interface that it wants to request. The component can return NULL if it
// doesn’t implement that interface, or only implements a lower revision.
// The client in this case is the Arm FVP model.
CAInterface *ThePluginFactory::ObtainInterface(if_name_t ifName,
                                  if_rev_t     minRev,
                                  if_rev_t *   actualRev)
{
  printf("ThePluginFactory::ObtainInterface\n");
    // If someone is asking for the matching interface
    if((strcmp(ifName,IFNAME()) == 0) &&
        // and the revision of this interface implementation is
       (minRev <= IFREVISION()))
        // at least what is being asked for
    {
        if (actualRev) // Make sure this is not a NULL pointer
            *actualRev = IFREVISION();
        return static_cast<ThePluginFactory *>(this);
    }

    if((strcmp(ifName, CAInterface::IFNAME()) == 0) &&
       minRev <= CAInterface::IFREVISION())
    {
        if (actualRev) // Make sure this is not a NULL pointer
            *actualRev = CAInterface::IFREVISION();
        return static_cast<CAInterface *>(this);
    }
    return NULL;
}

uint32_t ThePluginFactory::GetNumberOfParameters()
{
  printf("ThePluginFactory::GetNumberOfParameters\n");
  return TOTAL_PARAMETERS;
}

eslapi::CADIReturn_t
ThePluginFactory::GetParameterInfos(
eslapi::CADIParameterInfo_t *parameter_info_list)
{
    printf("ThePluginFactory::GetParameterInfos\n");
    parameter_info_list[0] = CADIParameterInfo_t(
        TRACE_FILE_PREFIX, "trace-file-prefix", CADI_PARAM_STRING,
        "Prefix of the trace files.", true, 0, 0, 0, "covtrace");
    parameter_info_list[1] = CADIParameterInfo_t(
        TRACE_MODE, "trace-mode", CADI_PARAM_INT,
        "Selects which modes to trace.", true, 0, 0xffffffff, 0xffffffff, 0);
    return CADI_STATUS_OK;
}

// Method that creates a new instance of the trace plugin
CAInterface *ThePluginFactory::Instantiate(const char *instance_name,
                              uint32_t param_nb,
                              eslapi::CADIParameterValue_t *values)
{
    printf("ThePluginFactory::Instantiate\n");
    const char *trace_file_prefix = 0;
    int mode_value = 0xffffffff;

    printf("CoverageTrace: number of params: %d\n", param_nb);
    for (uint32_t i = 0; i < param_nb; ++i) {
        if (values[i].parameterID == TRACE_FILE_PREFIX) {
            trace_file_prefix = values[i].stringValue;
        } else if (values[i].parameterID == TRACE_MODE) {
            mode_value = values[i].intValue;
        } else {
            printf("\tCoverageTrace: got unexpected param %d\n",
                   values[i].parameterID);
        }
    }
    return (PluginInstance*)new CoverageTrace(instance_name, trace_file_prefix,
            mode_value);
}

void ThePluginFactory::Release()
{
  printf("ThePluginFactory::Release\n");
}

static ThePluginFactory factory_instance;

// Entry point for the instantiation of the plugin.
// Returns a pointer to an static object to create the interface for the
// plugin.
CAInterface *GetCAInterface()
{
    printf("********->GetCAInterface\n");
    return &factory_instance;
}
static ThePluginFactory *GetThePluginFactory()
{
    return &factory_instance;
}

// End of file CoverageTrace.cpp
