Delete the unused Qt/CLI trees (live frontends are src/suyu and
src/suyu_cmd). Retarget FindLLVM's Windows dummy source, Qt tooling
paths, CODEOWNERS, and REUSE UI globs onto the live suyu files.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
Remove suyu_room.cpp/.rc (unreferenced after Eden restored yuzu-room),
the unused dedicated_room PCH header, and yuzu_room_standalone/main.cpp
(Qt Creator Hello World, not a CMake source). Live room remains yuzu_room
linked by yuzu_room_standalone as suyu-room.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* test(recompiler): pin instruction correctness vs Dynarmic + x86-64 sanitizers
Expand backlog #4 coverage: hosted Translate C vs independent ARM arithmetic
(edge cases and randomized inputs) in homebrew_harness, and Translate AOT vs
in-tree Dynarmic on the same encodings in recomp_stack_harness.
ANDS/BICS/TST now update N/Z only (C/V unchanged when the shifter is idle),
matching Dynarmic and the ARM ARM.
Wire ASan+UBSan via -DSUYU_ENABLE_SANITIZERS / -DYUZU_ENABLE_SANITIZERS and a
Linux x86-64 tests.yml job. Nested probe/AOT compiles inherit the flags.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* test(recompiler): compare ANDS NZCV vs Dynarmic on N/Z only
AOT preserves incoming C/V when ANDS shift amount is 0 (ARM ARM). Dynarmic
reports C=V=0 on the same block, so the stack pin matches N/Z (and GPRs)
rather than treating Dynarmic C/V as the architectural reference.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* fix(recompiler): ANDS AOT writes C=V=0 to match A64/Dynarmic
Restore recomp_set_flags(add, result, 0, result) for ANDS/BICS/TST so
generated code clears C and V instead of leaving them stale. Drop the
N/Z-only Dynarmic mask; homebrew pins ands.c_cleared/v_cleared against a
C=V=1 preset so a stale emit fails.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* test(recompiler): real ArmRecomp+Dynarmic+kernel stack harness
Add recomp_stack_harness that boots a minimal System, creates an
application KProcess with in-tree fixture bytes, and drives ArmRecomp
RunThread/StepThread against real ApplicationMemory and Dynarmic JIT
fallback. Proves SVC parking, TLS/TPIDRRO, cross-page stores, AOT miss
and unhandled->Dynarmic transitions, icache invalidation, restart, and
StepThread fallback.
Keep homebrew_harness as the no-deps stub smoke; fix Windows helpers
under #ifdef so full-tree -Werror builds. Wire the new target into Linux
tests CI.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* fix(recompiler): wire SetRecompLookup AOT + real icache asserts
Path-1 Hashbrown HOLD: process ArmInterface is ArmRecomp via SetRecompLookup
before init; Translate'd AOT + matching guest RX; LoadContext alone publishes
TPIDRRO; registered-PC force-miss; ClearInstructionCache refuses AOT.
Also: InvalidateCacheRange no longer permanently kills AOT (loader RX protect
was rejecting every block before first insn); Dynarmic Clear/Invalidate resets
MemoryReadCode page cache so rewritten guest RX is visible after Clear.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
Update feature map and SKILL strings for post-#14 UI (Welcome/Setup
Profile drippu titles, mixed window chrome, menu labels, config title
still suyu). Fix control-suyu MCP socket handling so slow tools like
get_lobby_row_counts return instead of half-close dropping the reply.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
Present the product as drippu without mass path/target renames.
Add an original drippu.svg mark, retitle README as an active fork
continuation, and update About/window titles, desktop/metainfo,
installer display name, and Android app strings. Keep QSettings and
binary names (suyu) stable for config and build compatibility.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
Catch2 shuffle can run BasicOrderNoPausing before BasicOrder, leaving
callbacks_ran_flags set so BasicOrder's paused ScheduleEvent none()
assert flakes. Clear the shared bitset/delays/expected_callback at the
start of each case that uses them.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
The failed Linux job was CoreTiming[BasicOrder] (callbacks_ran_flags.none
while paused) — the same flake previously seen on main at 1ab59b1541 —
not related to the SDIV change. Empty commit to re-run required checks.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
Guest SDIV of the minimum signed value by -1 is defined as the minimum
itself. Emitting plain C signed `/` for that case is undefined behavior;
UBSan reports it even when a given host happens to return the expected
bits.
Guard both 32- and 64-bit forms before dividing, and extend the exporter
smoke suite with zero-divisor, overflow, ordinary negative, register-
aliasing, and XZR probes built under UBSan when the toolchain supports it.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
recomp_host_ptr only resolved the starting guest page, so 2/4/8-byte
loads and stores at a page edge walked that host pointer into the next
page's address range. Adjacent pages need not share contiguous host
backing (and the next page may be tracked or unmapped), so the access
must take the emulator memory callback unless the full width fits in one
valid page.
Pass the access size into the resolver and fall back when the range
crosses a page or the address-space end. Add a generated-runtime probe
covering same-page fast path, discontiguous/tracked/unmapped second
pages, and SIMD-composed 128-bit loads built from load64.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
Add a CI-runnable harness that executes translated AArch64 blocks and
checks register/memory outcomes for SVC, TLS, multi-core context
switch, forced AOT miss, unsupported insn fallback, icache invalidate,
stop/relaunch, and StepThread policy.
Fix ArmRecomp::StepThread so AOT misses and unhandled encodings enter
the same Dynarmic fallback path as RunThread instead of PrefetchAbort.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
Dense runtime load-order indices were treated as canonical ABI slots, so a
sparse rtld/main/subsdk1/sdk layout wrote the SDK base onto subsdk1.
ApplyModuleBase now matches by name/build-id first.
Export reuse also keyed only on full_scan/backend and could keep stale game
code or an old emitter. Reuse now requires live ExeFS module identities,
emitter/ABI revision, and manifest v3; loaders expect build IDs from NSO
content rather than an adjacent JSON manifest alone.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* test(ci): add release publication gate regression
Drive the Publish Release job the way GitHub Actions would. The check
evaluates job `if`/`needs` from `.github/workflows/release.yml` and runs
the job's shell against a stub `gh`. Required platform failures still
publish. The rolling `v0.04-latest` tag is deleted before the empty
artifact check. The release notes have no commit, toolchain, or checksum
metadata.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* fix(ci): gate release publish on required results
Replace if: always() with !cancelled() plus required job results so a
Windows, Linux, macOS, Android, or libretro failure cannot replace a
release. Keep FreeBSD and libretro-android optional. Stop deleting
v0.04-latest. Publish v0.04-<date>-<sha> with commit, toolchain, and
SHA-256 metadata. Call exporter smoke and the Catch2 tests from both
pull-request CI and the release needs list.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* chore(ci): drop leftover always() lecture from the gate check
Delete the module docstring that still taught if: always() after
release.yml stopped using it. GitHub's default success() wrap lives in
apply_github_default_success. Publish is forbidden from deleting a tag
at all, not only from deleting before the empty check.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* test(ci): reject gh prerelease as latest
GitHub returns HTTP 422 Latest release cannot be draft or prerelease
when gh release create passes --prerelease with --latest, then runs
cleanupDraftRelease. The gate stub now fails the same way.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
* fix(ci): stop marking prereleases as latest
Remove --latest from publish_release.sh. GitHub forbids a prerelease
from being the latest release and gh then deletes the draft.
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
WordManager notifies through UpdatePagesCachedBatch only. The Catch2
rasterizer left that method empty, so Count() stayed 0 after Unmark.
Forward each batch range to UpdatePagesCachedCount. Rewrite the
FlushCachedWrites case to the measured contract: Unmark is one coalesced
+1, CachedCpuWrite sends -1 immediately, Flush does not add rasterizer
calls.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>