Releases: Paradoxdov/memforge
v0.4.67 — display fixes
Fixed garbled / overlapping text on firmware that misreports its framebuffer right after a mode switch (seen on MSI MS-7D75 + RX 7900 at 3440x1440): the renderer now clamps to the firmware's settled active-mode resolution, even when a resolution is pinned in quantai.ini, and re-checks just before the test screen is drawn.
On small framebuffers (e.g. 800x600) the RAM and BIOS info lines are now compacted so they don't clip at the right edge; the full detail remains in the COVERAGE panel, the test-running header, and memforge2.log.
Download MemForge2.efi and copy it to EFI/BOOT/loader.efi on a FAT32 USB stick.
v0.4.66 — resolution override fix (quantai.ini parsed before GOP picker)
Fixes the [Display] Width/Height override in quantai.ini being ignored: the ini was parsed AFTER the screen mode was already chosen, so a pinned resolution never took effect. The ini is now read at the very start, before mode selection.
Validated on OptiPlex 9020 (boots, renders, all tests pass, no init-order regression). If a stuck/wrong resolution made the tool look unchanged on some firmware, pinning Width/Height now actually applies.
Download MemForge2.efi, copy to EFI/BOOT/loader.efi on a FAT32 USB.
v0.4.65 — multi-platform address-map table
Bad-stick attribution now uses a TABLE of address-mapping functions instead of one hardcoded map. The probe accepts only the row that validates against the live hardware timing, so wrong rows are skipped (never mis-attribute) and the tool falls back to SMBIOS Type-20 on unrecognised platforms.
Coverage: Intel DDR3 2ch/2DIMM (IvyBridge/Haswell, validated) and 2ch (SandyBridge). DDR4/DDR5/Skylake+/AMD fall back safely until validated on that hardware.
Download MemForge2.efi, copy to EFI/BOOT/loader.efi on a FAT32 USB.
v0.4.64 — interleave-aware bad-stick attribution
Names the faulty DIMM by SPD serial and the EXACT slot, recovered from a row-conflict timing side-channel (DRAMA-style) on Haswell DDR3 — instead of the SMBIOS Type-20 guess that mislabelled it under channel interleave. Verdict, errors-by-DIMM and the log filename now track the bad stick across slot swaps. Validated on OptiPlex 9020/7020 (known-bad Samsung 214649E0 named correctly in DIMM2 and again in DIMM4 after a move). Also fixes serial/date hex formatting.
Download MemForge2.efi, copy to EFI/BOOT/loader.efi on a FAT32 USB.
v0.4.52 - INI buffer fix ([Display] parses) + per-run named logs
v0.4.52 — INI buffer fix ([Display] now parses) + per-run named logs
Fixes
- INI parser no longer truncates the file. The read buffer was 4 KB, but the
shipped defaultquantai.iniis ~5.6 KB of comments — so the entire
[Display]section (EnableAA/Width/Height/FontScale/ForceBlt)
sat past byte 4095 and was never parsed. Anyone pinning a resolution (or any
[Display]key) on the full default ini was silently ignored. Buffer is now
16 KB. Combined with v0.4.48's "trust the pinned resolution" logic, a
Width=/Height=override on AMD GOP now actually takes effect.
New
- Per-run named log/report copies. Each run now also saves
mf_run<N>_<board>_<slot>_<serial>_<verdict>.logand.json, so successive
runs (e.g. testing each stick in each slot) no longer overwrite each other.
The livememforge2.log/report.jsonremain as the "latest" pair. - Read-only re-read probe on recorded errors: each error record now also logs
the value re-read from cache and again after a cache flush, to distinguish a
transient/cache artifact from a value genuinely wrong in DRAM. - Early-log capture: log lines emitted before the log file opens (GOP picker,
INI, MP services) are now buffered and written once the file opens, instead of
being dropped.
Download MemForge2.efi, copy to EFI/BOOT/loader.efi on a FAT32 USB.
v0.4.48 - GOP picker honors ini-pinned resolution (AMD GOP)
v0.4.48 — GOP picker honors ini-pinned resolution on AMD GOP
Fixes the [Display] Width/Height override being ignored on AMD GOP
(GitHub issue #3, RoVRy — MSI AM5 + RX 7900 / RDNA3, ultrawide).
On RDNA3 firmware can leave FrameBufferSize stale at the old allocation
even after a real mode switch. The strict fbsz >= need_bytes check then
judged the switch "faked" and fell back to a lying 800×600 — so a resolution
pinned in quantai.ini never took effect. RoVRy flagged exactly this; fbsz
alone is not a reliable signal on RDNA3.
- Stall ~50 ms after
SetModeso AMD GOP settles before we verify. - Pinned
Width/Heightare now trusted: the requested geometry is
accepted even whenfbszlooks too small, and the late re-check no longer
downgrades it back to the boot mode. - Auto-pick of the largest mode keeps the strict check — that path still
guards against firmware that fakes a big switch into a small buffer. - New diagnostic line logs live
Mode->Info(resolution/ppsl) +
FrameBufferSizeright after the switch, so a field log shows both signals
at once.
If a board genuinely can't output the pinned resolution before the OS loads,
comment the lines out and the auto-picker will choose a mode it can confirm.
Download MemForge2.efi, copy to EFI/BOOT/loader.efi on a FAT32 USB.
v0.4.47 - BW Soak one thread per physical core
v0.4.47 — BW Soak: one thread per physical core (+ interruptible write)
Fixes the BW Soak core-stall seen on a 12-core/24-thread Ryzen 9 7900X: all 12
SMT-sibling threads were getting falsely marked "stalled". They weren't broken
— two SMT siblings streaming vmovntdq fight over the core's write-combining
buffers and one starves. SMT adds no memory bandwidth anyway.
- Root fix: BW Soak now dispatches ONE thread per physical core. SMT
topology is read once at init via MP ServicesGetProcessorInfo().Location .Thread; unknown topology or a sibling-BSP disables it (degrades to
all-cores). The buffer is split over the active cores only, so coverage stays
full. Parked siblings are skipped in dispatch and in the wait loop. - Robust symptom fix: the streaming-write asm was non-interruptible, so a
slow core couldn't bail and got force-killed. It's now chunked (~1 MB) with a
deadline-flag check between chunks. - Hard
n==0guard in the write kernel (a zero-length parked slot would
otherwise underflow the loop counter and stream forever). - The give-up log line is reworded neutrally — it also fires for a genuinely
hung worker, so it no longer claims a single cause.
Log-only marker when active: [BW] physical-cores-only: N core(s), skipping M SMT sibling(s). No change to any test's coverage or pass/fail logic. Carries
forward all fixes from v0.4.43–v0.4.46.
Download MemForge2.efi, copy to EFI/BOOT/BOOTX64.EFI on a FAT32 USB (the
file the firmware actually boots from removable media).
v0.4.46 - [IMC] read-only register dump (decode groundwork)
v0.4.46 — [IMC] read-only memory-controller register dump (decode groundwork)
Groundwork toward naming the EXACT bad DIMM slot WITHOUT a swap, on supported
chipsets. First node of a tiered decoder: registers/published address functions
where available · timing reverse-engineering + guided swap (v0.4.44) as the
universal backstop · honest reliability flag (v0.4.45) everywhere.
This version only DUMPS and cross-checks — no decode yet, by design: gather real
register values from field machines first, then write the decode validated
against ground truth.
imc_dump() (read-only, at init after SPD, like the existing [SPD]/[MCA] lines):
- gate on host-bridge PCI 0:0:0 vendor/device; per-chipset table (Haswell client
first, one row per generation); - read MCHBAR base (PCI 0x48/0x4C, enable bit, 32 KiB window); disabled/locked/
all-FF logs the Tier-4 swap path instead; - read ONLY the named MAD_DIMM_CH0/CH1 registers (per Linux ie31200_edac) →
per-channel DIMM size/rank. Deliberately NOT a blind MCHBAR sweep (an unknown
MMIO register could be clear-on-read); - self-consistency gate: MAD size total vs SMBIOS total — a mismatch means the
base/offset/stepping is wrong and the decode would be untrustworthy, caught
at the dump.
Non-Intel / unknown bridge logs the Tier-4 fallback honestly. Log-only, no change
to the tests. Capture an [IMC] line from a run and it answers in one go: are the
offsets valid, and is the machine even channel-interleaved.
Download MemForge2.efi, copy to EFI/BOOT/BOOTX64.EFI on a FAT32 USB (the file
the firmware actually boots from removable media).
v0.4.45 - empirical attribution-reliability flag
v0.4.45 — empirical attribution-reliability flag
A faulty DIMM slot or fine-grained channel interleave can make "blame
DIMM X" misleading. This release adds an honesty flag so the report never gives
false confidence about which stick to replace.
The flag is decided from the observed error distribution, not from SMBIOS
interleave fields (BIOS fills them wrong) and not from argmax (an evenly
interleaved fault lights up every DIMM — the biggest one would falsely read as
separable). It's self-correcting: real interleave scatters one chip's defect
across the whole address space, so it tallies onto 2+ DIMMs → check_by_swap.
A single hot DIMM with the rest clean is only physically possible on a block-
mapped layout — exactly when per-DIMM blame is trustworthy.
JSON "attribution" + an [ATTR] log line:
reliable— one DIMM hot, all others tested-and-clean, enough errors;check_by_swap— errors span 2+ DIMMs (interleave or multi-fault), isolate
by swapping one stick at a time;low_confidence— one DIMM but few errors or an untested neighbour.
"Untested ≠ clean": a DIMM whose test chunk never allocated no longer counts as
clean. No change to the tests or the on-screen verdict.
Download MemForge2.efi, copy to EFI/BOOT/BOOTX64.EFI on a FAT32 USB (this is
the file the firmware actually boots from removable media).
v0.4.44 - socket-vs-stick tracking
v0.4.44 — socket-vs-stick tracking (flag a bad slot, not a good stick)
When a DIMM slot is faulty (bent/dirty pin, cracked solder, dead channel),
every module put in it fails at the same physical address — so the per-DIMM
verdict keeps naming the same slot even after you swap the stick. That reads as
"the test is dumb, always blames DIMM3", when the test is actually pointing at
the POSITION correctly.
This release makes the tool draw that conclusion itself. The NVRAM run record
now also stores, for the slot with the most errors: an FNV-1a hash of its
SMBIOS locator (stable per socket) and the packed SPD serial of the module in
it (stable per stick) — repurposed from reserved bytes, so old records still
load and there's no schema bump.
On the next run, if the same slot again tops the error tally but the serial
changed, it logs:
[HIST] ⚠ SOCKET SUSPECT: errors stayed on slot DIMMx after the module was
swapped (serial A→B) — the SLOT/board is the likely fault, NOT the stick
If the same stick is still in the slot, it nudges you to do the swap so the
next run can decide. To see it fire you need two runs on v0.4.44 (the first
seeds the record). Log-only — no change to the tests themselves. Carries
forward the v0.4.43 BW Soak false-stall fix.
Download MemForge2.efi, copy to EFI/BOOT/loader.efi on a FAT32 USB.