/**
 * Describes functions for converting VT-d specific DMAr CPER sections from binary and JSON format
 * into an intermediate format.
 * 
 * Author: Lawrence.Tang@arm.com
 **/
#include <stdio.h>
#include <string.h>
#include "json.h"
#include "b64.h"
#include "../edk/Cper.h"
#include "../cper-utils.h"
#include "cper-section-dmar-vtd.h"

//Converts a single VT-d specific DMAr CPER section into JSON IR.
json_object* cper_section_dmar_vtd_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
{
    EFI_DIRECTED_IO_DMAR_ERROR_DATA* vtd_error = (EFI_DIRECTED_IO_DMAR_ERROR_DATA*)section;
    json_object* section_ir = json_object_new_object();

    //Version, revision and OEM ID, as defined in the VT-d architecture.
    UINT64 oem_id = 0;
    for (int i=0; i<6; i++)
        oem_id |= (UINT64)vtd_error->OemId[i] << (i * 8);
    json_object_object_add(section_ir, "version", json_object_new_int(vtd_error->Version));
    json_object_object_add(section_ir, "revision", json_object_new_int(vtd_error->Revision));
    json_object_object_add(section_ir, "oemID", json_object_new_uint64(oem_id));

    //Registers.
    json_object_object_add(section_ir, "capabilityRegister", json_object_new_uint64(vtd_error->Capability));
    json_object_object_add(section_ir, "extendedCapabilityRegister", json_object_new_uint64(vtd_error->CapabilityEx));
    json_object_object_add(section_ir, "globalCommandRegister", json_object_new_uint64(vtd_error->GlobalCommand));
    json_object_object_add(section_ir, "globalStatusRegister", json_object_new_uint64(vtd_error->GlobalStatus));
    json_object_object_add(section_ir, "faultStatusRegister", json_object_new_uint64(vtd_error->FaultStatus));

    //Fault record basic fields.
    json_object* fault_record_ir = json_object_new_object();
    EFI_VTD_FAULT_RECORD* fault_record = (EFI_VTD_FAULT_RECORD*)vtd_error->FaultRecord;
    json_object_object_add(fault_record_ir, "faultInformation", json_object_new_uint64(fault_record->FaultInformation));
    json_object_object_add(fault_record_ir, "sourceIdentifier", json_object_new_uint64(fault_record->SourceIdentifier));
    json_object_object_add(fault_record_ir, "privelegeModeRequested", 
        json_object_new_boolean(fault_record->PrivelegeModeRequested));
    json_object_object_add(fault_record_ir, "executePermissionRequested", 
        json_object_new_boolean(fault_record->ExecutePermissionRequested));
    json_object_object_add(fault_record_ir, "pasidPresent", json_object_new_boolean(fault_record->PasidPresent));
    json_object_object_add(fault_record_ir, "faultReason", json_object_new_uint64(fault_record->FaultReason));
    json_object_object_add(fault_record_ir, "pasidValue", json_object_new_uint64(fault_record->PasidValue));
    json_object_object_add(fault_record_ir, "addressType", json_object_new_uint64(fault_record->AddressType));

    //Fault record type.
    json_object* fault_record_type = integer_to_readable_pair(fault_record->Type, 2,
        VTD_FAULT_RECORD_TYPES_KEYS,
        VTD_FAULT_RECORD_TYPES_VALUES,
        "Unknown");
    json_object_object_add(fault_record_ir, "type", fault_record_type);
    json_object_object_add(section_ir, "faultRecord", fault_record_ir);

    //Root entry.
    char* encoded = b64_encode((unsigned char*)vtd_error->RootEntry, 16);
    json_object_object_add(section_ir, "rootEntry", json_object_new_string(encoded));
    free(encoded);

    //Context entry.
    encoded = b64_encode((unsigned char*)vtd_error->ContextEntry, 16);
    json_object_object_add(section_ir, "contextEntry", json_object_new_string(encoded));
    free(encoded);

    //PTE entry for all page levels.
    json_object_object_add(section_ir, "pageTableEntry_Level6", json_object_new_uint64(vtd_error->PteL6));
    json_object_object_add(section_ir, "pageTableEntry_Level5", json_object_new_uint64(vtd_error->PteL5));
    json_object_object_add(section_ir, "pageTableEntry_Level4", json_object_new_uint64(vtd_error->PteL4));
    json_object_object_add(section_ir, "pageTableEntry_Level3", json_object_new_uint64(vtd_error->PteL3));
    json_object_object_add(section_ir, "pageTableEntry_Level2", json_object_new_uint64(vtd_error->PteL2));
    json_object_object_add(section_ir, "pageTableEntry_Level1", json_object_new_uint64(vtd_error->PteL1));

    return section_ir;
}

//Converts a single VT-d DMAR CPER-JSON segment into CPER binary, outputting to the given stream.
void ir_section_dmar_vtd_to_cper(json_object* section, FILE* out)
{
    EFI_DIRECTED_IO_DMAR_ERROR_DATA* section_cper =
        (EFI_DIRECTED_IO_DMAR_ERROR_DATA*)calloc(1, sizeof(EFI_DIRECTED_IO_DMAR_ERROR_DATA));

    //OEM ID.
    UINT64 oem_id = json_object_get_uint64(json_object_object_get(section, "oemID"));
    for (int i=0; i<6; i++)
        section_cper->OemId[i] = (oem_id >> (i * 8)) & 0xFF;

    //Registers & basic numeric fields.
    section_cper->Version = (UINT8)json_object_get_int(json_object_object_get(section, "version"));
    section_cper->Revision = (UINT8)json_object_get_int(json_object_object_get(section, "revision"));
    section_cper->Capability = json_object_get_uint64(json_object_object_get(section, "capabilityRegister"));
    section_cper->CapabilityEx = json_object_get_uint64(json_object_object_get(section, "extendedCapabilityRegister"));
    section_cper->GlobalCommand = json_object_get_uint64(json_object_object_get(section, "globalCommandRegister"));
    section_cper->GlobalStatus = json_object_get_uint64(json_object_object_get(section, "globalStatusRegister"));
    section_cper->FaultStatus = json_object_get_uint64(json_object_object_get(section, "faultStatusRegister"));

    //Fault record.
    json_object* fault_record = json_object_object_get(section, "faultRecord");
    EFI_VTD_FAULT_RECORD* fault_record_cper = (EFI_VTD_FAULT_RECORD*)section_cper->FaultRecord;
    fault_record_cper->FaultInformation = 
        json_object_get_uint64(json_object_object_get(fault_record, "faultInformation"));
    fault_record_cper->SourceIdentifier = 
        json_object_get_uint64(json_object_object_get(fault_record, "sourceIdentifier"));
    fault_record_cper->PrivelegeModeRequested = 
        json_object_get_boolean(json_object_object_get(fault_record, "privelegeModeRequested"));
    fault_record_cper->ExecutePermissionRequested = 
        json_object_get_boolean(json_object_object_get(fault_record, "executePermissionRequested"));
    fault_record_cper->PasidPresent = 
        json_object_get_boolean(json_object_object_get(fault_record, "pasidPresent"));
    fault_record_cper->FaultReason = 
        json_object_get_uint64(json_object_object_get(fault_record, "faultReason"));
    fault_record_cper->PasidValue = 
        json_object_get_uint64(json_object_object_get(fault_record, "pasidValue"));
    fault_record_cper->AddressType = 
        json_object_get_uint64(json_object_object_get(fault_record, "addressType"));
    fault_record_cper->Type = 
        readable_pair_to_integer(json_object_object_get(fault_record, "type"));
        
    //Root entry.
    json_object* encoded = json_object_object_get(section, "rootEntry");
    UINT8* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
    memcpy(section_cper->RootEntry, decoded, 16);
    free(decoded);

    //Context entry.
    encoded = json_object_object_get(section, "contextEntry");
    decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
    memcpy(section_cper->ContextEntry, decoded, 16);
    free(decoded);

    //Page table entries.
    section_cper->PteL1 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level1"));
    section_cper->PteL2 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level2"));
    section_cper->PteL3 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level3"));
    section_cper->PteL4 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level4"));
    section_cper->PteL5 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level5"));
    section_cper->PteL6 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level6"));

    //Write to stream, free resources.
    fwrite(section_cper, sizeof(EFI_DIRECTED_IO_DMAR_ERROR_DATA), 1, out);
    fflush(out);
    free(section_cper);
}