Windows · AMD Ryzen monitoring and tuning
Private repo · coming soonZenStation
ZenStation is an AMD Ryzen monitoring and tuning app I'm writing for Windows. It shows clocks, temperatures, power and memory timings. It can set power limits, clocks, voltages and P-states. It also tests whether a setting is stable. Normally you would open several separate tools for this.
It runs on Ryzen desktop processors and Ryzen APUs (family 17h and later). I develop and test it on a Ryzen 5 3400G (Picasso) with DDR4. A feature that depends on the processor is switched off when its command or register layout isn't known for that processor.
The app is licensed under the GPL-3.0. The source lives in a private repository for now while I prepare the first release.
Pages
The navigation rail groups the pages into Monitor, Tune and Tools, with Settings and About at the bottom. Every page works from a 1040 × 640 window up to 1920 × 1080.
Overview
Highest and average core clock, temperature (Tctl or Tdie) with its limit, core and SoC voltage, package power. For every core: clock, effective clock, C0 share, P-state, VID, temperature and power. Live telemetry from the SMU PM table, thermal status (HTC, PROCHOT) and ten minutes of history.
Sensors
Every sensor of the CPU, graphics card, motherboard, memory, storage, network and battery in one tree, with minimum and maximum. Clicking a sensor opens a chart of its last ten minutes. Also every PM table value ZenStation can name.
Power
STAPM, PPT, TDC, EDC and temperature limits with the live value and a usage bar. C0, CC1 and CC6 residency per core. There are also readings that don't come from the PM table: package and per-core power from the RAPL energy counters, and SVI2 voltage regulator telemetry.
Memory
Timings decoded from the memory controller (one set per channel), the BIOS memory controller settings (ProcODT, Rtt, drive strengths), the SPD of DDR4 modules (maker, part number, JEDEC and XMP 2.0 profiles, the raw 512 bytes) and a latency and bandwidth test that takes 5 to 8 seconds. The SPD of DDR5 modules isn't read.
CPU tuning
Manual overclock, power, current and temperature limits, PBO scalar, Curve Optimizer (all cores or per core), P-state editing, boost and C-state switches, APU clock limits. Profiles are saved to a file. Loading a profile only fills in the fields, and nothing is sent until you press Apply.
Windows power
The processor settings of the active Windows power plan, hidden ones included, for plugged in and on battery. A section explains whether Windows drives the processor through ACPI P-states or CPPC. The original values are saved before the first change.
System info
Processor (codename, CPUID, microcode, SMU firmware, PM table, fused limits), caches, instruction sets, virtualization, graphics, memory modules, motherboard and BIOS, operating system. Everything can be copied as text with one click.
Stability
Stress test on all cores at once or one core at a time, with floating-point, integer, cache and memory loads. Every block of work checks its result against a reference, so a single wrong calculation counts as an error. Hardware errors (WHEA) logged by Windows are listed with the core and the unit.
Debug
Send a message on a chosen SMU mailbox (with a named message catalog and risk classes), read SMN, MSR and CPUID, watch up to 256 SMN registers live, and view the raw PM table.
Settings and About
Six themes, refresh intervals, start with Windows, tray icon, profile automation and update channel. The About page shows the version, license, a system summary and the open-source components in use.
How it reaches the hardware
It uses a single kernel driver to reach the processor, the signed PawnIO (opens in a new tab) driver. Without PawnIO the app starts, but it can't read the processor.
Processor detection, SMU mailboxes, the PM table and memory controller decoding go through ZenStates-Core (opens in a new tab). Other sensors, such as the graphics card, motherboard and drives, are read with LibreHardwareMonitorLib (opens in a new tab).
All hardware access runs one call after another on a single dedicated thread. Both libraries pin the calling thread to a core while they read per-core registers. If two reads overlap, stale values can mix in. One thread removes that problem.
Safety
Tuning can freeze a PC, and a wrong voltage can damage hardware. So I made sure every write is deliberate and can be traced.
- Nothing on the tuning pages is written without confirmation. The dialog lists every register, SMU message and value that will be sent.
- An intent line is written to disk before each hardware write, and a result line after it. Even after a freeze, the log shows the last write that was attempted.
- All changes are volatile. A restart brings back the BIOS settings. ZenStation never writes the BIOS, the SPD or any other persistent setting. The only persistent changes are Windows power plan values and the sign-in task, and both can be undone.
- Unknown means off. Controls whose message or register layout isn't verified for the processor are disabled, with the reason shown next to them.
- Profile automation is off by default. When it's on, it only re-applies power, current, temperature and APU clock limits, never an overclock, voltages or Curve Optimizer. If a session ends unexpectedly, automation pauses itself.
The hard parts
Leaving manual overclock on Picasso
On Raven Ridge, Picasso and Dali APUs (such as the Ryzen 5 2400G and 3400G), setting an all-core clock puts the processor into manual overclock mode, and there is no verified way out of it. On these processors MP1 message
0x58enters the mode; it doesn't leave it. An earlier version of the README said otherwise, and that was wrong. Now “Restore automatic boost” sends message0x3Fwith argument 0 and then runs the clock override detector. If the cores are still pinned, a restart is the only fix, and the app says so.Names in the PM table
The SMU's PM table holds hundreds of values, and which index means what depends on the processor and the table version. ZenStation shows where each name comes from: verified on real hardware, a published table map, a reference, the CPU module or the sensor map. Values known only from a reference stay hidden unless you turn them on.
SVI2 currents
The current scale of the SVI2 telemetry depends on the motherboard. That's why current and power calculated from SVI2 are labelled as estimates, with a row that shows whether the scale matches the PM table.
Limits of the stress test
The stress loads are ZenStation's own managed code (AVX2 and FMA). On a Ryzen 5 3400G at 2.84 GHz the heavy floating-point load draws about 38–39 W. A marginal setting that only fails under a native AVX2 power virus can pass it. The app says this too. A native load may come later.
Signed updates
ZenStation can update itself. The update information on the server is signed with ECDSA P-256. The app first checks the signature with the key built into it, then the package size, its SHA-256 hash, the version of the new exe and the .NET runtime it needs.
An update is only installed when the app lives in a folder that only administrators can change, such as C:\Program Files\ZenStation. ZenStation always runs as administrator, so updating itself from a folder that ordinary programs can change wouldn't be safe. The updater keeps a backup of the files it replaces and rolls back if something fails.
The update server isn't set up yet. Until its address and signing key are built in, every build says “Update server not configured yet” and never contacts a server.
Status and what's next
The source is private for now. For the first release, the update server, its domain and the signing key are still missing. These items are postponed but still on my list:
- .NET 8 support ends on 10 November 2026. Moving to .NET 10 LTS needs a test of every page in all six themes.
- A native AVX2 stress load with error detection and per-core pinning.
- A read-only self-test that checks the PM table map against live values.
- Reading the module temperature from the DIMM sensor during the SPD read.
- Detecting resume from Modern Standby as well.
Built on
ZenStation builds on many open-source projects. All of them are listed with their licenses on the app's About page.
- ZenStates-Core (opens in a new tab) (irusanov): the CPU module
- LibreHardwareMonitor (opens in a new tab): the sensor engine
- PawnIO (opens in a new tab) (namazso): the hardware driver and its modules
- RyzenAdj (opens in a new tab): PM table offsets
- ZenTimings (opens in a new tab), ZenStates (opens in a new tab) and SMUDebugTool (opens in a new tab) (irusanov): memory controller tables and reference
- SPD-Reader-Writer (opens in a new tab): the DDR4 SPD field map
- PboStudio (opens in a new tab): the WHEA watcher and the self-checking stress load
- G-Helper (opens in a new tab): power plan reading and writing, and the sign-in task
- zenpower3 (opens in a new tab) and zenmonitor (opens in a new tab): SVI2 current scale and RAPL registers