Vier Annahmen des Plans vor jedem Implementierungscode geprüft:
A (SMC): Lüftersteuerung bestätigt — F0md/F1md (klein!) als Auto/Manuell-
Umschalter, F0Tg als Ziel, Grenzen aus F0Mn/F0Mx. SMC-Integer sind
little-endian, nicht big-endian wie im verbreiteten Intel-Beispielcode.
Ladelimit: CHWA/CH0B/CH0C/bfE0/bfF0 existieren auf Mac17,9 nicht.
Key noch nicht identifiziert, deshalb smc-diff.sh für eine
Differenzmessung ohne jeden Schreibzugriff.
B (Media): mediaremote-adapter läuft unter 26.6.1, aus dem Quellcode gebaut.
Liefert vollständige Metadaten inkl. Cover aus Google Chrome — der
Fall, den AppleScript nicht erreicht.
C (Audio): Process Tap + privates Aggregate-Device liefern echte Samples
(469 Callbacks/5 s, 0 stille Puffer). Konflikt gefunden: SoundSource
6.1.1 mit ARK.driver ist bereits installiert.
D (Group): App-Group-Container ist aus einem nicht-sandboxed Prozess erreichbar.
Damit trägt die Sandbox-Entscheidung, die Bridge-App entfällt.
Spikes sind Wegwerfcode zur Verifikation, kein Produktionscode.
63 lines
2.3 KiB
Bash
Executable File
63 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
# Spike A, Teil 2 — SMC-Differenzmessung
|
|
#
|
|
# Identifiziert den Ladelimit-Key, ohne je in den SMC zu schreiben: zwei
|
|
# vollständige Dumps vergleichen, zwischen denen macOS selbst die Ladegrenze
|
|
# umgestellt hat.
|
|
#
|
|
# Ablauf:
|
|
# ./smc-diff.sh vorher # Ladegrenze AUS
|
|
# (in den Systemeinstellungen umschalten, ~30 s warten)
|
|
# ./smc-diff.sh nachher # Ladegrenze AN
|
|
# ./smc-diff.sh vergleich
|
|
#
|
|
# Lesend. Dieses Skript ruft nur smc-dump auf, das keinen Schreibpfad besitzt.
|
|
|
|
set -euo pipefail
|
|
|
|
DIR="${TMPDIR:-/tmp}/onyx-smc-diff"
|
|
DUMP="${DUMP:-/tmp/smc-dump}"
|
|
mkdir -p "$DIR"
|
|
|
|
if [[ ! -x "$DUMP" ]]; then
|
|
echo "smc-dump nicht gefunden unter $DUMP" >&2
|
|
echo "Bauen mit: xcrun swiftc -O Spikes/smc-dump.swift -o /tmp/smc-dump" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Werte, die sich ohnehin ständig ändern — sie würden die Differenz zumüllen.
|
|
# Temperaturen (T*), Lüfter (F*), Leistung (P*), Spannungen/Ströme und Zähler.
|
|
RAUSCHEN='^ (T|F[0-9]|P[A-Z]|V|I|B0A|B0R|BRSC|CH0V|CHA|CHB|CHI[0-9]|CHNI|MSS|D[0-9])'
|
|
|
|
snapshot() {
|
|
"$DUMP" --all | awk '/ALLE KEYS/,0' | grep -E '^ [A-Za-z#]' \
|
|
| grep -vE "$RAUSCHEN" | sort > "$DIR/$1.txt"
|
|
echo "→ $DIR/$1.txt ($(wc -l < "$DIR/$1.txt" | tr -d ' ') Keys nach Rauschfilter)"
|
|
}
|
|
|
|
case "${1:-}" in
|
|
vorher|nachher)
|
|
echo "Nehme Snapshot '$1' auf …"
|
|
snapshot "$1"
|
|
[[ "$1" == "vorher" ]] && echo "Jetzt die Ladegrenze in den Systemeinstellungen umschalten, dann: $0 nachher"
|
|
;;
|
|
vergleich)
|
|
for f in vorher nachher; do
|
|
[[ -f "$DIR/$f.txt" ]] || { echo "Snapshot '$f' fehlt." >&2; exit 1; }
|
|
done
|
|
echo "Geänderte Keys zwischen 'vorher' und 'nachher':"
|
|
echo "────────────────────────────────────────────────────────────────"
|
|
if diff "$DIR/vorher.txt" "$DIR/nachher.txt" | grep -E '^[<>]'; then
|
|
echo
|
|
echo "Ein Key, der hier auftaucht und nach CH*/bf*/AC* aussieht, ist der Kandidat."
|
|
else
|
|
echo "Keine Unterschiede — wurde die Einstellung wirklich umgeschaltet?"
|
|
echo "Manche Änderungen brauchen bis zu einer Minute, bis der SMC sie übernimmt."
|
|
fi
|
|
;;
|
|
*)
|
|
sed -n '2,14p' "$0" | sed 's|^# \{0,1\}||'
|
|
exit 1
|
|
;;
|
|
esac
|