Skip to content

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

Merged
oneandonlydean merged 1 commit into
boykopovar:mainfrom
AZLisme:feat/batch2-libc-legacy-signals
Nov 2, 2026
Merged

oneandonlydean merged 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

2026-11-01 UTC manual review of four overlap leads (source only)

Reviewed these frozen foreign heads against this PR's e7725d7111d0aaa2cc04729dae0a5be9ab485ce8, using its authored delta from 26fa1212b82f76dd49cf12d65e445d6ff3e0844c and each foreign topic's actual authored merge-base. Inherited main changes were excluded from topic comparisons.

PR Exact reviewed head Bounded source finding
#9019 79b02b3bdbb4301d6f7638d8026b4374b7e22803 Typed pwrite uses the existing shared POSIX provider; its NID C2kJ-byS5rM differs from sigvec. Shared kernel CMake edits split Windows named-memory tests, separate from SIG production registration.
#10987 fe748d4f48743f437bb180bc0f3731a4a07fbe3a Windows timezone-name UTF-8 conversion adds no guest export or SIG route; its libc debt entry is separate from sigvec.
#12841 e908061e3243c54655215bec7d156276baa4cb6c Typed asctime_r has distinct NID 488p6whx47U; shared libc API/debt edits commute with the SIG edits on the pinned own parent, preserving SIG declarations and debt.
#14299 f9474c5040b453603ae1a07668607e022812363b Typed _execve/_execvpe exports have distinct NIDs; the shared process provider is unchanged. Kernel CMake changes exec tests, separate from SIG production registration.

No current owned export/new-file collision, source fix, rebase or new dependency is supported by these exact inputs. Future shared CMake/API/debt integration must preserve both topics and inherited entries. For #9019, complete raw CMake/debt hunks have inherited context mismatches; exact-span preservation and selected-hunk commutation are bounded source checks, not a full Git union. Foreign mergeable=false and the bot's later-main compare link establish no owned conflict or rebase requirement. Future foreign head changes require fresh review.

No new tests, builds or branch changes occurred. This review adds no full composition, current-main, runtime or native qualification. Existing CI/review/integration requirements, SDK/native ABI, default SIGPIPE, context behavior, module-order and unload holds remain; all earlier results retain their stated scope.

2026-11-01 Windows CI: run 41295117301, e7725d7111d0aaa2cc04729dae0a5be9ab485ce8 + main 26fa1212b82f76dd49cf12d65e445d6ff3e0844c: 1,679 selected CTests passed, 904 skipped, zero failed. guest_sigvec and guest_signals passed; guest_sigvec_modules compiled but did not run. Separate matrix jobs passed 549 Linux/552 Windows relinker cases, 34 ASan TLS cases and 25 macOS write-watch cases repeated three times. Windows general full-suite, skip-audit and header CTests were not run. Native context, module/unload and existing dependency gates remain.

2026-11-01: preserving rebase e7725d7111d0aaa2cc04729dae0a5be9ab485ce8 onto fixed main 26fa1212b82f76dd49cf12d65e445d6ff3e0844c. Linux GCC 16.2.1 Release: baseline 61 plain + 4 logging-enabled runtime CTests; private SIG-plus-six-ICU union 4908848dab02fb1f0a9fad7e9525ddb8a628177a 71 + 6. All passed, with 65 public-header tests per side. Relevant: guest_sigvec, guest_sigvec_modules. Scope is this fixed baseline/private composition; bare heads, later main, Windows, native ABI and unloading remain unqualified. Earlier results retain their original scope.

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 (26fa121 → e7725d7)

📈 System libraries: 26.24% (+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 1484/1500 (98.93%) 1485/1501 (98.93%) +0.0007%
libSceLibcInternal 79/801 (9.86%) 80/802 (9.98%) +0.11%

@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 13782 core/libs/prx/libSceLibcInternal/CMakeLists.txt L224
PR 14373 core/libs/prx/libSceLibcInternal/include/Api.hpp L6
PR 14936 core/libs/prx/libSceLibcInternal/CMakeLists.txt L224
PR 14945 core/libs/prx/libSceLibcInternal/CMakeLists.txt L224

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 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 8965 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 9019 core/libs/prx/libkernel/CMakeLists.txt
PR 9087 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 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 9929 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 9935 docs/dev/debt/libc.md
PR 9938 core/libs/prx/libkernel/CMakeLists.txt
PR 9964 docs/dev/debt/libc.md
PR 10113 docs/dev/debt/libc.md
PR 10226 docs/dev/debt/libc.md
PR 10245 docs/dev/debt/libc.md
PR 10250 docs/dev/debt/libc.md
PR 10253 docs/dev/debt/libc.md
PR 10265 docs/dev/debt/libc.md
PR 10274 docs/dev/debt/libc.md
PR 10315 docs/dev/debt/libc.md
PR 10325 docs/dev/debt/libc.md
PR 10328 docs/dev/debt/libc.md
PR 10345 docs/dev/debt/libc.md
PR 10349 docs/dev/debt/libc.md
PR 10405 docs/dev/debt/libc.md
PR 10506 docs/dev/debt/libc.md
PR 10510 docs/dev/debt/libc.md
PR 10512 docs/dev/debt/libc.md
PR 10565 docs/dev/debt/libc.md
PR 10987 docs/dev/debt/libc.md
PR 11332 docs/dev/debt/libc.md
PR 11831 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 11896 core/libs/prx/libkernel/CMakeLists.txt
PR 11939 core/libs/prx/libkernel/CMakeLists.txt
PR 12122 docs/dev/debt/libc.md
PR 12514 docs/dev/debt/libc.md
PR 12544 core/libs/prx/libkernel/CMakeLists.txt
PR 12560 docs/dev/debt/libc.md
PR 12574 docs/dev/debt/libc.md
PR 12622 docs/dev/debt/libc.md
PR 12627 docs/dev/debt/libc.md
PR 12970 core/libs/prx/libkernel/CMakeLists.txt
PR 13793 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 13809 core/libs/prx/libc/CMakeLists.txt
docs/dev/debt/libc.md
PR 14212 docs/dev/debt/libc.md
PR 14264 core/libs/prx/libkernel/CMakeLists.txt
PR 14299 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.

@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 force-pushed the feat/batch2-libc-legacy-signals branch from e0382c6 to 581d45c Compare October 27, 2026 09:34
@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

2026-11-01 Windows update: run 41295117301, e7725d7111d0aaa2cc04729dae0a5be9ab485ce8 + main 26fa1212b82f76dd49cf12d65e445d6ff3e0844c, attempt 1: 1,679 passed, 904 skipped, zero failed in the changed-guest selection. guest_sigvec and guest_signals actually passed. The module fixture and exception-probe DLL compiled/linked, but guest_sigvec_modules was not executed; this adds no Windows module-order/unload qualification. Separate same-input matrix jobs passed 549 Linux and 552 Windows relinker cases, 34 ASan TLS cases, and 25 macOS write-watch cases repeated three times. Those are component results, not extra SIG product runs. The Windows general full-suite step, skip audit and public-header CTests were not run. Native signal-context/default-SIGPIPE behavior, device/GPU and unload coverage remain unqualified. Earlier results retain their recorded inputs and scope; existing dependencies, CI and review requirements remain.

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.

2026-11-01 preserving rebase: e7725d7111d0aaa2cc04729dae0a5be9ab485ce8 retains this topic and upstream changes on fixed main 26fa1212b82f76dd49cf12d65e445d6ff3e0844c. Linux GCC 16.2.1 Release compared that baseline (61 plain + 4 logging-enabled runtime CTests) with private SIG-plus-six-ICU union 4908848dab02fb1f0a9fad7e9525ddb8a628177a (71 + 6): all 142 runtime CTests and 65 public-header tests per side (130) passed. Relevant: guest_sigvec, guest_sigvec_modules. Both SIG fixtures passed with logging enabled; the module fixture covered both native module open orders. Twelve separate controlled native SIGABRT child observations exited 3 as expected; these are not additional CTests. The results qualify this fixed baseline/private composition; bare heads, later main, Windows, native ABI, SIGPIPE and unloading remain unqualified. Earlier results retain their original scope. Existing dependencies, maintainer CI, review and landing order remain required. QA report SHA-256: bc7f97b97738e06aed46cee93aec981b1d0030e7c7a3c57c2ce0921548de8bdc.

2026-11-01 UTC manual review of four overlap leads (source only)

Reviewed these frozen foreign heads against this PR's e7725d7111d0aaa2cc04729dae0a5be9ab485ce8, using its authored delta from 26fa1212b82f76dd49cf12d65e445d6ff3e0844c and each foreign topic's actual authored merge-base. Inherited main changes were excluded from topic comparisons.

PR Exact reviewed head Bounded source finding
#9019 79b02b3bdbb4301d6f7638d8026b4374b7e22803 Typed pwrite uses the existing shared POSIX provider; its NID C2kJ-byS5rM differs from sigvec. Shared kernel CMake edits split Windows named-memory tests, separate from SIG production registration.
#10987 fe748d4f48743f437bb180bc0f3731a4a07fbe3a Windows timezone-name UTF-8 conversion adds no guest export or SIG route; its libc debt entry is separate from sigvec.
#12841 e908061e3243c54655215bec7d156276baa4cb6c Typed asctime_r has distinct NID 488p6whx47U; shared libc API/debt edits commute with the SIG edits on the pinned own parent, preserving SIG declarations and debt.
#14299 f9474c5040b453603ae1a07668607e022812363b Typed _execve/_execvpe exports have distinct NIDs; the shared process provider is unchanged. Kernel CMake changes exec tests, separate from SIG production registration.

No current owned export/new-file collision, source fix, rebase or new dependency is supported by these exact inputs. Future shared CMake/API/debt integration must preserve both topics and inherited entries. For #9019, complete raw CMake/debt hunks have inherited context mismatches; exact-span preservation and selected-hunk commutation are bounded source checks, not a full Git union. Foreign mergeable=false and the bot's later-main compare link establish no owned conflict or rebase requirement. Future foreign head changes require fresh review.

No new tests, builds or branch changes occurred. This review adds no full composition, current-main, runtime or native qualification. Existing CI/review/integration requirements, SDK/native ABI, default SIGPIPE, context behavior, module-order and unload holds remain; all earlier results retain their stated scope.

2026-11-01 UTC #12841 source refresh: reviewed head 3eb1642424f3323a863e4b68ca3258d3f9035d0c against own e7725d7111d0aaa2cc04729dae0a5be9ab485ce8. After merging main 0580e5c951a8d436af2976a3f86a980c798ef5c2 and repairing debt text, all five net authored addition/deletion streams remain identical to previously reviewed e908061e3243 (+33/-7). The libc API header and debt file STILL share authored edits despite the bot row disappearing; this review establishes neither its filtering cause nor an actual PR merge. Preserve the upstream wcsftime limitations and documentation repair in future integration. asctime_r NID 488p6whx47U remains distinct from sigvec NID yhxKO9LYc8A; no new owned fix, rebase or dependency is supported. This is source-only follow-up: no new tests, builds or branch changes, and no full-union, current-main, runtime or native qualification. All existing holds remain.

2026-11-02 UTC secure-formatting source follow-up: reviewed #9087's secure-format/scanner change at e16c92d39f7e673c52d6809fd0f58c1fc2a47dba and #12622's sprintf_s follow-up at bf0f6c112bce14bf313905b9b2f63eda67b9b4c1, each from authored base 93dbd0f82aea684e95f15f06e7d42c0064af18cf, against unchanged own e7725d7111d0aaa2cc04729dae0a5be9ab485ce8. Their authored changes share only docs/dev/debt/libc.md with the 17 SIG topic paths; no change to SIG routing, vector ABI, exports/NIDs, or an owned fix, rebase or new dependency is supported. Real process behavior still intersects: added secure-format/scan constraints invoke the existing guest-ABI callback, whose default calls std::abort. This establishes neither whole-runtime disjointness nor native SIGABRT behavior. #9087's reverse-derived base images are reconstruction aids, not independent base authority. #12622 retains its foreign #9087/#9935 and restack gates, with no SIG prerequisite or merge credit. Future shared debt integration must preserve SIG and measured/unmeasured formatting entries. No new builds, tests or source changes occurred, and no current-main, full-union, runtime or native qualification is added. Existing review, CI, integration, platform, backend, context and unload holds remain.

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

@AZLisme
AZLisme force-pushed the feat/batch2-libc-legacy-signals branch from 581d45c to e7725d7 Compare November 1, 2026 09:54
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 1, 2026
@AZLisme

AZLisme commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

@oneandonlydean could you decide whether to merge current head e7725d7111d0aaa2cc04729dae0a5be9ab485ce8, or identify a specific remaining blocker?

MarcZX10's latest review is APPROVED and says the prior output/integration issues were addressed. There are no inline threads or current conflicts. The current-head Build 41295117301 succeeded; its Windows selection and registration audit passed, while Linux was skipped. I am not claiming full Linux or native-SDK validation.

The prior SDK/backend/context/unload caveats remain coverage notes, rather than additional merge requirements I have independently imposed. My upstream access is READ, so the merge decision needs an authorized maintainer. If another specific current-main test is required, please state it and I will address it within my permissions.

@oneandonlydean
oneandonlydean merged commit ed08af6 into boykopovar:main Nov 2, 2026
23 of 24 checks passed
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