Frequenzanzeige: Datenzugang gelöst, Umrechnung nicht — bewusst abgebrochen

IOReport liefert je Kern die Verweilzeit in jeder Leistungsstufe, genau wie
gebraucht: MCPU00 bis MCPU14, 17 Zustände, saubere Deltas zwischen zwei
Messungen.

Die Frequenz zu einer Stufe steht dort aber nicht. Sie muss aus den
voltage-states-Tabellen im IODeviceTree kommen, und die passen nicht: der Kanal
hat 16 Leistungsstufen, keine Tabelle hat 16 Einträge. Dazu sind die Einheiten
uneinheitlich — voltage-states8 enthält echte Hertz (732–2472 MHz),
voltage-states5 dagegen Paare wie (50103, 635), die in keiner Einheit sinnvolle
Taktraten ergeben.

Ab hier wäre es Reverse Engineering undokumentierter Firmware-Tabellen, deren
Format sich zwischen Chip-Generationen ändert — genau die Sorte Code, die beim
nächsten Mac still falsche Zahlen anzeigt statt zu scheitern. Dafür ist eine
Zusatzangabe im Popover zu wenig, solange Phase 6 bis 9 offen sind.

Die halbfertige Implementierung ist entfernt statt auskommentiert: nicht
verdrahteter Code, der nil liefert, verrottet und täuscht später
Vollständigkeit vor. Der Stand samt Fortsetzungsweg steht in
docs/spikes/F-frequenz.md.
This commit is contained in:
Guido Schmit
2026-08-10 22:36:39 +02:00
parent 7fcca61d70
commit aa8e903037
3 changed files with 739 additions and 660 deletions

View File

@@ -1,7 +1,9 @@
{ {
"sourceLanguage" : "en", "sourceLanguage" : "en",
"strings" : { "strings" : {
"": {}, "" : {
},
"%lld" : { "%lld" : {
"comment" : "A label displaying the speed of a fan. The argument is the speed of the fan, in revolutions per minute.", "comment" : "A label displaying the speed of a fan. The argument is the speed of the fan, in revolutions per minute.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
@@ -63,6 +65,7 @@
} }
}, },
"metric.cpu.perCore" : { "metric.cpu.perCore" : {
"extractionState" : "stale",
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
@@ -241,18 +244,194 @@
} }
} }
}, },
"popover.temperature": { "popover.battery.calculating" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Temperatur" "value" : "Wird berechnet …"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Temperature" "value" : "Calculating…"
}
}
}
},
"popover.battery.charging" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lädt mit"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Charging at"
}
}
}
},
"popover.battery.condition" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zustand"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Condition"
}
}
}
},
"popover.battery.cycles" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ladezyklen"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Cycles"
}
}
}
},
"popover.battery.draining" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verbrauch"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Draw"
}
}
}
},
"popover.battery.health" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kapazität"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Capacity"
}
}
}
},
"popover.battery.limitComing" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Das Ladelimit kommt mit dem privilegierten Helfer. Der zuständige SMC-Key ist auf diesem Modell noch nicht identifiziert — siehe docs/spikes/A-smc.md."
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "The charge limit arrives with the privileged helper. The relevant SMC key is not yet identified on this model — see docs/spikes/A-smc.md."
}
}
}
},
"popover.battery.none" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kein Akku gefunden"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "No battery found"
}
}
}
},
"popover.battery.pluggedIn" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Am Netzteil"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "On adapter"
}
}
}
},
"popover.battery.remaining" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "verbleibend"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "remaining"
}
}
}
},
"popover.battery.untilFull" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "bis voll"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "until full"
}
}
}
},
"popover.battery.voltage" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Spannung"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Voltage"
} }
} }
} }
@@ -273,134 +452,6 @@
} }
} }
}, },
"popover.power": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Leistung"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Power"
}
}
}
},
"popover.power.cpu": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "CPU"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "CPU"
}
}
}
},
"popover.power.display": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Anzeige"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Display"
}
}
}
},
"popover.power.total": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Gesamt"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Total"
}
}
}
},
"popover.power.adapter": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Netzteil"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Adapter"
}
}
}
},
"popover.perCore": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Je Kern"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Per core"
}
}
}
},
"popover.processes": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Größte Verbraucher"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Top consumers"
}
}
}
},
"popover.memory.used": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Belegt"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Used"
}
}
}
},
"popover.memory.app" : { "popover.memory.app" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
@@ -417,22 +468,6 @@
} }
} }
}, },
"popover.memory.wired": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Reserviert"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Wired"
}
}
}
},
"popover.memory.compressed" : { "popover.memory.compressed" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
@@ -497,194 +532,162 @@
} }
} }
}, },
"popover.battery.condition": { "popover.memory.used" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Zustand" "value" : "Belegt"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Condition" "value" : "Used"
} }
} }
} }
}, },
"popover.battery.health": { "popover.memory.wired" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Kapazität" "value" : "Reserviert"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Capacity" "value" : "Wired"
} }
} }
} }
}, },
"popover.battery.cycles": { "popover.perCore" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Ladezyklen" "value" : "Je Kern"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Cycles" "value" : "Per core"
} }
} }
} }
}, },
"popover.battery.remaining": { "popover.power" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "verbleibend" "value" : "Leistung"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "remaining" "value" : "Power"
} }
} }
} }
}, },
"popover.battery.untilFull": { "popover.power.adapter" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "bis voll" "value" : "Netzteil"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "until full" "value" : "Adapter"
} }
} }
} }
}, },
"popover.battery.pluggedIn": { "popover.power.cpu" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Am Netzteil" "value" : "CPU"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "On adapter" "value" : "CPU"
} }
} }
} }
}, },
"popover.battery.calculating": { "popover.power.display" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Wird berechnet …" "value" : "Anzeige"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Calculating…" "value" : "Display"
} }
} }
} }
}, },
"popover.battery.charging": { "popover.power.total" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Lädt mit" "value" : "Gesamt"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Charging at" "value" : "Total"
} }
} }
} }
}, },
"popover.battery.draining": { "popover.processes" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Verbrauch" "value" : "Größte Verbraucher"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Draw" "value" : "Top consumers"
} }
} }
} }
}, },
"popover.battery.voltage": { "popover.temperature" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Spannung" "value" : "Temperatur"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Voltage" "value" : "Temperature"
}
}
}
},
"popover.battery.none": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Kein Akku gefunden"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "No battery found"
}
}
}
},
"popover.battery.limitComing": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Das Ladelimit kommt mit dem privilegierten Helfer. Der zuständige SMC-Key ist auf diesem Modell noch nicht identifiziert — siehe docs/spikes/A-smc.md."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "The charge limit arrives with the privileged helper. The relevant SMC key is not yet identified on this model — see docs/spikes/A-smc.md."
} }
} }
} }

View File

@@ -1,51 +1,34 @@
{ {
"sourceLanguage" : "en", "sourceLanguage" : "en",
"strings" : { "strings" : {
"network.name": { "network.addresses" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Netzwerk" "value" : "Adressen"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Network" "value" : "Addresses"
} }
} }
} }
}, },
"network.wifi.connected": { "network.download" : {
"comment": "Wenn der Netzwerkname mangels Ortungsberechtigung fehlt",
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "WLAN verbunden" "value" : "Download"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Wi-Fi connected" "value" : "Download"
}
}
}
},
"network.offline": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Nicht verbunden"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Not connected"
} }
} }
} }
@@ -82,6 +65,22 @@
} }
} }
}, },
"network.field.ipv6" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "IPv6"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "IPv6"
}
}
}
},
"network.field.router" : { "network.field.router" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
@@ -98,34 +97,34 @@
} }
} }
}, },
"network.download": { "network.name" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Download" "value" : "Netzwerk"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Download" "value" : "Network"
} }
} }
} }
}, },
"network.upload": { "network.offline" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Upload" "value" : "Nicht verbunden"
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Upload" "value" : "Not connected"
} }
} }
} }
@@ -162,103 +161,8 @@
} }
} }
}, },
"network.addresses": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Adressen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Addresses"
}
}
}
},
"network.transferred": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Übertragen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Transferred"
}
}
}
},
"network.total.received": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Empfangen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Received"
}
}
}
},
"network.total.sent": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Gesendet"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Sent"
}
}
}
},
"network.field.ipv6": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "IPv6"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "IPv6"
}
}
}
},
"network.vpn.active": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Verkehr läuft durch einen Tunnel"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Traffic goes through a tunnel"
}
}
}
},
"network.perProcess.unavailable" : { "network.perProcess.unavailable" : {
"extractionState" : "stale",
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
@@ -274,6 +178,22 @@
} }
} }
}, },
"network.processes" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Je Programm"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Per app"
}
}
}
},
"network.public" : { "network.public" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
@@ -306,22 +226,6 @@
} }
} }
}, },
"network.public.hint": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Dafür fragt Onyx einen fremden Dienst — standardmäßig aus, weil ein Systemmonitor nicht ungefragt nach draußen telefonieren sollte."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "This asks an external service — off by default, because a system monitor shouldn't phone home unasked."
}
}
}
},
"network.public.failed" : { "network.public.failed" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
@@ -338,18 +242,115 @@
} }
} }
}, },
"network.processes": { "network.public.hint" : {
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Je Programm" "value" : "Dafür fragt Onyx einen fremden Dienst — standardmäßig aus, weil ein Systemmonitor nicht ungefragt nach draußen telefonieren sollte."
} }
}, },
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "state" : "translated",
"value": "Per app" "value" : "This asks an external service — off by default, because a system monitor shouldn't phone home unasked."
}
}
}
},
"network.total.received" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Empfangen"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Received"
}
}
}
},
"network.total.sent" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Gesendet"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sent"
}
}
}
},
"network.transferred" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Übertragen"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Transferred"
}
}
}
},
"network.upload" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upload"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Upload"
}
}
}
},
"network.vpn.active" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Verkehr läuft durch einen Tunnel"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Traffic goes through a tunnel"
}
}
}
},
"network.wifi.connected" : {
"comment" : "Wenn der Netzwerkname mangels Ortungsberechtigung fehlt",
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "WLAN verbunden"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Wi-Fi connected"
} }
} }
} }

75
docs/spikes/F-frequenz.md Normal file
View File

@@ -0,0 +1,75 @@
# Spike F — Taktfrequenzen über IOReport
Untersucht am 10.08.2026 auf Mac17,9 (M5 Pro). **Ergebnis: teilweise gelöst,
bewusst abgebrochen.** Der Datenzugang steht, die Umrechnung fehlt.
## Was funktioniert
`libIOReport` ist ohne Entitlement nutzbar; alle benötigten Symbole sind
vorhanden und über `dlsym` auflösbar:
```
IOReportCopyChannelsInGroup IOReportCreateSubscription
IOReportCreateSamples IOReportCreateSamplesDelta
IOReportStateGetCount IOReportStateGetResidency
IOReportStateGetNameForIndex
```
Der Ablauf liefert verwertbare Daten:
```
Kanäle geholt: 127 (Gruppe "CPU Stats")
Delta-Kanäle: 127
CPU Core Performance States/MCPU00 Zustände=17
IDLE:17345943 V0P14:3559973 V1P13:361673 V2P12:561938 V3P11:322658 …
```
Also je Kern (MCPU00 … MCPU14) die Verweilzeit in jeder Leistungsstufe seit der
letzten Messung. Genau das, was man für einen gewichteten Mittelwert braucht.
## Woran es scheitert
Die Frequenz zu einer Stufe steht nicht im Kanal. Sie muss aus den
`voltage-states`-Tabellen im IODeviceTree kommen — und die Zuordnung geht nicht
auf:
| Tabelle | Einträge | Als Hz gelesen |
|---|---|---|
| `voltage-states8` | 26 | 7322472 MHz — plausibel |
| `voltage-states9`, `14`, `31` | 13 | 3381620 MHz — plausibel, passt zur GPU |
| `voltage-states5` | 20 | 0 MHz — Paare wie (50103, 635) |
| `voltage-states22`, `23` | 15 | 0 MHz |
Zwei Probleme übereinander:
1. **Die Stufenzahl passt nicht.** Der Kanal hat 17 Zustände, davon einer
Leerlauf, also 16 Leistungsstufen. Keine Tabelle hat 16 Einträge.
2. **Die Einheiten sind uneinheitlich.** `voltage-states8` enthält echte Hertz.
`voltage-states5` enthält Paare, deren erster Wert von 50103 abwärts läuft,
während der zweite (635, 685, 710 …) nach Millivolt aussieht. Weder Hertz
noch Kilohertz noch Megahertz ergeben daraus sinnvolle Taktraten.
Die Zustandsnamen (`V0P14`, `V1P13`, `V2P12` …) kodieren offenbar Spannungs-
und P-Zustands-Index getrennt. Ein sauberer Weg führte vermutlich über diese
Namen statt über die Position im Kanal.
## Warum hier abgebrochen wurde
Ab diesem Punkt ist es Reverse Engineering undokumentierter Firmware-Tabellen,
deren Format sich zwischen Chip-Generationen ändert — genau die Sorte Code, die
beim nächsten Mac still falsche Zahlen anzeigt statt zu scheitern. Der Aufwand
steht nicht im Verhältnis zu einer Zusatzangabe im Popover, solange Phase 6 bis
9 noch offen sind.
Die halbfertige Implementierung wurde entfernt statt auskommentiert: nicht
verdrahteter Code, der `nil` zurückgibt, verrottet und täuscht später
Vollständigkeit vor. Alles Nötige steht hier.
## Wenn es doch gebaut wird
1. Zustandsnamen zerlegen (`V<spannung>P<stufe>`) statt die Position zu benutzen.
2. Die Tabelle über den P-Index adressieren, nicht über die Einträgezahl.
3. Gegen `powermetrics --samplers cpu_power` gegenprüfen — das ist die einzige
verlässliche Referenz.
4. Bei fehlender Zuordnung **nichts** anzeigen. Eine falsche Frequenz ist
schlechter als keine.