Skip to content
This repository was archived by the owner on May 31, 2026. It is now read-only.

Releases: Paradoxdov/memforge

v0.4.67 — display fixes

31 May 06:30

Choose a tag to compare

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)

29 May 17:21

Choose a tag to compare

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

29 May 14:52

Choose a tag to compare

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

29 May 14:44

Choose a tag to compare

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

29 May 09:06

Choose a tag to compare

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 default quantai.ini is ~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>.log and .json, so successive
    runs (e.g. testing each stick in each slot) no longer overwrite each other.
    The live memforge2.log / report.json remain 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)

29 May 06:00

Choose a tag to compare

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 SetMode so AMD GOP settles before we verify.
  • Pinned Width/Height are now trusted: the requested geometry is
    accepted even when fbsz looks 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) +
    FrameBufferSize right 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

28 May 19:53

Choose a tag to compare

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 Services GetProcessorInfo().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==0 guard 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)

28 May 18:03

Choose a tag to compare

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

28 May 17:03

Choose a tag to compare

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

28 May 14:07

Choose a tag to compare

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.