mirror of
https://github.com/cyring/CoreFreq.git
synced 2025-07-23 04:12:59 +02:00
1530 lines
54 KiB
C
1530 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, "DSU");
|
|
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.DSU);
|
|
json_key(&s, "CMN");
|
|
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.CMN);
|
|
json_key(&s, "CCN");
|
|
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.CCN);
|
|
json_key(&s, "CCI");
|
|
json_literal(&s, "%llu", RO(Shm)->Proc.Technology.CCI);
|
|
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, "MPID");
|
|
json_literal(&s, "%d", RO(Shm)->Cpu[cpu].Topology.MPID);
|
|
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);
|
|
}
|