Files
CoreFreq/riscv64/corefreq-cli-json.c

1520 lines
54 KiB
C

/*
* CoreFreq (C) 2015-2025 CYRIL COURTIAT
* Contributors: CyrIng
* Licenses: GPL2
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include "bitasm.h"
#include "coretypes.h"
#include "corefreq.h"
#include "corefreq-ui.h"
#include "corefreq-cli-rsc.h"
#include "corefreq-cli.h"
#include "corefreq-cli-json.h"
#include "corefreq-cli-extra.h"
double timespecFloat(struct timespec time)
{
return (double) time.tv_sec + (time.tv_nsec / 1000000000.0);
}
void JsonSysInfo(RO(SHM_STRUCT) *RO(Shm))
{
char hexStr[32];
signed int i = 0, i2 = 0, i3 = 0;
unsigned int cpu;
struct json_state s = { .depth = 0, .nested_state = {0},
.write = json_writer_stdout };
json_start_object(&s);
json_key(&s, "Registration");
{
json_start_object(&s);
json_key(&s, "AutoClock");
json_literal(&s, "%d", RO(Shm)->Registration.AutoClock);
json_key(&s, "Experimental");
json_literal(&s, "%d", RO(Shm)->Registration.Experimental);
json_key(&s, "HotPlug");
json_literal(&s, "%d", !(RO(Shm)->Registration.HotPlug < 0));
json_key(&s, "PCI");
json_literal(&s, "%d", RO(Shm)->Registration.PCI);
json_key(&s, "Interrupt");
{
json_start_object(&s);
json_key(&s, "NMI_LOCAL");
json_literal(&s, "%u", BITVAL(RO(Shm)->Registration.NMI, BIT_NMI_LOCAL));
json_key(&s, "NMI_UNKNOWN");
json_literal(&s, "%u", BITVAL(RO(Shm)->Registration.NMI, BIT_NMI_UNKNOWN));
json_key(&s, "NMI_SERR");
json_literal(&s, "%u", BITVAL(RO(Shm)->Registration.NMI, BIT_NMI_SERR));
json_key(&s, "NMI_IO_CHECK");
json_literal(&s, "%u", BITVAL(RO(Shm)->Registration.NMI, BIT_NMI_IO_CHECK));
json_end_object(&s);
}
json_key(&s, "IdleRoute");
json_literal(&s, "%d", RO(Shm)->Registration.Driver.Route);
json_key(&s, "CPUidle");
json_literal(&s, "%hu", RO(Shm)->Registration.Driver.CPUidle);
json_key(&s, "CPUfreq");
json_literal(&s, "%hu", RO(Shm)->Registration.Driver.CPUfreq);
json_key(&s, "Governor");
json_literal(&s, "%hu", RO(Shm)->Registration.Driver.Governor);
json_key(&s, "ClockSource");
json_literal(&s, "%hu", RO(Shm)->Registration.Driver.CS);
json_key(&s, "Scope");
{
json_start_object(&s);
snprintf(hexStr, 32, "0x%x", RO(Shm)->Proc.thermalFormula);
json_key(&s, "Thermal");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%x", RO(Shm)->Proc.voltageFormula);
json_key(&s, "Voltage");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%x", RO(Shm)->Proc.powerFormula);
json_key(&s, "Power");
json_string(&s, hexStr);
json_end_object(&s);
}
json_end_object(&s);
}
if (BITWISEAND(LOCKLESS, RO(Shm)->SysGate.Operation, 0x1))
{
json_key(&s, "SysGate");
{
json_start_object(&s);
json_key(&s, "tickReset");
json_literal(&s, "%u", RO(Shm)->SysGate.tickReset);
json_key(&s, "tickStep");
json_literal(&s, "%u", RO(Shm)->SysGate.tickStep);
json_key(&s, "trackTask");
json_literal(&s, "%d", RO(Shm)->SysGate.trackTask);
json_key(&s, "sortByField");
json_literal(&s, "%d", RO(Shm)->SysGate.sortByField);
json_key(&s, "reverseOrder");
json_literal(&s, "%d", RO(Shm)->SysGate.reverseOrder);
json_key(&s, "taskCount");
json_literal(&s, "%d", RO(Shm)->SysGate.taskCount);
json_key(&s, "taskList");
json_start_arr(&s);
for (i = 0; i < RO(Shm)->SysGate.taskCount; i++) {
json_start_object(&s);
json_key(&s, "runtime");
json_literal(&s, "%llu", RO(Shm)->SysGate.taskList[i].runtime);
json_key(&s, "usertime");
json_literal(&s, "%llu", RO(Shm)->SysGate.taskList[i].usertime);
json_key(&s, "systime");
json_literal(&s, "%llu", RO(Shm)->SysGate.taskList[i].systime);
json_key(&s, "pid");
json_literal(&s, "%d", RO(Shm)->SysGate.taskList[i].pid);
json_key(&s, "tgid");
json_literal(&s, "%d", RO(Shm)->SysGate.taskList[i].tgid);
json_key(&s, "ppid");
json_literal(&s, "%d", RO(Shm)->SysGate.taskList[i].ppid);
json_key(&s, "state");
json_literal(&s, "%hu", RO(Shm)->SysGate.taskList[i].state);
json_key(&s, "wake_cpu");
json_literal(&s, "%hu", RO(Shm)->SysGate.taskList[i].wake_cpu);
json_key(&s, "comm");
json_string(&s, RO(Shm)->SysGate.taskList[i].comm);
json_end_object(&s);
}
json_end_arr(&s);
json_key(&s, "memInfo");
{
json_start_object(&s);
json_key(&s, "totalram");
json_literal(&s, "%llu", RO(Shm)->SysGate.memInfo.totalram);
json_key(&s, "sharedram");
json_literal(&s, "%llu", RO(Shm)->SysGate.memInfo.sharedram);
json_key(&s, "freeram");
json_literal(&s, "%llu", RO(Shm)->SysGate.memInfo.freeram);
json_key(&s, "bufferram");
json_literal(&s, "%llu", RO(Shm)->SysGate.memInfo.bufferram);
json_key(&s, "totalhigh");
json_literal(&s, "%llu", RO(Shm)->SysGate.memInfo.totalhigh);
json_key(&s, "freehigh");
json_literal(&s, "%llu", RO(Shm)->SysGate.memInfo.freehigh);
json_end_object(&s);
}
json_key(&s, "kernel");
{
json_start_object(&s);
json_key(&s, "version");
json_literal(&s, "%u", RO(Shm)->SysGate.kernel.version);
json_key(&s, "major");
json_literal(&s, "%u", RO(Shm)->SysGate.kernel.major);
json_key(&s, "minor");
json_literal(&s, "%u", RO(Shm)->SysGate.kernel.minor);
json_end_object(&s);
}
json_key(&s, "sysname");
json_string(&s, RO(Shm)->SysGate.sysname);
json_key(&s, "release");
json_string(&s, RO(Shm)->SysGate.release);
json_key(&s, "version");
json_string(&s, RO(Shm)->SysGate.version);
json_key(&s, "machine");
json_string(&s, RO(Shm)->SysGate.machine);
json_key(&s, "SubDriver");
{
json_start_object(&s);
if (strlen(RO(Shm)->CS.array) > 0) {
json_key(&s, "Clock_Source");
json_string(&s, RO(Shm)->CS.array);
}
if (strlen(RO(Shm)->SysGate.OS.FreqDriver.Name) > 0) {
json_key(&s, "CPU_Freq");
json_string(&s, RO(Shm)->SysGate.OS.FreqDriver.Name);
}
if (strlen(RO(Shm)->SysGate.OS.FreqDriver.Governor) > 0) {
json_key(&s, "Governor");
json_string(&s, RO(Shm)->SysGate.OS.FreqDriver.Governor);
}
if (strlen(RO(Shm)->SysGate.OS.IdleDriver.Name) > 0) {
json_key(&s, "CPU_Idle");
json_string(&s, RO(Shm)->SysGate.OS.IdleDriver.Name);
}
json_end_object(&s);
}
json_end_object(&s);
}
}
json_key(&s, "Sleep");
{
json_start_object(&s);
json_key(&s, "Interval");
json_literal(&s, "%u", RO(Shm)->Sleep.Interval);
json_key(&s, "pollingWait");
json_literal(&s, "%f", timespecFloat(RO(Shm)->Sleep.pollingWait));
json_key(&s, "ringWaiting");
json_literal(&s, "%f", timespecFloat(RO(Shm)->Sleep.ringWaiting));
json_key(&s, "childWaiting");
json_literal(&s, "%f", timespecFloat(RO(Shm)->Sleep.childWaiting));
json_key(&s, "sliceWaiting");
json_literal(&s, "%f", timespecFloat(RO(Shm)->Sleep.sliceWaiting));
json_end_object(&s);
}
json_key(&s, "ShmName");
json_string(&s, RO(Shm)->ShmName);
json_key(&s, "App");
{
json_start_object(&s);
json_key(&s, "Svr");
json_literal(&s, "%d", RO(Shm)->App.Svr);
json_key(&s, "Cli");
json_literal(&s, "%d", RO(Shm)->App.Cli);
json_key(&s, "GUI");
json_literal(&s, "%d", RO(Shm)->App.GUI);
json_end_object(&s);
}
json_key(&s, "Uncore");
{
json_start_object(&s);
json_key(&s, "Boost");
{
json_start_arr(&s);
for (i = 0; i < UNCORE_RATIO_SIZE; i++) {
json_literal(&s, "%u", RO(Shm)->Uncore.Boost[i]);
}
json_end_arr(&s);
}
json_key(&s, "Bus");
{
json_start_object(&s);
json_key(&s, "Speed");
json_literal(&s, "%u", RO(Shm)->Uncore.Bus.Speed);
json_key(&s, "Rate");
json_literal(&s, "%u", RO(Shm)->Uncore.Bus.Rate);
json_end_object(&s);
}
json_key(&s, "MC");
json_start_arr(&s);
for (i = 0; i < MC_MAX_CTRL; i++) {
{
json_start_object(&s);
json_key(&s, "Channel");
json_start_arr(&s);
{
for (i2 = 0; i2 < MC_MAX_CHA; i2++) {
json_start_object(&s);
json_key(&s, "Timing");
{
json_start_object(&s);
json_key(&s, "tCL");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tCL);
json_key(&s, "tRCD_R");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tRCD_RD);
json_key(&s, "tRCD_W");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tRCD_WR);
json_key(&s, "tRP");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tRP);
json_key(&s, "tRAS");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tRAS);
json_key(&s, "tRRD");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tRRD);
json_key(&s, "tRFC");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tRFC);
json_key(&s, "tWR");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tWR);
json_key(&s, "tRTPr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tRTPr);
json_key(&s, "tWTPr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tWTPr);
json_key(&s, "tFAW");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tFAW);
json_key(&s, "B2B");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.B2B);
json_key(&s, "tCWL");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tCWL);
json_key(&s, "CMD_Rate");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.CMD_Rate);
json_key(&s, "tsrRdTRd");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tsrRdTRd);
json_key(&s, "tdrRdTRd");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tdrRdTRd);
json_key(&s, "tddRdTRd");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tddRdTRd);
json_key(&s, "tsrRdTWr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tsrRdTWr);
json_key(&s, "tdrRdTWr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tdrRdTWr);
json_key(&s, "tddRdTWr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tddRdTWr);
json_key(&s, "tsrWrTRd");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tsrWrTRd);
json_key(&s, "tdrWrTRd");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tdrWrTRd);
json_key(&s, "tddWrTRd");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tddWrTRd);
json_key(&s, "tsrWrTWr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tsrWrTWr);
json_key(&s, "tdrWrTWr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tdrWrTWr);
json_key(&s, "tddWrTWr");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.tddWrTWr);
json_key(&s, "ECC");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].Timing.ECC);
json_end_object(&s);
}
json_key(&s, "DIMM");
json_start_arr(&s);
for (i3 = 0; i3 < MC_MAX_DIMM; i3++) {
json_start_object(&s);
json_key(&s, "Size");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].DIMM[i3].Size);
json_key(&s, "Rows");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].DIMM[i3].Rows);
json_key(&s, "Cols");
json_literal(&s, "%u", RO(Shm)->Uncore.MC[i].Channel[i2].DIMM[i3].Cols);
json_key(&s, "Banks");
json_literal(&s, "%hu", RO(Shm)->Uncore.MC[i].Channel[i2].DIMM[i3].Banks);
json_key(&s, "Ranks");
json_literal(&s, "%hu", RO(Shm)->Uncore.MC[i].Channel[i2].DIMM[i3].Ranks);
json_end_object(&s);
}
json_end_arr(&s);
json_end_object(&s);
}
}
json_end_arr(&s);
json_key(&s, "SlotCount");
json_literal(&s, "%hu", RO(Shm)->Uncore.MC[i].SlotCount);
json_key(&s, "ChannelCount");
json_literal(&s, "%hu", RO(Shm)->Uncore.MC[i].ChannelCount);
json_end_object(&s);
}
}
json_end_arr(&s);
json_key(&s, "CtrlSpeed");
json_literal(&s, "%llu", RO(Shm)->Uncore.CtrlSpeed);
json_key(&s, "CtrlCount");
json_literal(&s, "%llu", RO(Shm)->Uncore.CtrlCount);
json_key(&s, "Unit");
{
json_start_object(&s);
json_key(&s, "Bus_Rate");
json_literal(&s, "%u", (unsigned) RO(Shm)->Uncore.Unit.Bus_Rate);
json_key(&s, "BusSpeed");
json_literal(&s, "%u", (unsigned) RO(Shm)->Uncore.Unit.BusSpeed);
json_key(&s, "DDR_Rate");
json_literal(&s, "%u", (unsigned) RO(Shm)->Uncore.Unit.DDR_Rate);
json_key(&s, "DDRSpeed");
json_literal(&s, "%u", (unsigned) RO(Shm)->Uncore.Unit.DDRSpeed);
json_key(&s, "DDR_Ver");
json_literal(&s, "%u", (unsigned) RO(Shm)->Uncore.Unit.DDR_Ver);
json_key(&s, "DDR_Std");
json_literal(&s, "%u", (unsigned) RO(Shm)->Uncore.Unit.DDR_Std);
json_end_object(&s);
}
json_end_object(&s);
}
json_key(&s, "Proc");
{
json_start_object(&s);
json_key(&s, "Features");
{
json_start_object(&s);
json_key(&s, "Info");
{
json_start_object(&s);
json_key(&s, "Vendor");
{
json_start_object(&s);
json_key(&s, "CRC");
json_literal(&s, "%u", RO(Shm)->Proc.Features.Info.Vendor.CRC);
json_key(&s, "ID");
json_string(&s, RO(Shm)->Proc.Features.Info.Vendor.ID);
json_end_object(&s);
}
json_key(&s, "Hypervisor");
{
json_start_object(&s);
json_key(&s, "CRC");
json_literal(&s, "%u", RO(Shm)->Proc.Features.Info.Hypervisor.CRC);
json_key(&s, "ID");
json_string(&s, RO(Shm)->Proc.Features.Info.Hypervisor.ID);
json_end_object(&s);
}
json_end_object(&s);
}
json_key(&s, "Std");
{
json_start_object(&s);
json_key(&s, "MIDR");
{
json_start_object(&s);
json_key(&s, "Stepping");
{
json_start_object(&s);
snprintf(hexStr, 32, "0x%x", RO(Shm)->Proc.Features.Info.Signature.Stepping);
json_key(&s, "Revision");
json_string(&s, hexStr);
json_end_object(&s);
}
json_key(&s, "Model");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Info.Signature.Model);
json_key(&s, "Family");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Info.Signature.Family);
json_key(&s, "ExtModel");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Info.Signature.ExtModel);
json_key(&s, "ExtFamily");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Info.Signature.ExtFamily);
json_end_object(&s);
}
json_key(&s, "DFR1");
{
json_start_object(&s);
json_key(&s, "EBEP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.EBEP);
json_end_object(&s);
}
json_key(&s, "ISAR0");
{
json_start_object(&s);
json_key(&s, "AES");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.AES);
json_key(&s, "PMULL");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PMULL);
json_key(&s, "SHA1");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SHA1);
json_key(&s, "SHA256");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SHA256);
json_key(&s, "SHA512");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SHA512);
json_key(&s, "SHA3");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SHA3);
json_key(&s, "CRC32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.CRC32);
json_key(&s, "LSE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LSE);
json_key(&s, "LSE128");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LSE128);
json_key(&s, "DP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.DP);
json_key(&s, "SM3");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SM3);
json_key(&s, "SM4");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SM4);
json_key(&s, "RAND");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RAND);
json_key(&s, "TME");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.TME);
json_key(&s, "FHM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FHM);
json_key(&s, "FlagM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FlagM);
json_key(&s, "FlagM2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FlagM2);
json_key(&s, "TLBIOS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.TLBIOS);
json_key(&s, "TLBIRANGE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.TLBIRANGE);
json_key(&s, "RDMA");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RDMA);
json_end_object(&s);
}
json_key(&s, "ISAR1");
{
json_start_object(&s);
json_key(&s, "FCMA");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FCMA);
json_key(&s, "PACIMP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PACIMP);
json_key(&s, "PACQARMA5");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PACQARMA5);
json_key(&s, "LRCPC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LRCPC);
json_key(&s, "LRCPC2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LRCPC2);
json_key(&s, "LRCPC3");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LRCPC3);
json_key(&s, "JSCVT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.JSCVT);
json_key(&s, "FRINTTS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FRINTTS);
json_key(&s, "SPECRES");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SPECRES);
json_key(&s, "SPECRES2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SPECRES2);
json_key(&s, "BF16");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.BF16);
json_key(&s, "EBF16");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.EBF16);
json_key(&s, "I8MM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.I8MM);
json_key(&s, "SB");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SB);
json_key(&s, "XS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.XS);
json_key(&s, "LS64");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LS64);
json_key(&s, "LS64_V");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LS64_V);
json_key(&s, "LS64_ACCDATA");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LS64_ACCDATA);
json_key(&s, "DGH");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.DGH);
json_key(&s, "DPB");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.DPB);
json_key(&s, "DPB2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.DPB2);
json_end_object(&s);
}
json_key(&s, "ISAR2");
{
json_start_object(&s);
json_key(&s, "PACQARMA3");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PACQARMA3);
json_key(&s, "PAuth");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PAuth);
json_key(&s, "EPAC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.EPAC);
json_key(&s, "PAuth2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PAuth2);
json_key(&s, "FPAC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FPAC);
json_key(&s, "FPACCOMBINE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FPACCOMBINE);
json_key(&s, "PAuth_LR");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PAuth_LR);
json_key(&s, "WFxT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.WFxT);
json_key(&s, "RPRES");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RPRES);
json_key(&s, "MOPS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MOPS);
json_key(&s, "HBC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.HBC);
json_key(&s, "SYSREG128");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SYSREG128);
json_key(&s, "SYSINSTR128");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SYSINSTR128);
json_key(&s, "PRFMSLC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PRFMSLC);
json_key(&s, "RPRFM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RPRFM);
json_key(&s, "CSSC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.CSSC);
json_key(&s, "LUT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LUT);
json_key(&s, "ATS1A");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.ATS1A);
json_key(&s, "CONSTPACFIELD");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.CONSTPACFIELD);
json_end_object(&s);
}
json_key(&s, "ISAR3");
{
json_start_object(&s);
json_key(&s, "CPA");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.CPA);
json_key(&s, "FAMINMAX");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FAMINMAX);
json_key(&s, "TLBIW");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.TLBIW);
json_key(&s, "PACM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PACM);
json_key(&s, "LSFE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LSFE);
json_key(&s, "OCCMO");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.OCCMO);
json_key(&s, "LSUI");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.LSUI);
json_key(&s, "FPRCVT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FPRCVT);
json_end_object(&s);
}
json_key(&s, "MMFR0");
{
json_start_object(&s);
json_key(&s, "ECV");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.ECV);
json_key(&s, "FGT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FGT);
json_key(&s, "FGT2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FGT2);
json_key(&s, "ExS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.ExS);
json_key(&s, "BigEnd_EL0");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.BigEnd_EL0);
json_key(&s, "PARange");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PARange);
json_end_object(&s);
}
json_key(&s, "MMFR1");
{
json_start_object(&s);
json_key(&s, "ECBHB");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.ECBHB);
json_key(&s, "PAN");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PAN);
json_key(&s, "VHE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.VHE);
json_end_object(&s);
}
json_key(&s, "MMFR2");
{
json_start_object(&s);
json_key(&s, "VARange");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.VARange);
json_key(&s, "UAO");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.UAO);
json_end_object(&s);
}
json_key(&s, "PFR0");
{
json_start_object(&s);
json_key(&s, "FP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP);
json_key(&s, "SIMD");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD);
json_key(&s, "GIC_vers");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.GIC_vers);
json_key(&s, "GIC_frac");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.GIC_frac);
json_key(&s, "SVE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE);
json_key(&s, "DIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.DIT);
json_key(&s, "RAS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RAS);
json_key(&s, "MPAM_vers");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MPAM_vers);
json_key(&s, "AMU_vers");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.AMU_vers);
json_key(&s, "AMU_frac");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.AMU_frac);
json_key(&s, "RME");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RME);
json_key(&s, "SEL2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SEL2);
json_end_object(&s);
}
json_key(&s, "PFR1");
{
json_start_object(&s);
json_key(&s, "BTI");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.BTI);
json_key(&s, "GCS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.GCS);
json_key(&s, "MTE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MTE);
json_key(&s, "NMI");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.NMI);
json_key(&s, "SME");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME);
json_key(&s, "RNG_TRAP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RNG_TRAP);
json_key(&s, "RAS_frac");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.RAS_frac);
json_key(&s, "MPAM_frac");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MPAM_frac);
json_key(&s, "THE");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.THE);
json_key(&s, "DF2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.DF2);
json_key(&s, "PFAR");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PFAR);
json_end_object(&s);
}
json_key(&s, "ZFR0");
{
json_start_object(&s);
json_key(&s, "SVE_F64MM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_F64MM);
json_key(&s, "SVE_F32MM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_F32MM);
json_key(&s, "SVE_I8MM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_I8MM);
json_key(&s, "SVE_SM4");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_SM4);
json_key(&s, "SVE_SHA3");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_SHA3);
json_key(&s, "SVE_BF16");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_BF16);
json_key(&s, "SVE_EBF16");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_EBF16);
json_key(&s, "SVE_BitPerm");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_BitPerm);
json_key(&s, "SVE_AES");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_AES);
json_key(&s, "SVE_PMULL128");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE_PMULL128);
json_key(&s, "SVE2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SVE2);
json_end_object(&s);
}
json_key(&s, "SMFR0");
{
json_start_object(&s);
json_key(&s, "SME_FA64");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_FA64);
json_key(&s, "SME_LUTv2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_LUTv2);
json_key(&s, "SME2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME2);
json_key(&s, "SME2p1");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME2p1);
json_key(&s, "SME_I16I64");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_I16I64);
json_key(&s, "SME_F64F64");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_F64F64);
json_key(&s, "SME_I16I32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_I16I32);
json_key(&s, "SME_B16B16");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_B16B16);
json_key(&s, "SME_F16F16");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_F16F16);
json_key(&s, "SME_F8F16");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_F8F16);
json_key(&s, "SME_F8F32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_F8F32);
json_key(&s, "SME_I8I32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_I8I32);
json_key(&s, "SME_F16F32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_F16F32);
json_key(&s, "SME_B16F32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_B16F32);
json_key(&s, "SME_BI32I32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_BI32I32);
json_key(&s, "SME_F32F32");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_F32F32);
json_key(&s, "SME_SF8FMA");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_SF8FMA);
json_key(&s, "SME_SF8DP4");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_SF8DP4);
json_key(&s, "SME_SF8DP2");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SME_SF8DP2);
json_end_object(&s);
}
json_key(&s, "MVFR");
{
json_start_object(&s);
json_key(&s, "FP_Round");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_Round);
json_key(&s, "FP_Sh_Vec");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_Sh_Vec);
json_key(&s, "FP_Sqrt");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_Sqrt);
json_key(&s, "FP_Divide");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_Divide);
json_key(&s, "FP_Trap");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_Trap);
json_key(&s, "FP_DP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_DP);
json_key(&s, "FP_SP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_SP);
json_key(&s, "FP_HP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_HP);
json_key(&s, "FP_NaN");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_NaN);
json_key(&s, "FP_FtZ");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_FtZ);
json_key(&s, "FP_Misc");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.FP_Misc);
json_key(&s, "SIMD_Reg");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD_Reg);
json_key(&s, "SIMD_FMA");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD_FMA);
json_key(&s, "SIMD_HP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD_HP);
json_key(&s, "SIMD_SP");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD_SP);
json_key(&s, "SIMD_Int");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD_Int);
json_key(&s, "SIMD_LS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD_LS);
json_key(&s, "SIMD_Misc");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.SIMD_Misc);
json_end_object(&s);
}
json_key(&s, "MISC");
{
json_start_object(&s);
json_key(&s, "HTT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.HTT);
json_key(&s, "TSC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.TSC);
json_key(&s, "MONITOR");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MONITOR);
json_key(&s, "Hybrid");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Hybrid);
json_key(&s, "ACPI");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.ACPI);
json_key(&s, "Hyperv");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Hyperv);
json_end_object(&s);
}
json_end_object(&s);
}
json_key(&s, "MWait");
{
json_start_object(&s);
json_key(&s, "SubCstate_C0_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT0);
json_key(&s, "SubCstate_C1_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT1);
json_key(&s, "SubCstate_C2_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT2);
json_key(&s, "SubCstate_C3_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT3);
json_key(&s, "SubCstate_C4_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT4);
json_key(&s, "SubCstate_C5_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT5);
json_key(&s, "SubCstate_C6_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT6);
json_key(&s, "SubCstate_C7_MWAIT");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.MWait.SubCstate_MWAIT7);
json_end_object(&s);
}
json_key(&s, "Power");
{
json_start_object(&s);
json_key(&s, "DTS");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Power.DTS);
json_key(&s, "PLN");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Power.PLN);
json_key(&s, "PTM");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Power.PTM);
json_key(&s, "HWP_Registers");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.Power.HWP_Reg);
json_end_object(&s);
}
json_key(&s, "PerfMon");
{
json_start_object(&s);
json_key(&s, "Version");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PerfMon.Version);
json_key(&s, "MonCtrs");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PerfMon.MonCtrs);
json_key(&s, "MonWidth");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PerfMon.MonWidth);
json_key(&s, "FixCtrs");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PerfMon.FixCtrs);
json_key(&s, "FixWidth");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PerfMon.FixWidth);
json_key(&s, "CoreCycles");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PerfMon.CoreCycles);
json_key(&s, "InstrRetired");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.PerfMon.InstrRetired);
json_key(&s, "AMU_CG0NC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.AMU.CG0NC);
json_key(&s, "AMU_CG1NC");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Features.AMU.CG1NC);
json_end_object(&s);
}
json_key(&s, "FactoryFreq");
json_literal(&s, "%u", RO(Shm)->Proc.Features.Factory.Freq);
json_key(&s, "InvariantTSC");
json_literal(&s, "%u", RO(Shm)->Proc.Features.InvariantTSC);
json_key(&s, "HyperThreading");
json_literal(&s, "%u", RO(Shm)->Proc.Features.HyperThreading);
json_key(&s, "HTT_Enable");
json_literal(&s, "%u", RO(Shm)->Proc.Features.HTT_Enable);
json_key(&s, "Turbo_Unlock");
json_literal(&s, "%u", RO(Shm)->Proc.Features.Turbo_Unlock);
json_key(&s, "TDP_Unlock");
json_literal(&s, "%u", RO(Shm)->Proc.Features.TDP_Unlock);
json_key(&s, "TDP_Levels");
json_literal(&s, "%u", RO(Shm)->Proc.Features.TDP_Levels);
json_key(&s, "TDP_Cfg_Lock");
json_literal(&s, "%u", RO(Shm)->Proc.Features.TDP_Cfg_Lock);
json_key(&s, "TDP_Cfg_Level");
json_literal(&s, "%u", RO(Shm)->Proc.Features.TDP_Cfg_Level);
json_key(&s, "Turbo_OPP");
json_literal(&s, "%u", RO(Shm)->Proc.Features.Turbo_OPP);
json_key(&s, "TargetRatio_Unlock");
json_literal(&s, "%u", RO(Shm)->Proc.Features.TgtRatio_Unlock);
json_key(&s, "ClockRatio_Unlock");
json_literal(&s, "%u", RO(Shm)->Proc.Features.ClkRatio_Unlock);
json_key(&s, "Uncore_Unlock");
json_literal(&s, "%u", RO(Shm)->Proc.Features.Uncore_Unlock);
json_key(&s, "ACPI_CPPC");
json_literal(&s, "%u", RO(Shm)->Proc.Features.ACPI_CPPC);
json_key(&s, "HWP_Enable");
json_literal(&s, "%u", RO(Shm)->Proc.Features.HWP_Enable);
json_key(&s, "Other_Capable");
json_literal(&s, "%u", RO(Shm)->Proc.Features.Other_Capable);
json_key(&s, "SpecTurboRatio");
json_literal(&s, "%u", RO(Shm)->Proc.Features.SpecTurboRatio);
json_key(&s, "SSBS");
json_literal(&s, "%u", RO(Shm)->Proc.Features.SSBS);
json_end_object(&s);
}
json_key(&s, "HypervisorID");
json_literal(&s, "%llu", RO(Shm)->Proc.HypervisorID);
json_key(&s, "Technology");
{
json_start_object(&s);
json_key(&s, "Hybrid");
json_literal(&s, "%llu", RO(Shm)->Proc.Features.Hybrid);
json_key(&s, "VM");
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.VM);
json_key(&s, "IOMMU");
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.IOMMU);
json_key(&s, "IOMMU_Ver_Major");
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.IOMMU_Ver_Major);
json_key(&s, "IOMMU_Ver_Minor");
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.IOMMU_Ver_Minor);
json_end_object(&s);
}
json_key(&s, "CPU");
{
json_start_object(&s);
json_key(&s, "Count");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.CPU.Count);
json_key(&s, "Online");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.CPU.OnLine);
json_end_object(&s);
}
json_key(&s, "Service");
{
json_start_object(&s);
json_key(&s, "Proc");
json_literal(&s, "%llu", RO(Shm)->Proc.Service.Proc);
json_key(&s, "Service");
{
json_start_object(&s);
json_key(&s, "Core");
json_literal(&s, "%u", (unsigned) RO(Shm)->Proc.Service.Core);
json_key(&s, "Thread");
json_literal(&s, "%d", RO(Shm)->Proc.Service.Thread);
json_key(&s, "Hybrid");
json_literal(&s, "%d", RO(Shm)->Proc.Service.Hybrid);
json_end_object(&s);
}
json_end_object(&s);
}
json_key(&s, "Boost");
{
json_start_arr(&s);
for (i = 0; i < RATIO_SIZE; i++)
{
json_literal(&s, "%u", RO(Shm)->Cpu[RO(Shm)->Proc.Service.Core].Boost[i]);
}
json_end_arr(&s);
}
json_key(&s, "PM_version");
json_literal(&s, "%u", RO(Shm)->Proc.PM_version);
json_key(&s, "Top");
{
json_start_object(&s);
json_key(&s, "Relative");
json_literal(&s, "%u", RO(Shm)->Proc.Top.Rel);
json_key(&s, "Absolute");
json_literal(&s, "%u", RO(Shm)->Proc.Top.Abs);
json_end_object(&s);
}
json_key(&s, "Toggle");
json_literal(&s, "%u", RO(Shm)->Proc.Toggle);
json_key(&s, "FlipFlop");
json_start_arr(&s);
for (i = 0; i < 2; i++) {
json_start_object(&s);
json_key(&s, "Delta");
{
json_start_object(&s);
json_key(&s, "PTSC");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PCLK);
json_key(&s, "PC02");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC02);
json_key(&s, "PC03");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC03);
json_key(&s, "PC04");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC04);
json_key(&s, "PC06");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC06);
json_key(&s, "PC07");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC07);
json_key(&s, "PC08");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC08);
json_key(&s, "PC09");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC09);
json_key(&s, "PC10");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.PC10);
json_key(&s, "MC6");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.MC6);
json_key(&s, "ACCU");
json_start_arr(&s);
for (i2 = 0; i2 < DOMAIN_SIZE; i2++) {
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Delta.ACCU[i2]);
}
json_end_arr(&s);
json_end_object(&s);
}
json_key(&s, "Uncore");
{
json_start_object(&s);
json_key(&s, "FC0");
json_literal(&s, "%llu", RO(Shm)->Proc.FlipFlop[i].Uncore.FC0);
json_end_object(&s);
}
json_end_object(&s);
}
json_end_arr(&s);
json_key(&s, "State");
{
json_start_object(&s);
json_key(&s, "PC02");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC02);
json_key(&s, "PC03");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC03);
json_key(&s, "PC04");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC04);
json_key(&s, "PC06");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC06);
json_key(&s, "PC07");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC07);
json_key(&s, "PC08");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC08);
json_key(&s, "PC09");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC09);
json_key(&s, "PC10");
json_literal(&s, "%f", RO(Shm)->Proc.State.PC10);
json_key(&s, "MC6");
json_literal(&s, "%f", RO(Shm)->Proc.State.MC6);
json_key(&s, "Energy");
json_start_arr(&s);
for (i = 0; i < DOMAIN_SIZE; i++) {
json_literal(&s, "%f", RO(Shm)->Proc.State.Energy[i].Current);
}
json_end_arr(&s);
json_key(&s, "Power");
json_start_arr(&s);
for (i = 0; i < DOMAIN_SIZE; i++) {
json_literal(&s, "%f", RO(Shm)->Proc.State.Power[i].Current);
}
json_end_arr(&s);
json_end_object(&s);
}
json_key(&s, "Avg");
{
json_start_object(&s);
json_key(&s, "Turbo");
json_literal(&s, "%f", RO(Shm)->Proc.Avg.Turbo);
json_key(&s, "C0");
json_literal(&s, "%f", RO(Shm)->Proc.Avg.C0);
json_key(&s, "C3");
json_literal(&s, "%f", RO(Shm)->Proc.Avg.C3);
json_key(&s, "C6");
json_literal(&s, "%f", RO(Shm)->Proc.Avg.C6);
json_key(&s, "C7");
json_literal(&s, "%f", RO(Shm)->Proc.Avg.C7);
json_key(&s, "C1");
json_literal(&s, "%f", RO(Shm)->Proc.Avg.C1);
json_end_object(&s);
}
json_key(&s, "Power");
{
json_start_object(&s);
json_key(&s, "TDP");
json_literal(&s, "%u", RO(Shm)->Proc.Power.TDP);
json_key(&s, "Min");
json_literal(&s, "%u", RO(Shm)->Proc.Power.Min);
json_key(&s, "Max");
json_literal(&s, "%u", RO(Shm)->Proc.Power.Max);
{
enum PWR_DOMAIN pw;
json_key(&s, "PL1");
{
json_start_arr(&s);
for (pw = PWR_DOMAIN(PKG); pw < PWR_DOMAIN(SIZE); pw++)
{
json_literal(&s, "%u", RO(Shm)->Proc.Power.Domain[pw].PWL[PL1]);
}
json_end_arr(&s);
}
json_key(&s, "PL2");
{
json_start_arr(&s);
for (pw = PWR_DOMAIN(PKG); pw < PWR_DOMAIN(SIZE); pw++)
{
json_literal(&s, "%u", RO(Shm)->Proc.Power.Domain[pw].PWL[PL2]);
}
json_end_arr(&s);
}
}
json_key(&s, "EDC");
json_literal(&s, "%u", RO(Shm)->Proc.Power.EDC);
json_key(&s, "TDC");
json_literal(&s, "%u", RO(Shm)->Proc.Power.TDC);
json_key(&s, "Unit");
{
json_start_object(&s);
json_key(&s, "Watts");
json_literal(&s, "%f", RO(Shm)->Proc.Power.Unit.Watts);
json_key(&s, "Joules");
json_literal(&s, "%f", RO(Shm)->Proc.Power.Unit.Joules);
json_key(&s, "Times");
json_literal(&s, "%f", RO(Shm)->Proc.Power.Unit.Times);
json_end_object(&s);
}
json_end_object(&s);
}
json_key(&s, "Current");
{
json_start_object(&s);
json_key(&s, "EDC");
json_literal(&s, "%u", RO(Shm)->Proc.Power.EDC);
json_key(&s, "TDC");
json_literal(&s, "%u", RO(Shm)->Proc.Power.TDC);
json_end_object(&s);
}
json_key(&s, "Brand");
json_string(&s, RO(Shm)->Proc.Brand);
json_key(&s, "Architecture");
json_string(&s, RO(Shm)->Proc.Architecture);
json_key(&s, "Mechanisms");
{
json_start_object(&s);
json_key(&s, "CLRBHB");
json_literal(&s, "%llu", RO(Shm)->Proc.Mechanisms.CLRBHB);
json_key(&s, "CSV2");
json_literal(&s, "%llu", RO(Shm)->Proc.Mechanisms.CSV2);
json_key(&s, "CSV3");
json_literal(&s, "%llu", RO(Shm)->Proc.Mechanisms.CSV3);
json_key(&s, "SSBS");
json_literal(&s, "%llu", RO(Shm)->Proc.Mechanisms.SSBS);
json_end_object(&s);
}
json_end_object(&s);
}
json_key(&s, "Cpu");
json_start_arr(&s);
for (cpu = 0; (cpu < RO(Shm)->Proc.CPU.Count); cpu++)
{
struct FLIP_FLOP *CFlop = &RO(Shm)->Cpu[cpu].FlipFlop[!RO(Shm)->Cpu[cpu].Toggle];
json_start_object(&s);
json_key(&s, "OffLine");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].OffLine);
json_key(&s, "Clock");
{
json_start_object(&s);
json_key(&s, "Q");
json_literal(&s, "%llu", CFlop->Clock.Q);
json_key(&s, "R");
json_literal(&s, "%llu", CFlop->Clock.R);
json_key(&s, "Hz");
json_literal(&s, "%llu", CFlop->Clock.Hz);
json_end_object(&s);
}
json_key(&s, "Toggle");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].Toggle);
json_key(&s, "Boost");
{
json_start_arr(&s);
for (i = 0; i < RATIO_SIZE; i++)
{
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].Boost[i]);
}
json_end_arr(&s);
}
json_key(&s, "Topology");
{
json_start_object(&s);
json_key(&s, "PN");
json_literal(&s, "%d", RO(Shm)->Cpu[cpu].Topology.PN);
json_key(&s, "BSP");
json_literal(&s, "%d", RO(Shm)->Cpu[cpu].Topology.BSP);
json_key(&s, "PackageID");
json_literal(&s, "%d", RO(Shm)->Cpu[cpu].Topology.PackageID);
json_key(&s, "Hybrid_ID");
json_literal(&s, "%d", RO(Shm)->Cpu[cpu].Topology.Cluster.Hybrid_ID);
json_key(&s, "CoreID");
json_literal(&s, "%d", RO(Shm)->Cpu[cpu].Topology.CoreID);
json_key(&s, "ThreadID");
json_literal(&s, "%d", RO(Shm)->Cpu[cpu].Topology.ThreadID);
json_key(&s, "Cache");
json_start_arr(&s);
for (i2 = 0; i2 < CACHE_MAX_LEVEL; i2++) {
json_start_object(&s);
json_key(&s, "Set");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].Topology.Cache[i2].Set);
json_key(&s, "Size");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].Topology.Cache[i2].Size);
json_key(&s, "LineSz");
json_literal(&s, "%hu", RO(Shm)->Cpu[cpu].Topology.Cache[i2].LineSz);
json_key(&s, "Way");
json_literal(&s, "%hu", RO(Shm)->Cpu[cpu].Topology.Cache[i2].Way);
json_key(&s, "Feature");
{
json_start_object(&s);
json_key(&s, "WriteBack");
json_literal(&s, "%hu", RO(Shm)->Cpu[cpu].Topology.Cache[i2].Feature.WriteBack);
json_key(&s, "Inclusive");
json_literal(&s, "%hu", RO(Shm)->Cpu[cpu].Topology.Cache[i2].Feature.Inclusive);
json_end_object(&s);
}
json_end_object(&s);
}
json_end_arr(&s);
json_end_object(&s);
}
json_key(&s, "PowerThermal");
{
json_start_object(&s);
json_key(&s, "Limit");
json_start_arr(&s);
{
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.Limit[SENSOR_LOWEST]);
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.Limit[SENSOR_HIGHEST]);
}
json_end_arr(&s);
json_key(&s, "DutyCycle");
{
json_start_object(&s);
json_key(&s, "ClockMod");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.DutyCycle.ClockMod);
json_key(&s, "Extended");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.DutyCycle.Extended);
json_end_object(&s);
}
json_key(&s, "PowerPolicy");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.PowerPolicy);
json_key(&s, "HWP");
{
json_start_object(&s);
json_key(&s, "Capabilities");
{
json_start_object(&s);
json_key(&s, "Lowest");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Capabilities.Lowest);
json_key(&s, "Efficient");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Capabilities.Most_Efficient);
json_key(&s, "Guaranteed");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Capabilities.Guaranteed);
json_key(&s, "Highest");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Capabilities.Highest);
json_end_object(&s);
}
json_key(&s, "Request");
{
json_start_object(&s);
json_key(&s, "Minimum_Perf");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Request.Minimum_Perf);
json_key(&s, "Maximum_Perf");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Request.Maximum_Perf);
json_key(&s, "Desired_Perf");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Request.Desired_Perf);
json_key(&s, "Energy_Pref");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].PowerThermal.HWP.Request.Energy_Pref);
json_end_object(&s);
}
json_end_object(&s);
}
json_end_object(&s);
}
json_key(&s, "FlipFlop");
json_start_arr(&s);
for (i2 = 0; i2 < 2; i2++) {
json_start_object(&s);
json_key(&s, "Delta");
{
json_start_object(&s);
json_key(&s, "INST");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.INST);
json_key(&s, "C0");
{
json_start_object(&s);
json_key(&s, "UCC");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.C0.UCC);
json_key(&s, "URC");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.C0.URC);
json_end_object(&s);
}
json_key(&s, "C3");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.C3);
json_key(&s, "C6");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.C6);
json_key(&s, "C7");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.C7);
json_key(&s, "TSC");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.TSC);
json_key(&s, "C1");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].FlipFlop[i2].Delta.C1);
json_end_object(&s);
}
json_key(&s, "State");
{
json_start_object(&s);
json_key(&s, "IPS");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.IPS);
json_key(&s, "IPC");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.IPC);
json_key(&s, "CPI");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.CPI);
json_key(&s, "Turbo");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.Turbo);
json_key(&s, "C0");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.C0);
json_key(&s, "C3");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.C3);
json_key(&s, "C6");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.C6);
json_key(&s, "C7");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.C7);
json_key(&s, "C1");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].State.C1);
json_end_object(&s);
}
json_key(&s, "Relative");
{
json_start_object(&s);
json_key(&s, "Ratio");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].Relative.Ratio);
json_key(&s, "Freq");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].Relative.Freq);
json_end_object(&s);
}
json_key(&s, "Absolute");
{
json_start_object(&s);
json_key(&s, "Ratio");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].Absolute.Ratio.Perf);
json_key(&s, "Freq");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].Absolute.Freq);
json_end_object(&s);
}
json_key(&s, "Thermal");
{
json_start_object(&s);
json_key(&s, "Sensor");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Thermal.Sensor);
json_key(&s, "Temp");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Thermal.Temp);
json_key(&s, "Events");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Thermal.Events);
json_key(&s, "Target");
json_start_arr(&s);
{
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Thermal.Param.Offset[THERMAL_TARGET]);
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Thermal.Param.Offset[THERMAL_OFFSET_P1]);
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Thermal.Param.Offset[THERMAL_OFFSET_P2]);
}
json_end_arr(&s);
json_end_object(&s);
}
json_key(&s, "Voltage");
{
json_start_object(&s);
json_key(&s, "VID");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Voltage.VID);
json_key(&s, "Vcore");
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].FlipFlop[i2].Voltage.Vcore);
json_end_object(&s);
}
json_key(&s, "Counter");
{
json_start_object(&s);
json_key(&s, "SMI");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Counter.SMI);
json_key(&s, "NMI");
{
json_start_object(&s);
json_key(&s, "LOCAL");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Counter.NMI.LOCAL);
json_key(&s, "UNKNOWN");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Counter.NMI.UNKNOWN);
json_key(&s, "PCISERR");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Counter.NMI.PCISERR);
json_key(&s, "IOCHECK");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].FlipFlop[i2].Counter.NMI.IOCHECK);
json_end_object(&s);
}
json_end_object(&s);
}
json_end_object(&s);
}
json_end_arr(&s);
json_key(&s, "Frequency");
{
json_start_object(&s);
json_key(&s, "Relative");
json_start_arr(&s);
{
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].Relative.Freq[SENSOR_LOWEST]);
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].Relative.Freq[SENSOR_HIGHEST]);
}
json_end_arr(&s);
json_key(&s, "Absolute");
json_start_arr(&s);
{
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].Absolute.Freq[SENSOR_LOWEST]);
json_literal(&s, "%f", RO(Shm)->Cpu[cpu].Absolute.Freq[SENSOR_HIGHEST]);
}
json_end_arr(&s);
json_end_object(&s);
}
json_key(&s, "SystemRegister");
{
json_start_object(&s);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.FLAGS);
json_key(&s, "FLAGS");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.HCR);
json_key(&s, "HCR");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.SCTLR);
json_key(&s, "SCTLR");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.SCTLR2);
json_key(&s, "SCTLR2");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.EL);
json_key(&s, "EL");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.FPSR);
json_key(&s, "FPSR");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.FPCR);
json_key(&s, "FPCR");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.SVCR);
json_key(&s, "SVCR");
json_string(&s, hexStr);
snprintf(hexStr, 32, "0x%llx", RO(Shm)->Cpu[cpu].SystemRegister.CPACR);
json_key(&s, "CPACR");
json_string(&s, hexStr);
json_end_object(&s);
}
json_key(&s, "Slice");
{
json_start_object(&s);
json_key(&s, "Delta");
{
json_start_object(&s);
json_key(&s, "TSC");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].Slice.Delta.TSC);
json_key(&s, "INST");
json_literal(&s, "%llu", RO(Shm)->Cpu[cpu].Slice.Delta.INST);
json_end_object(&s);
}
json_key(&s, "Counter");
json_start_arr(&s);
for (i3 = 0; i3 < 3; i3++) {
json_start_object(&s);
json_key(&s, "TSC");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].Slice.Counter[i3].TSC);
json_key(&s, "INST");
json_literal(&s, "%u", RO(Shm)->Cpu[cpu].Slice.Counter[i3].INST);
json_end_object(&s);
}
json_end_arr(&s);
json_end_object(&s);
}
json_end_object(&s);
}
json_end_arr(&s);
json_end_object(&s);
}