Repository navigation
Conversation
This was referenced Oct 8, 2026
Add-ons were never mounted: every label was not found or had no entitlement. A catalog in libkernel now lists the add-ons without data from anyps5-entitlements.ini and the add-ons with data from the directories in anyps5-addcont/ (ANYPS5_ADDCONT), named by entitlement label or content ID. AppContent reports them in its info calls and mounts an add-on with data at /addcont0 to /addcont63 through a path alias; NpEntitlementAccess reports the same add-ons.
Noface07
force-pushed
the
feat/appcontent-addcont
branch
from
October 8, 2026 12:01
1ca2c2b to
6d040b3
Compare
9 tasks done
Collaborator
|
Which title needs its add-on content? Please add the title ID and what goes wrong on main without this (the log line, or what the title is missing). With that this can go in; otherwise I'll close it until a title needs it. |
Contributor
Author
No title yet. I wrote this from the TechnicalDebt entry and tested it only with the unit tests, not with a game. I don't have a dump with add on content to check it against. |
Collaborator
|
Closing, since no title needs it yet. Please reopen when a title with add-on content shows what goes wrong on main. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Additional content was never available:
sceAppContentAddcontMountreturnedNOT_FOUNDfor every label,sceAppContentGetAddcontInfoDRM_NO_ENTITLEMENT, and the list was empty (TechnicalDebt, Functional).AppMetadata/src/Addcont.cpp,AddcontEntries_nid_no_patch) lists the title's add-ons once:anyps5-entitlements.ini(ANYPS5_ENTITLEMENTS), read aslibSceNpEntitlementAccessread them before;anyps5-addcont/beside the executable (ANYPS5_ADDCONT), each named by its entitlement label or its content ID (UP0000-PPSA00000_00-LABEL). A label in both is one add-on with data.anyps5-addcont/are ignored.libSceAppContent:GetAddcontInfo/GetAddcontInfoListreport the catalog: status 4 (installed) for add-ons with data, 0 (no extra data) without. The list reports the count when called without a buffer, otherwise the entries written.AddcontMountmaps an add-on with data to/addcont0…/addcont63(lowest free slot) throughAddPathAlias_nid_no_patch, as save data does for/savedata0. A second mount of the same add-on returnsBUSY, a 65th mountMOUNT_FULL; an add-on without data or an unknown labelNOT_FOUND.AddcontUnmountblocks the point again withBlockPathAlias_nid_no_patch(as fix(appcontent): track temporary storage mounts #1320 does for/temp0); a point that is not mounted returnsNOT_MOUNTED(wasNOT_FOUND)./addcont0…/addcont63are blocked fromsceAppContentInitialize(or the first mount call) until mounted, so a path under an unmounted point fails instead of reaching the run directory.libSceNpEntitlementAccessreports the same catalog: ini entries as before (package type 3, download status 4), directories as package type 2 (PSAC). A label listed twice in the ini is now listed once.Sources: error codes and limits from the PS4 SDK values in ps4-eboot-dlc-patcher; the BUSY / MOUNT_FULL / NOT_MOUNTED cases and package types from the PS5 replacement modules in dlc_emu;
/addcontNnames, status 0 for license-only add-ons and the list count from shadPS4 (PS4). Where dlc_emu and shadPS4 disagree (hit_numwith a short buffer), the choice is recorded in TechnicalDebt.Tested
x86_64-ucrt-posix-seh; not the 15.2.0 release from BUILD.md), Ninja Release,BUILD_TESTING=ON: full build andlibstarget,ctest445/445 passed onmain33a9199; after the rebase onto 1081602 (no changes to these files), the 150 AppContent and guest tests pass.guest_appcontent_addcont: ini and directory entries (label and content ID names), list and info results, NpEntitlementAccess package types, mounting and reading a file through/addcont0, busy, not-found, unmount (an unmounted or free point is unavailable), slot reuse, the 64-mount limit and the error for an invalid directory name.guest_appcontentkeeps the empty-catalog results.libc/src/General.cppcompiled withGuestAppContentAddcont.cppdirectly into one executable; it passes.GuestAppContent.cppcrashes in that single-executable setup onmainas well, so it was not checked there.tools/check_conventions.pypassed. No title with add-ons tested.Rebased onto #1320, whose
SCE_APP_CONTENT_ERROR_BUSY/NOT_MOUNTEDconstants this PR now uses.tools/pr_overlap.pyreports only #1513, which rewritesdocs/user/USAGE.md(L1-100); this PR adds a section to that file.Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed in TechnicalDebt.mdfiles or images added to the repository (attach them to this PR)