Skip to content

fix(libSceLibcInternal): export sigvec through shared runtime - #10953

Open
AZLisme wants to merge 1 commit into
boykopovar:mainfrom
AZLisme:feat/batch2-libc-legacy-signals
Open

AZLisme wants to merge 1 commit into
boykopovar:mainfrom
AZLisme:feat/batch2-libc-legacy-signals

Conversation

@AZLisme

@AZLisme AZLisme commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

What

Implement native libSceLibcInternal sigvec (yhxKO9LYc8A) and preserve libc compatibility. Each patched module owns its public NID and calls one unique private libc conversion core with shared sigaction registration state. Distinct existing host aliases avoid the libc preserve-export-list collision without changing patcher policy or forwarding through the public NID. One canonical shared header supplies the 16-byte vector ABI and typed declarations.

Conversion retains the low mask word, flags XOR 2, null combinations, input/output aliasing and forwarded results. Complete previous-vector HostWrite is checked before backend mutation; rejection returns EFAULT without partial output or disposition changes. Missing backend registration throws runtime_error. Independent kernel registration keeps #10749's siginterrupt ownership separate.

Credit BunnyFl's firmware 13.42 report for identifying Internal as the native owner and checking ABI/conversion by executing firmware code under an emulator with recording imports. This was not a physical-console measurement. The source contract follows pinned FreeBSD 11.4 sigcompat.c; inherited signal-backend gaps remain in debt.

The standalone native fixture loads the actual patched modules without guest-runtime startup links, checks module ownership and cold registration, then loads its exception probe. The mixed-ABI source has final no-exceptions/no-asynchronous-unwind options, while utility sources retain native MinGW unwind tables/static runtimes. Windows images are explicitly pinned until process exit while original LoadLibrary references still receive FreeLibrary. Separate child processes retain both cold load orders. Explicit DLL unloading remains outside the fixture; the earlier unload crash's cause is unknown.

Rebased as 581d45c28237 onto main aebeaa53f54d. The final implementation, canonical ABI, positional CMake wrapper and fixtures are preserved. The debt conflict retains upstream frexpf and the remaining SIG gaps; sigblock/sigsetmask remain deferred.

Tested

Fresh fixed-main Linux validation on 0362b1521c4e and private SIG+all-six-ICU composition 8a5c8c499f0e: baseline passed 53 plain runtime CTests, four with logging enabled and 65 public-header checks; composition passed 63, six and 65 respectively, with zero failures, skips or NotRun cases. Both SIG fixtures passed plain and with logging enabled, including both requested native module-open orders. The published head remains 581d45c28237. This qualifies selected cases on that fixed private composition; full CI, later main, Windows/macOS, native signal context and provider unload remain outside this new run.

Native Windows: ycbuzi reports current head 581d45c282 merged cleanly with main c547deaacb (reported merge fa54b0eba1), Windows 11 Home 10.0.26200 / WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT), Release, BUILD_TESTING=ON. The seven named targets (libc, libkernel, libSceLibcInternal, nid_patcher, sigvec_modules_exceptions, guest_sigvec_tests, guest_sigvec_modules_tests) built, and both guest_sigvec and guest_sigvec_modules passed two repetitions with ctest --repeat until-fail:2. This is attributed focused contributor validation, not local reproduction or full maintainer CI. No negative control, full-suite, five-PR-union, macOS or title run was reported.

Fresh normal-root Linux Release build at 581d45c28237 / base aebeaa53f54d: all 68 selected CTests passed with zero failures or skips: guest_sigvec, guest_sigvec_modules, guest_exit_order and 65 public-header checks. Both Internal-first and libc-first child processes passed module ownership, shared conversion/callback state, exception and guest-output assertions. Independent source, build-input, artifact and runtime review passed.

Conventions and whitespace checks passed. Static integration with current main 801d5b9bc110 is clean; that later-main union was not run.

Earlier maintainer Linux/Windows CI applies to the ordered five-PR union (#10953, #11137, #10995, #11165 and #11219) containing e0382c66298e on main b986c11a344e. Earlier native Windows contributor results apply to b397eedc42 with main 2cce8bc51d: Windows 11, WinLibs GCC 15.2.0 r7, Release, both SIG fixtures passed three repetitions. These results remain historical. Current-head full maintainer CI remains pending; focused Windows contributor validation is recorded above. No title, physical PS5 or macOS run is claimed.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: n/a
  • AI-assisted: yes

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Progress report (801d5b9 → 581d45c)

📈 System libraries: 48.84% (+0.01%, +2 implemented functions)

✅ 2 implemented
Library Name
libSceLibcInternal sigvec_nid_postfix
libc sigvec_nid_disambig1

Changed libraries (implemented exports)

Library Before After Change
libc 1403/1412 (99.36%) 1404/1413 (99.36%) +0.00 pp
libSceLibcInternal 72/76 (94.74%) 73/77 (94.81%) +0.07 pp

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 8937 docs/dev/debt/libc.md L10
PR 13782 core/libs/prx/libSceLibcInternal/CMakeLists.txt L198

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 4563 core/libs/prx/libkernel/CMakeLists.txt
PR 5021 core/libs/prx/libSceLibcInternal/CMakeLists.txt
core/libs/prx/libc/CMakeLists.txt
core/libs/prx/libkernel/CMakeLists.txt
docs/dev/debt/libc.md
PR 5303 docs/dev/debt/libc.md
PR 6085 core/libs/prx/libc/CMakeLists.txt
PR 6149 core/libs/prx/libkernel/CMakeLists.txt
PR 6936 core/libs/prx/libkernel/CMakeLists.txt
PR 7081 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 7192 core/libs/prx/libkernel/CMakeLists.txt
PR 7386 docs/dev/debt/libc.md
PR 7447 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 7715 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 8150 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 8477 core/libs/prx/libkernel/CMakeLists.txt
PR 8965 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 9156 core/libs/prx/libkernel/CMakeLists.txt
PR 9293 core/libs/prx/libkernel/CMakeLists.txt
PR 9297 core/libs/prx/libkernel/CMakeLists.txt
PR 9302 core/libs/prx/libkernel/CMakeLists.txt
PR 9326 core/libs/prx/libkernel/CMakeLists.txt
PR 9340 docs/dev/debt/libc.md
PR 9371 docs/dev/debt/libc.md
PR 9383 core/libs/prx/libkernel/CMakeLists.txt
PR 9389 core/libs/prx/libkernel/CMakeLists.txt
PR 9447 docs/dev/debt/libc.md
PR 9526 docs/dev/debt/libc.md
PR 9557 core/libs/prx/libkernel/CMakeLists.txt
PR 9566 core/libs/prx/libkernel/CMakeLists.txt
PR 9863 docs/dev/debt/libc.md
PR 9938 core/libs/prx/libkernel/CMakeLists.txt
PR 10324 core/libs/prx/libc/CMakeLists.txt
core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 10405 docs/dev/debt/libc.md
PR 10645 core/libs/prx/libkernel/CMakeLists.txt
PR 10729 docs/dev/debt/libc.md
PR 10780 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 11002 core/libs/prx/libkernel/CMakeLists.txt
PR 11332 docs/dev/debt/libc.md
PR 11751 core/libs/prx/libSceLibcInternal/CMakeLists.txt
PR 11939 core/libs/prx/libkernel/CMakeLists.txt
PR 12057 docs/dev/debt/libc.md
PR 12363 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 12544 core/libs/prx/libkernel/CMakeLists.txt
PR 12688 core/libs/prx/libc/CMakeLists.txt
core/libs/prx/libc/include/Api.hpp
core/libs/prx/libkernel/CMakeLists.txt
docs/dev/debt/libc.md
PR 12700 core/libs/prx/libc/CMakeLists.txt
core/libs/prx/libc/include/Api.hpp
core/libs/prx/libkernel/CMakeLists.txt
docs/dev/debt/libc.md
PR 12920 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 12965 core/libs/prx/libc/CMakeLists.txt
core/libs/prx/libc/include/Api.hpp
core/libs/prx/libkernel/CMakeLists.txt
docs/dev/debt/libc.md
PR 12970 core/libs/prx/libkernel/CMakeLists.txt

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes for the open integration conflict. The sigvec conversion itself matches the pinned FreeBSD compat-43 path, and the focused tests cover flag/mask round-trips, aliasing, invalid input and missing registration. However, I ran git merge-tree between the current #10953 head and open #10749; it reports a content conflict in core/libs/prx/libkernel/System/src/Signals.cpp. If #10749 lands first, its removal/move of the RegisterSignalsOnLoad callback setup can also drop this PR's RegisterSigvec_nid_no_patch registration unless that is explicitly carried into the new owner path.

The PR description anticipates preserving that callback, but I could not find an agreed merge order with #10749's author. Please coordinate the order/resolution with that author and record the result (and any needed Depends on entry) before approval. The submitted Linux checks pass; this is specifically about maintaining a buildable and registered integration after the shared-file conflict is resolved.

@ahmadmuj ahmadmuj left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked head fa4e8f1698fe merged onto main a5a780eaaa7f (clean merge). Linux, GCC 13.3, Release.

What I ran:

  • built guest_sigvec_tests, guest_signal_tests, guest_signal_set_tests; ctest -R '^(guest_sigvec|guest_signals|guest_signal_sets)$' is 3/3 green
  • mutation: dropping the ^ 2 on install makes guest_sigvec fail with "legacy interrupt flag reverses restart flag", so the flag loop really catches a wrong conversion
  • walked LegacySignals.cpp against FreeBSD 11.4 lib/libc/compat-43/sigcompat.c sigvec() line by line: same ^ SV_INTERRUPT both ways, empty mask plus low word on install, osv written only when ret == 0, null sv/osv passed through. Converting sv before the call also keeps the aliased case right
  • compute_nid("sigvec") from tools/nid_names.py gives yhxKO9LYc8A

One thing to change: the progress report counts sigvec as a stub (libc 1340/1351 -> 1340/1352 in the bot comment above). tools/progress.py marks any APS5_VABI body that calls NotImplemented_nid_no_patch as todo, and the missing-backend guard does that. siginterrupt handles the same missing registration with a plain throw (Process.cpp:309), which counts as done. With

if (forward == nullptr) throw std::runtime_error("sigvec: libkernel has not registered sigaction");

progress.py --module libc gives 1341 done / 11 todo with sigvec done, and guest_sigvec still passes (NotImplemented_nid_no_patch throws std::runtime_error too, so the MissingBackend catch is unchanged).

Not checked: which PS5 module exports sigvec (no dump here), Windows/macOS. The #10749 ordering question in the earlier review still stands; I didn't look into that part.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found one guest-memory output path that needs guarding before this is ready. When previous is non-null, sigvec_nid_postfix writes handler, mask, and flags directly into that caller buffer after the forwarded sigaction call. If previous points into GuestArena-backed memory, these stores bypass the GuestArena::HostWrite bookkeeping used to notify shared backing/write-watch and do not handle a rejected read-only Windows mapping. Please open a writable scope for the full GuestSignalVector output before mutating it and handle Open() failure without partially writing the result; add a guest-backed or read-only-view regression if the harness supports it. The current test uses stack GuestSignalVector objects, so it does not exercise that path. I checked the frozen-head diff with git diff --check and python3 tools/check_conventions.py --base upstream/main --head refs/pr/10953; both pass. The hosted eligibility, intake, conventions, labels and report checks pass; hosted product builds are skipped. The 5/5 Linux CTests in the PR description are author-reported, not independently rerun here, and PS5/Windows/macOS behavior remains unverified.

@MarcZX10

Copy link
Copy Markdown
Contributor

Correction to the check summary in my review: I re-ran gh pr checks after posting it. The current head has passing relinker jobs on macOS/Linux/Windows, relinker ASan, register-context on Ubuntu/macOS, and write-watch on macOS; eligibility, intake, labels, conventions and report also pass. The broad linux and windows build jobs are skipped. My requested changes remain the guest-backed output write path described in the review and the existing #10749 integration conflict already called out in my earlier review.

@AZLisme

AZLisme commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

Fixed in 9a8104e0296bf7d7f882b99f5749744557298fe7.

  • The entire previous-vector range is guarded before the forwarded sigaction can mutate the disposition. Rejected access returns -1/EFAULT without writing a partial result. Added real GuestArena-backed output/cross-page/alias checks and Windows-only read-only-view regressions; the Windows rejection cases have not been run on Linux.
  • Registration is now owned by a separate kernel source, with no change to Signals.cpp relative to base 4017310678562c63594d99b8f45db2d68b9aaa6c. git merge-tree with the live refactor(libSceLibcInternal): serve siginterrupt from libSceLibcInternal #10749 head ad36ce77663626a65019079ea4aa9ac0fb37a003 is clean. Built the actual combined libc/kernel/Internal libraries and passed 5/5 focused runtime/header tests, including both sigvec and refactor(libSceLibcInternal): serve siginterrupt from libSceLibcInternal #10749's relocated siginterrupt. The shared-file conflict is eliminated, so no ordering dependency is needed.
  • The missing-backend environmental guard now uses the requested ordinary std::runtime_error; progress no longer reports sigvec as a stub.

The branch itself also passed 5/5 focused Linux checks, conventions and whitespace checks. No new hosted product-build or Windows/macOS/console execution is claimed.

Please re-review the updated head. A maintainer full Linux/Windows CI run would exercise the new Windows rejection cases before merge.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed exact updated head 9a8104e0296bf7d7f882b99f5749744557298fe7. The previous-vector buffer is guarded across its full range before calling the forwarded sigaction, so a rejected guest write returns -1/EFAULT without changing the disposition or partially updating the vector. Guest-backed tests cover cross-page output, input/output aliasing, canaries, and Windows read-only rejection. The missing backend now throws an ordinary runtime error, so progress no longer classifies this implementation as a stub.

The registration setup was moved to a separate kernel translation unit; the author reports git merge-tree is clean with #10749 and a combined libc/kernel/Internal build with 5/5 focused tests, including the relocated siginterrupt registration. I independently ran python3 tools/check_conventions.py --base upstream/main --head HEAD and git diff --check upstream/main...HEAD; both pass. Windows rejection cases are present but not reported as executed, and broad hosted product jobs are skipped. The previously raised guest-output and integration-conflict issues are addressed.

@BunnyFl

BunnyFl commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Firmware 13.42 matches on the PS5 side. sigvec (yhxKO9LYc8A) is exported by libSceLibcInternal.sprx, and it behaves like FreeBSD's compat-43 sigvec. I ran it in an emulator with its two imports, _sigaction and sigemptyset, replaced by stubs that record what they get. Two runs gave identical results, all equal to this PR's code:

  • The vector layout is handler at 0, mask at 8, flags at 12.
  • On install, _sigaction gets the handler, flags ^ 2, and a mask that is empty except word 0 = the vector's mask. A mask of -1 gives ffffffff in word 0 only; flags 0, 1, 2, 3 and 0xffffffff give 2, 3, 0, 1 and 0xfffffffd.
  • A null new or old vector is passed as null. Both null still calls _sigaction and returns its result.
  • The old vector is written only when _sigaction returns 0: handler, flags ^ 2, and mask word 0. When it fails, sigvec returns its -1 and leaves the old vector untouched.
  • The new vector is converted before the call, so the same pointer for both works: it ends up holding the old action.

The EFAULT guard has no firmware counterpart (the module just writes), which is expected for AnyPS5's guest memory.

@ycbuzi

ycbuzi commented Oct 25, 2026

Copy link
Copy Markdown
Contributor

@AZLisme Windows run of 9a8104e029, so the Windows-only guest_sigvec cases have run on Windows. Windows 11 Home 10.0.26200, WinLibs MinGW-w64 GCC 15.2.0 (ucrt-posix-seh r7), Release, BUILD_TESTING=ON:

tree build guest_sigvec, guest_signal_list, guest_signals, guest_signal_sets (--repeat until-fail:2) public_headers audit
main d2b3ee3bcc + this PR (a52a6a9683) ok 4/4 pass passes
#10749 ad36ce7766 + this PR (6b7d098203) ok 4/4 pass passes

Each side built with one warning, which I didn't capture. (The first audit run on the main side hit its 30 s CTest limit on a cold disk; the reruns pass in 10–12 s.) So the combination with #10749 also holds on Windows. Not run: a title. AI-assisted: yes (Claude Code)

@AZLisme

AZLisme commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

@BunnyFl Thank you for checking the firmware layout, mask/flag conversion, aliasing and forwarding results. I am keeping that evidence labeled as execution of the 13.42 library with stubbed imports, separately from console hardware measurement.

Your module identification exposed a packaging gap: the current head defines the export in libc, while lookup through the Internal handle on Linux succeeds only by finding its libc dependency. Internal owns no patched yhxKO9LYc8A export. I am correcting the native Internal export through one shared private implementation and registration state, with functional patched-module ownership tests. Please wait for the revised head before merging this PR; I will post the exact artifacts and test results when qualified.

@AZLisme
AZLisme force-pushed the feat/batch2-libc-legacy-signals branch from 9a8104e to 9869d58 Compare October 25, 2026 16:21
@AZLisme AZLisme changed the title feat(libc): implement legacy sigvec fix(libSceLibcInternal): export sigvec through shared runtime Oct 25, 2026
@AZLisme

AZLisme commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

Implemented in 9869d5864cebbe8fa39c7e8541a167d6d925afd1.

BunnyFl’s report exposed a real native-module gap: the previous Internal lookup could resolve libc through ELF dependency fallback. Both patched modules now define yhxKO9LYc8A themselves. Distinct host aliases call one private libc helper and shared callback state, with no public-NID forwarding or patcher-policy change. The shared canonical declarations preserve the reported 16-byte ABI and conversion behavior. Credit and the emulated firmware 13.42 recording-import method are recorded accurately; no hardware measurement is claimed.

The complete previous-vector HostWrite is checked before action mutation, including aliasing. Missing-backend reporting uses the requested plain runtime_error. Independent sigvec registration is preserved; an actual clean union with current #10749 (29c52418) rebuilt all three modules and passed 7/7 focused tests including its siginterrupt test, so this integration has no source conflict or ordering dependency.

The own-tree actual-module suite passed 6/6 on Linux. Its standalone lookup test verifies actual NID ownership before calls in both load orders, cross-module state, errors and mapped output; an old Internal binary is rejected specifically for dependency fallback. Windows ownership/read-only branches are present but were not executed locally. Header/convention checks and independent peer review passed.

Thank you @BunnyFl for identifying the native owner and @ycbuzi for the Windows run. The latter covers prior head 9a8104e029 and old #10749 ad36ce7766; this revised head still needs Windows execution.

Ready for re-review. Maintainers, please run the full Linux/Windows CI on this revised head and merge when satisfied.

@github-actions github-actions Bot added the prx label Oct 25, 2026
@ycbuzi

ycbuzi commented Oct 25, 2026

Copy link
Copy Markdown
Contributor

A Windows run of 9869d5864c, since the description says the Windows branches weren't run.

Windows 11 Home 10.0.26200, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT, posix-seh), Release, merged twice: onto main 0119103fa9 (430037c400), and onto #10749 29c52418f2 (640ba7ce23). Both merges are clean.

  • guest_sigvec, guest_signal_list, guest_signals, guest_signal_interrupt and guest_signal_sets pass both runs of ctest --repeat until-fail:2 in both trees. The public_headers audit passes in both.

  • guest_sigvec_modules fails on Windows in both trees. guest_sigvec_modules_tests doesn't link:

    GuestSigvecModules.cpp.obj:GuestSigvecModules.cpp:(.data+0x8): undefined reference to `__gxx_personality_v0'
    NidCompute.cpp.obj:NidCompute.cpp:(.data+0x0): undefined reference to `__gxx_personality_v0'
    Sha1.cpp.obj:Sha1.cpp:(.data+0x0): undefined reference to `__gxx_personality_v0'
    

    The test script then reports sigvec Internal-first lookup failed: no such file or directory, because the executable isn't there.

    On a DWARF-exception MinGW toolchain, everything under core/libs is compiled with -fno-asynchronous-unwind-tables (core/libs/CMakeLists.txt:50). Test executables normally get __gxx_personality_v0 by linking the guest libc. This one links only ${CMAKE_DL_LIBS} (libSceLibcInternal/CMakeLists.txt:187), which is empty on Windows. The hosted windows and linux jobs are skipped for this PR, so CI doesn't show it.

What I tried locally, none of it pushed:

  • Static runtime flags alone, or without configure_windows_unwind: the same undefined reference, since the directory-wide flag stays.
  • patched_libraries_tests' MinGW pattern (-fasynchronous-unwind-tables plus -static -static-libgcc -static-libstdc++, core/libs/CMakeLists.txt:327-330): GCC 15.2 stops with internal compiler error: in choose_baseaddr, at config/i386/i386.cc:7447 at GuestSigvecModules.cpp:232.
  • Adding libc to the link line: it builds, but the test then fails with load actual patched module (GuestSigvecModules.cpp:35). With the guest libc linked, libc.prx is already loaded at startup, which also cuts across the Internal-first and libc-first runs. I didn't dig into which module failed to load.

So I don't have a working Windows setup for this test to suggest. A smaller option, if the Windows path isn't needed in this PR, would be registering it for Linux only (line 181 has WIN32 OR) and noting Windows in the debt. Separately, SigvecModules.cmake:27 sets only LD_LIBRARY_PATH, which the Windows loader doesn't read.

AI-assisted: yes (Claude Code)

@AZLisme

AZLisme commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

Thank you @ycbuzi for testing the revised 9869d5864c head and separating the five passing signal tests from the failing standalone module test. I am fixing the host-test build and Windows module search setup. The fixture must remain independent of guest libc at startup so both load orders and actual export ownership stay meaningful.

The Windows module test is currently broken at this head; the Linux pass and skipped hosted product jobs do not establish Windows coverage. Please wait for the corrected head before merging. I will post the exact build/test scope and request a Windows retest once the change is ready.

@AZLisme
AZLisme force-pushed the feat/batch2-libc-legacy-signals branch from 9869d58 to 664732c Compare October 25, 2026 17:03
@AZLisme

AZLisme commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

@ycbuzi Thank you for the exact-head Windows reproduction.

The Windows report identified real fixture mistakes: the standalone host inherited guest DWARF flags, its mixed-ABI catch could enter the reported GCC SEH code-generation path, and the runner set only LD_LIBRARY_PATH.

The correction is committed at 664732cbe54236115bc32691705b802e5ad51452, rebased onto main 5949d8bf. The standalone host keeps native MinGW unwind tables/static runtimes, and the mixed-ABI source has exceptions disabled. A late-loaded probe uses the guest exception runtime to check the missing-backend exception for both module-owned wrappers. It loads after ownership and cold-registration checks, so guest libc is not linked into the host or preloaded to make the test pass. Windows module search now includes the isolated PRXs, their runtime directories, the executable/probe directories and optional mimalloc directory; load failures print the path and GetLastError. The probe uses GetProcAddress for core identity rather than comparing a MinGW import thunk.

Fresh Linux actual-runtime validation passed 8/8, including the new probe path; the old Internal binary still fails the explicit ownership assertion. The current #10749 ec26e215 union is clean and also passed 8/8 after rebuilding the actual three modules and patcher. Headers, conventions and independent peer review passed.

Your five repeated Windows test passes and header audits are credited specifically to 9869d5864c and the two merges you reported. I do not have a Windows compiler/runtime here, so the corrected fixture is not yet Windows-validated. Please retest guest_sigvec_modules at this new exact head; the Windows coverage remains enabled.

Please rebuild the six focused executables with cmake --build build --target guest_sigvec_modules_tests guest_sigvec_tests guest_signal_list_tests guest_signals_tests guest_signal_interrupt_tests guest_signal_sets_tests, then run ctest --test-dir build -R "^(guest_sigvec_modules|guest_sigvec|guest_signal_list|guest_signals|guest_signal_interrupt|guest_signal_sets|public_headers)$" --output-on-failure on this revised head. Ready for re-review; please merge when the Windows retest, maintainer CI and review are satisfactory.

@ycbuzi

ycbuzi commented Oct 25, 2026

Copy link
Copy Markdown
Contributor

The Windows retest of 664732cbe5, with the command you gave: Windows 11 Home 10.0.26200, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT, posix-seh), Release.

As pushed, the build stops in both trees (onto main 4051878f8c as 22b123cd29, and onto #10749 ec26e215f1 as 5da9c002f2):

core/libs/tests/GuestSigvecModules.cpp:232:1: internal compiler error: in choose_baseaddr, at config/i386/i386.cc:7447

Line 232 is the end of main. -fno-exceptions on that file isn't enough, because the target-wide -fasynchronous-unwind-tables still applies to it. So none of the seven tests ran.

Two local changes make it pass (not pushed). They were run on the #10749 + 664732cbe5 tree only:

-    set_source_files_properties(${LIBS_INCLUDE_DIR}/tests/GuestSigvecModules.cpp PROPERTIES COMPILE_OPTIONS -fno-exceptions)
+    set_source_files_properties(${LIBS_INCLUDE_DIR}/tests/GuestSigvecModules.cpp PROPERTIES COMPILE_OPTIONS "-fno-exceptions;-fno-asynchronous-unwind-tables")
     ~Module() {
 #ifdef _WIN32
-        FreeLibrary(handle);
+        (void)handle;
 #else
  1. With only the first change, everything builds: NidCompute.cpp and Sha1.cpp keep the target's SEH tables and the static runtime. The Internal-first run then prints sigvec NID ownership, shared callback/core, firmware conversions and guest output passed (Internal first), but the process ends with Access violation. Its exit status is nonzero, so SigvecModules.cmake:48 reports sigvec Internal-first lookup failed.
  2. With the second change added, both orders print their pass line, and guest_sigvec_modules passes both runs of --repeat until-fail:2. The full set (guest_sigvec_modules, guest_sigvec, guest_signal_list, guest_signals, guest_signal_interrupt, guest_signal_sets and public_headers) passes 7 of 7, both runs.

So the crash comes from unloading the patched modules on Windows. My guess, not checked, is that FreeLibrary takes libkernel.prx away while threads it started are still running (it logs its scheduler tick at load). Leaving the modules loaded is only one way out; you may prefer another.

AI-assisted: yes (Claude Code)

@AZLisme

AZLisme commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

@ycbuzi Thanks for the detailed retest and the two verified local adjustments.

The source-level unwind override was missing from 664732cbe5. The new commit 554736303d87b1885de00ea31635314d6a67f327 gives the mixed-ABI fixture source final -fno-exceptions;-fno-asynchronous-unwind-tables options while NidCompute/Sha1 keep native MinGW unwind tables and static runtime.

For module lifetime, the fixture now pins each actual loaded Windows image with GetModuleHandleExW(PIN|FROM_ADDRESS), checks handle identity, and retains the normal FreeLibrary calls for its original LoadLibrary references. The images intentionally remain until process exit. This preserves both cold load orders in separate processes and avoids adding a speculative kernel shutdown change. The unload crash's cause remains unknown; explicit DLL unload is outside this fixture's coverage.

The changed host fixture rebuilt and all eight Linux focused/header checks passed. Qualified production runtime/probe/patcher inputs remain byte-identical to the prior validation. The old Internal negative still fails for dependency fallback, conventions has zero errors, and independent peer review passed.

Your 7/7 twice result is credited specifically to 664732cbe5 + #10749 ec26e215f1 with the two local changes (source flag override and omitted FreeLibrary). It is not presented as a result for the new explicit-pin commit. Please retest the new exact head on Windows; I do not have a native Windows compiler/runtime here.

Ready for re-review. Please merge when the exact-head Windows retest, maintainer CI and review are satisfactory.

@ycbuzi

ycbuzi commented Oct 25, 2026

Copy link
Copy Markdown
Contributor

Windows retest of 554736303d, with the targets and test set you gave: Windows 11 Home 10.0.26200, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT, posix-seh), Release. No local changes this time.

tree build ctest --repeat until-fail:2
onto main ac65cf490e (bad57d61cc) no errors 7 of 7 pass, both runs
onto #10749 ec26e215f1 (3712e70564) no errors 7 of 7 pass, both runs
  • The seven tests are guest_sigvec_modules, guest_sigvec, guest_signal_list, guest_signals, guest_signal_interrupt, guest_signal_sets and public_headers.
  • The only build warning in either tree is main's existing _sigintr_nid_postfix one at Signals.cpp:24.
  • In both trees, ctest -V for guest_sigvec_modules shows both orders: ... guest output passed (Internal first) and ... (libc first). There's no access violation at exit with the pinned images.

AI-assisted: yes (Claude Code)

@AZLisme

AZLisme commented Oct 25, 2026

Copy link
Copy Markdown
Contributor Author

Thanks @ycbuzi, for the native Windows retest with no local changes. The PR now records your exact 554736303d results: both reported main ac65cf490e and #10749 ec26e215f1 merges build successfully, all seven selected tests pass twice, and both module load orders exit without an access violation.

The final commit 50fe2d91d87f545ff527afcbe22f410f8082dc2f only removes the stale pin-validation gap from debt. Its entire core/libs tree is identical to 554736303d, so another Windows retest is not needed for this documentation change. Explicit DLL unloading and the earlier crash's cause remain unverified; no kernel shutdown claim was added.

The prior code-identical Linux eight-check suite and peer review remain applicable; final conventions and whitespace checks pass. This is ready for merge following the usual maintainer CI/review process.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@AZLisme The full CI build fails on both Linux and Windows at tools/check_test_registration.py: error: guest_sigvec_modules_tests is built but no ctest test runs it.

The test is registered in core/libs/prx/libSceLibcInternal/CMakeLists.txt as guest_sigvec_modules through ${CMAKE_COMMAND} ... -P SigvecModules.cmake, but the executable is only passed as -DTEST_EXECUTABLE=$<TARGET_FILE:guest_sigvec_modules_tests>. The checker ignores arguments that start with -, so it only counts an executable that appears as a plain argument of an add_test. Could you pass $<TARGET_FILE:guest_sigvec_modules_tests> as a positional argument as well (for example after the -P script, read through CMAKE_ARGV in SigvecModules.cmake), or otherwise register it so python tools/check_test_registration.py build passes locally? If it is only ever meant to run through the script, the other option is to build it with plain add_executable (outside the tests output directory) so it is not treated as a standalone test.

@AZLisme

AZLisme commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Fixed in b397eedc42823115685d9ddbf6dc4d2a36f72bc0 using the positional-argument approach from your request.

guest_sigvec_modules now passes the real executable after -P SigvecModules.cmake --. The script validates the separator, reads the executable through CMAKE_ARGV, and uses that value for its actual invocation and Windows DLL search path. I removed -DTEST_EXECUTABLE; the executable remains an add_test_executable, and the registration checker is unchanged.

On Linux (normal source-root CMake, GNU 16.2.1, Release, Ninja), the actual registration audit passes with both this branch's checker and the checker from main 4e43321bd6:

1361 test executable(s), 0 built and not run as recorded, none new

That accounts for configured executable targets; it is not a 1,361-test runtime run. After a fresh targeted source build, the six actual CTests guest_sigvec, guest_sigvec_modules, guest_signal_list, guest_signals, guest_signal_interrupt and guest_signal_sets passed with no failures or skips. The module test passed actual patched-module NID ownership/shared-state checks in both Internal-first and libc-first processes. The build path contained spaces, and missing/extra executable arguments were also checked. Independent source/runtime/artifact review passed; conventions had zero errors and the existing debt-length warning.

Production signal code, API and debt are unchanged. Static merging with main 4e43321bd6 was clean, but that merged union was not executed. The older native Windows report remains scoped to 554736303d and code-identical 50fe2d91d8; it does not validate this new wrapper. No new native Windows/macOS or hosted full-suite pass is claimed. The previous full CI run failed before the build/test steps, so a new maintainer full run is still needed for the new head.

Please rerun full Linux/Windows CI on this head and re-review; once the required checks pass, please merge.

@ycbuzi

ycbuzi commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

@AZLisme A native Windows run of b397eedc42, the new wrapper: Windows 11 Home 10.0.26200, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT), Release. b397eedc42 merged onto main 2cce8bc51d with no conflicts.

  • guest_sigvec and guest_sigvec_modules pass, 3 of 3 (--repeat until-fail:3).
  • This ran under plain ctest, with no PATH entry added by my runner. So guest_sigvec_modules found its patched modules through the executable passed after -P SigvecModules.cmake -- and the script's own Windows DLL search path.
  • Build: the PR's targets plus libc, libkernel, libSceLibcInternal and nid_patcher link. The only warning is main's known Signals.cpp:25 one.
  • The build path has no spaces, so this doesn't repeat that part of your Linux check.

AI-assisted: yes (Claude Code)

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@ycbuzi Thanks. That's the Windows check the new wrapper needed, and it's good that it found the modules with no PATH help. We'll run full Linux/Windows CI on b397eedc42.

@AZLisme

AZLisme commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

Fixed the Linux compile failure from run 40359537854 in 8b4bb4d239adb092e28aaf539d4e8bb3143c5aaf. The exit-order fixture's local GuestHandler callback collided with the kernel signal type alias exposed through the SIG include chain. Only that callback and its two uses are renamed to RecordGuestExit; the ABI, GH/AG expectations, production signal behavior/API/debt and positional CMake wrapper are preserved.

Fresh normal-root Linux validation used a private merge of exact CI base 4c92447924d2c322dc39a4f97184e96114a84ec2 with this candidate. Seven actual runtime CTests passed, including the failing exit-order fixture and all six signal cases; separately, 65 public-header cases passed. No failures or skips. The source-built patched-module wrapper passed both cold load orders from a build path containing spaces. The local registration audit passed with 1,399 executable targets and zero unregistered; that is an audit count, not a runtime-test count. Conventions and whitespace checks passed, with only the existing debt-length warning.

The preceding b397eedc42/4c92447924 hosted Windows result remains historical: 1,680 passed and 815 expected skips out of 2,495 CTests, with the skip validator passing. Its Linux job failed before tests. The earlier contributor Windows reports retain their own source and path scope. This new head has no new Windows or full-suite result, and the private Linux union is not a latest-main or standalone-branch runtime claim.

Please rerun the required full CI and re-review this head; merge once the required checks and review pass.

@AZLisme

AZLisme commented Oct 26, 2026

Copy link
Copy Markdown
Contributor Author

e0382c66298e adds only CMP0054 NEW, correcting quoted-LIBC routing without production/API/Unix-exit changes.

Private five-topic Linux validation on 6b16 observed the CMake 3.28 old-wrapper negative, then six passing cold-order children across 3.28 fixed and 4.4 old/fixed. The fixed normal module CTest, direct SIG/exit 2/2, declaration audit and seven header units pass with identical unpatched inputs.

Earlier sYd failure was Linux; historical old-8b4bb4d239 Windows success remains scoped to that composition. The Linux posix_spawn failure remains unattributed and unresolved. No new Windows/full-CI pass is claimed. Please re-review and run fresh required CI before merge.

@AZLisme

AZLisme commented Oct 27, 2026

Copy link
Copy Markdown
Contributor Author

Manual CI run 40446565355, attempt 1, completed successfully for the recorded five-PR union on main b986c11a344e, including SIG e0382c66298e. Both Release jobs passed the direct SIG, module-wrapper, patched-library and 65 header checks; Linux also passed guest_exit_order, which is unregistered on Windows. Expected skips were validated. The body records exact inputs, counts and observability limits.

Please re-review the wrapper/fixture fixes and merge when review and current integration checks are satisfactory. Existing prerequisite holds remain unchanged.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 27, 2026
@AZLisme

AZLisme commented Oct 27, 2026

Copy link
Copy Markdown
Contributor Author

Rebased SIG onto actual main aebeaa53f54d as 581d45c28237, retaining upstream changes, the canonical 16-byte ABI, shared registration and both module wrappers. The debt conflict preserves both upstream frexpf and the existing SIG gap.

Fresh normal-root Linux Release validation passes all 68 selected CTests: three SIG/module/exit fixtures and 65 header tests, with no failures or skips. Both cold module load orders and provider/shared-callback checks pass. Conventions and whitespace checks pass. Historical Windows/CI results keep their original scope; no new Windows or full-suite result is claimed.

Please rerun current-head maintainer CI and re-review; merge when satisfied with integration and review checks.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 27, 2026
@ycbuzi

ycbuzi commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

Windows run of the current head 581d45c282 merged onto main c547deaacb (fa54b0eba1, clean), the focused tests only. Windows 11 Home 10.0.26200, WinLibs GCC 15.2.0 r7 (MinGW-w64 UCRT), Release, BUILD_TESTING=ON.

  • Built libc, libkernel, libSceLibcInternal, nid_patcher, sigvec_modules_exceptions, guest_sigvec_tests and guest_sigvec_modules_tests with no errors. The only warning is main's existing _sigintr_nid_postfix "initialized and declared 'extern'" in Signals.cpp.
  • guest_sigvec and guest_sigvec_modules pass both runs of ctest --repeat until-fail:2.
  • No negative control: the PR adds the production files (Sigvec.cpp, LegacySignals.cpp and their headers), so the tests don't build without it.
  • Not run: the full suite, the five-PR union, macOS, a title.

AI-assisted: yes (Claude Code)

@AZLisme

AZLisme commented Oct 27, 2026

Copy link
Copy Markdown
Contributor Author

@ycbuzi Thanks for testing the exact current head 581d45c282 with main c547deaacb (your merge fa54b0eba1). I’ve credited your Windows 11 / WinLibs GCC 15.2.0 r7 Release result: the seven named targets built, and both SIG fixtures passed two repetitions.

The body keeps this as focused contributor evidence, with no negative-control or full-suite claim. Current-head full maintainer CI remains pending; the existing DLL-unload limitation is unchanged.

@AZLisme

AZLisme commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Reviewed the overlap bot’s 16 debt-only additions and the five rows for #10856, #11130, #11831, #11872 and #11969. Their captured shared-file edits can be composed with our sigvec export, ABI, registration and HostWrite preflight intact. #11872/#11969 also change native signal dispatch/I/O deferral; legacy-handler interruption/restart during blocked I/O remains a future combined integration check. No new prerequisite for this PR was established.

Published head 581d45c merges cleanly with frozen main 09919b0. No source change was needed here; existing test results retain their documented scope. Please re-review and merge when ready.

@AZLisme

AZLisme commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Reviewed the new #11664 warning against the captured strmode patch (metadata reported 1185982eff4b). Its API declaration and debt entry compose with SIG’s shared edits on frozen 09919b040dc0, preserving both sigvec wrappers, ABI conversions, HostWrite preflight before backend mutation and tests. This is a static patch review, with no new runtime or foreign-head correctness claim. No SIG change or added prerequisite is indicated. Published 581d45c28237 is unchanged; existing test and CI scopes remain. Please re-review and merge when the existing gates are satisfied.

@AZLisme

AZLisme commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Reviewed the 12 debt-file warnings added by the overlap bot at 05:16 UTC, including re-added #11895. Each captured patch changes math implementation/tests and its libc debt. Its debt edit composes with our SIG debt edit over frozen 09919b040dc0, preserving the complete SIG entry. Signal APIs, ABI conversions, wrappers, HostWrite preflight before backend mutation, registration and fixtures are untouched. Several hunks required explicit context mapping; full foreign mergeability and runtime remain unverified. No SIG fix or new prerequisite is indicated. Published 581d45c28237 and its validation scopes are unchanged. Please re-review and merge when the existing gates are satisfied.

@AZLisme

AZLisme commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Reviewed the captured #11947 getsubopt patch behind the new overlap warning. Its API declaration and debt addition compose with our SIG changes over frozen 09919b040dc0; the complete SIG entry, signal implementation, registration and fixtures are preserved. The parser introduces no native-I/O/backend coupling. No SIG fix or new prerequisite is indicated. Full foreign mergeability and runtime remain unverified. Published 581d45c28237 and its validation scopes are unchanged. Please re-review and merge when existing gates are satisfied.

@AZLisme

AZLisme commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Reviewed the captured overlap warnings for #11892 and #12068. Their shared debt and kernel CMake edits compose with our SIG changes over frozen 09919b040dc0. The complete SIG debt entry, registration source and signal fixtures remain intact. The new CMake guards target relinker CLI tests; our module tests use nid_patcher and direct loading. No SIG fix or new prerequisite is indicated. Foreign configurations and runtime remain unverified. Published 581d45c28237 and its validation scopes are unchanged. Please re-review and merge when existing gates are satisfied.

@AZLisme

AZLisme commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor Author

Reviewed the newly captured overlap warnings for #9019, #11969 and #11625 against this PR's published 581d45c head.

  • feat(libkernel_sys): implement pwrite through the shared POSIX provider #9019, observed at 82fafdc208: the shared kernel CMake changes preserve SigvecRegistration.cpp. The inspected pwrite/Windows shared-memory write changes preserve the native read and SIG registration seams; the existing SIG and merged RUDP fixtures remain intact.

  • feat(libkernel): cancel blocked POSIX writes safely #11969, observed at 560f498196: its functional source/test changes match the earlier capture; the changed delta is kernel debt text. The future interaction between legacy SIGINT/SIGTERM restart flags and blocked native I/O remains an integration test requirement if that backend lands.

  • feat(libkernel): map app0.zar archive-backed files #11625, observed at e97bbf0451: the inspected archive-backed mapping and checked-read changes preserve the SIG direct-map/module routes and existing native-copy HostWrite guards. Shared CMake/debt edits retain SIG sources, registration and the debt entry.

These bounded source checks found no required change to this PR or new prerequisite. They include explicit additive mappings where newer CMake/debt context differs; they are not executed integrations or new runtime results. The published head and its existing validation, platform, review and integration qualifications remain unchanged.

Reviewed the new #10002 (observed 9bbf84ead3b7) and #12397 (observed f2548977ea55) debt-file warnings. Their captured patches implement asinhf and printf formatting; the only intersection with this PR's 17 topic paths is docs/dev/debt/libc.md. Explicit paragraph mappings preserve the complete SIG debt entry, including when the two documented paragraph changes are combined. This is a bounded text/source review, with no full foreign merge, algorithm-correctness or runtime claim. No SIG fix or new prerequisite is indicated.

Published 581d45c28237 also composes cleanly with pinned main 7fea87746bde in a static tree check, preserving upstream and topic changes. No rebase or source edit was needed; existing runtime and platform results retain their recorded scope.

Reviewed #10645 (observed 459808d639d9), #12296 (ba5f6c7a4b11), #11270 (2eb8d8d12ff4) and #11892 (6219aaaff152). These are functional descriptor-event/Windows mapping and _LLog/wcstod changes; their only intersections with the 17 SIG topic paths are kernel CMake test additions and two libc debt paragraphs. In the pinned 581d45c + main 0502f0e250a3 static composition, exact CMake insertion guards and normalized unique-paragraph mappings preserve SIG production registration and the complete SIG debt entry. The two CMake insertions and the two paragraph replacements were each checked in both orders with exact reversal. These bounded source checks establish no SIG fix or new prerequisite; they do not qualify full foreign merges, numerical/Windows behavior or runtime. Future integration tests remain required, and existing runtime/platform results retain their recorded scope.

Reviewed refreshed #9019 (d0ac6078), #9688 (03874cf1), #12598 (9f3395f7) and #12605 (572b7e48). Bounded shared CMake/debt mappings preserve SIG registration and its complete debt entry. #9688/#12598 have conflicting sorting behavior/test expectations requiring reconciliation; this is a source prediction, not an executed failure. Inspected older snapshots lack some #12605 prerequisites, so no full mapping/build is qualified. These checks establish no full foreign merge, algorithm/runtime qualification or owned SIG fix/new prerequisite. Existing integration, platform and review requirements remain.

Reviewed #10345 (760f4f93) and #12586 (5b02f8af). The former now calls _Feraise(0x01); unmasked host-trap behavior remains unqualified. The latter adds timingsafe_bcmp; constant-time, ABI and runtime claims remain unverified. Missing older-head neighbors prevent its full bare-head mapping. Separate bounded API/debt operations preserve SIG declarations and its debt entry; full-context debt hunks do not compose in either raw order. No SIG fix/new prerequisite is demonstrated; existing sorting, integration and platform/review holds remain.

2026-10-29 native Linux follow-up: normal-root Release, GCC 16.2.1, AMD Ryzen7 255 exposed by KVM. Execution was pinned to main 420b6a064eadaa7c5e50b080c7fad59c41150b4b and a private composition of that base with the exact published SIG topic 581d45c282371af828efec2a8cec6f43beacc68a. The composition tree is eefd99fac3d7899ac21c1d4907130323f0cd23e2; reversing the whole topic restores the exact main tree 0a0151e53e0c87128a4517078cbf24e0a757edf4. The public head was not changed or rebased.

The paired baseline passed 41/41 selected runtime cases and 65/65 actual public-header checks; the composition passed 43/43 and 65/65 respectively, with zero failures or skips. Both lanes built real libc, libkernel, libSceLibcInternal and the production NID patcher. The composition's additional guest_sigvec and guest_sigvec_modules passed, including both requested native module-open orders in fresh child processes and shared callback/conversion and guest-output assertions. These orders do not prove reversed transitive dependency loading chronology or production guest-DLL behavior.

This qualifies the selected cases and public-header checks on pinned main 420b6a064ead, even as main moves. It does not qualify later main, a full all-library build or full suite, Windows/macOS, GPU, console or title behavior; existing CI, platform and integration requirements remain. Frozen report SHA-256: aaed6674a2cc11e4c6a6e1b802c6e84d3a53dda06f7fb7dae621bfc15fadb8d3.

2026-10-30 Linux follow-up on fixed main 0362b1521c4ee08eeeccc2f98e9987e36fca9ea1: the paired Release baseline and a private composition containing published SIG 581d45c282371af828efec2a8cec6f43beacc68a plus all six ICU topics (#10962–#10967) passed the selected tests. The composition is 8a5c8c499f0e0a157bd110430c1d99ee73bb0d47 (tree 620649fa8b0512d9c7e114c670342a691fd1433a); this PR head was unchanged.

The baseline passed 53 plain runtime CTests, four with logging enabled, and 65 public-header checks. The composition passed 63 plain runtime CTests, six with logging enabled, and 65 public-header checks, with zero failures, skips or NotRun cases. guest_sigvec and guest_sigvec_modules passed both plain and with logging enabled; the module fixture passed both requested native open orders in fresh children. Existing controlled SIGABRT fixtures also passed in both logging profiles. These results cover the fixed private composition and selected cases, not bare published heads, later main, full CI, Windows/macOS, native signal-context behavior, provider unloading, GPU or title execution. Existing integration and platform requirements remain. Frozen report SHA-256: ea4ad792dcb42981ccd6a174dba81d0a3befd165c321bd15f0f1cc4926a7e701.

Please re-review and merge once the existing CI and integration requirements are satisfied; I will address any further findings.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants